mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-05-12 00:39:45 +00:00
Changed how exceptions work and are logged, throw proper exceptions on tasks
This commit is contained in:
parent
472fcfa4c7
commit
0bcf639a98
@ -818,9 +818,7 @@ class Server{
|
|||||||
}
|
}
|
||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
$this->logger->critical($this->getLanguage()->translateString("pocketmine.data.saveError", [$name, $e->getMessage()]));
|
$this->logger->critical($this->getLanguage()->translateString("pocketmine.data.saveError", [$name, $e->getMessage()]));
|
||||||
if(\pocketmine\DEBUG > 1 and $this->logger instanceof MainLogger){
|
$this->logger->logException($e);
|
||||||
$this->logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1028,9 +1026,7 @@ class Server{
|
|||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
|
|
||||||
$this->logger->error($this->getLanguage()->translateString("pocketmine.level.loadError", [$name, $e->getMessage()]));
|
$this->logger->error($this->getLanguage()->translateString("pocketmine.level.loadError", [$name, $e->getMessage()]));
|
||||||
if($this->logger instanceof MainLogger){
|
$this->logger->logException($e);
|
||||||
$this->logger->logException($e);
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1087,9 +1083,7 @@ class Server{
|
|||||||
$level->setTickRate($this->baseTickRate);
|
$level->setTickRate($this->baseTickRate);
|
||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
$this->logger->error($this->getLanguage()->translateString("pocketmine.level.generateError", [$name, $e->getMessage()]));
|
$this->logger->error($this->getLanguage()->translateString("pocketmine.level.generateError", [$name, $e->getMessage()]));
|
||||||
if($this->logger instanceof MainLogger){
|
$this->logger->logException($e);
|
||||||
$this->logger->logException($e);
|
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2068,9 +2062,7 @@ class Server{
|
|||||||
|
|
||||||
$errfile = cleanPath($errfile);
|
$errfile = cleanPath($errfile);
|
||||||
|
|
||||||
if($this->logger instanceof MainLogger){
|
$this->logger->logException($e, $trace);
|
||||||
$this->logger->logException($e, $trace);
|
|
||||||
}
|
|
||||||
|
|
||||||
$lastError = [
|
$lastError = [
|
||||||
"type" => $type,
|
"type" => $type,
|
||||||
@ -2281,9 +2273,7 @@ class Server{
|
|||||||
}
|
}
|
||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
$this->logger->critical($this->getLanguage()->translateString("pocketmine.level.tickError", [$level->getName(), $e->getMessage()]));
|
$this->logger->critical($this->getLanguage()->translateString("pocketmine.level.tickError", [$level->getName(), $e->getMessage()]));
|
||||||
if(\pocketmine\DEBUG > 1 and $this->logger instanceof MainLogger){
|
$this->logger->logException($e);
|
||||||
$this->logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -2376,9 +2366,7 @@ class Server{
|
|||||||
}
|
}
|
||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
if(\pocketmine\DEBUG > 1){
|
if(\pocketmine\DEBUG > 1){
|
||||||
if($this->logger instanceof MainLogger){
|
$this->logger->logException($e);
|
||||||
$this->logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->getNetwork()->blockAddress($address, 600);
|
$this->getNetwork()->blockAddress($address, 600);
|
||||||
@ -2433,9 +2421,7 @@ class Server{
|
|||||||
$this->queryHandler->regenerateInfo();
|
$this->queryHandler->regenerateInfo();
|
||||||
}
|
}
|
||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
if($this->logger instanceof MainLogger){
|
$this->logger->logException($e);
|
||||||
$this->logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,10 +51,7 @@ class FormattedCommandAlias extends Command{
|
|||||||
$sender->sendMessage(TextFormat::RED . $e->getMessage());
|
$sender->sendMessage(TextFormat::RED . $e->getMessage());
|
||||||
}else{
|
}else{
|
||||||
$sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.exception"));
|
$sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.exception"));
|
||||||
$logger = $sender->getServer()->getLogger();
|
$sender->getServer()->getLogger()->logException($e);
|
||||||
if($logger instanceof MainLogger){
|
|
||||||
$logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -196,10 +196,7 @@ class SimpleCommandMap implements CommandMap{
|
|||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
$sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.exception"));
|
$sender->sendMessage(new TranslationContainer(TextFormat::RED . "%commands.generic.exception"));
|
||||||
$this->server->getLogger()->critical($this->server->getLanguage()->translateString("pocketmine.command.exception", [$commandLine, (string) $target, $e->getMessage()]));
|
$this->server->getLogger()->critical($this->server->getLanguage()->translateString("pocketmine.command.exception", [$commandLine, (string) $target, $e->getMessage()]));
|
||||||
$logger = $sender->getServer()->getLogger();
|
$sender->getServer()->getLogger()->logException($e);
|
||||||
if($logger instanceof MainLogger){
|
|
||||||
$logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$target->timings->stopTiming();
|
$target->timings->stopTiming();
|
||||||
|
|
||||||
|
@ -2566,9 +2566,7 @@ class Level implements ChunkManager, Metadatable{
|
|||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
$logger = $this->server->getLogger();
|
$logger = $this->server->getLogger();
|
||||||
$logger->error($this->server->getLanguage()->translateString("pocketmine.level.chunkUnloadError", [$e->getMessage()]));
|
$logger->error($this->server->getLanguage()->translateString("pocketmine.level.chunkUnloadError", [$e->getMessage()]));
|
||||||
if($logger instanceof MainLogger){
|
$logger->logException($e);
|
||||||
$logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unset($this->chunks[$index]);
|
unset($this->chunks[$index]);
|
||||||
|
@ -39,7 +39,7 @@ class GeneratorRegisterTask extends AsyncTask{
|
|||||||
|
|
||||||
public function __construct(Level $level, Generator $generator){
|
public function __construct(Level $level, Generator $generator){
|
||||||
$this->generator = get_class($generator);
|
$this->generator = get_class($generator);
|
||||||
$this->settings = $generator->getSettings();
|
$this->settings = serialize($generator->getSettings());
|
||||||
$this->seed = $level->getSeed();
|
$this->seed = $level->getSeed();
|
||||||
$this->levelId = $level->getId();
|
$this->levelId = $level->getId();
|
||||||
}
|
}
|
||||||
@ -51,7 +51,7 @@ class GeneratorRegisterTask extends AsyncTask{
|
|||||||
$this->saveToThreadStore("generation.level{$this->levelId}.manager", $manager);
|
$this->saveToThreadStore("generation.level{$this->levelId}.manager", $manager);
|
||||||
/** @var Generator $generator */
|
/** @var Generator $generator */
|
||||||
$generator = $this->generator;
|
$generator = $this->generator;
|
||||||
$generator = new $generator($this->settings);
|
$generator = new $generator(unserialize($this->settings));
|
||||||
$generator->init($manager, new Random($manager->getSeed()));
|
$generator->init($manager, new Random($manager->getSeed()));
|
||||||
$this->saveToThreadStore("generation.level{$this->levelId}.generator", $generator);
|
$this->saveToThreadStore("generation.level{$this->levelId}.generator", $generator);
|
||||||
}
|
}
|
||||||
|
@ -141,9 +141,7 @@ class Network{
|
|||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
$logger = $this->server->getLogger();
|
$logger = $this->server->getLogger();
|
||||||
if(\pocketmine\DEBUG > 1){
|
if(\pocketmine\DEBUG > 1){
|
||||||
if($logger instanceof MainLogger){
|
$logger->logException($e);
|
||||||
$logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$interface->emergencyShutdown();
|
$interface->emergencyShutdown();
|
||||||
@ -237,10 +235,8 @@ class Network{
|
|||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
if(\pocketmine\DEBUG > 1){
|
if(\pocketmine\DEBUG > 1){
|
||||||
$logger = $this->server->getLogger();
|
$logger = $this->server->getLogger();
|
||||||
if($logger instanceof MainLogger){
|
$logger->debug("BatchPacket " . " 0x" . bin2hex($packet->payload));
|
||||||
$logger->debug("BatchPacket " . " 0x" . bin2hex($packet->payload));
|
$logger->logException($e);
|
||||||
$logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,10 +139,8 @@ class RakLibInterface implements ServerInstance, AdvancedSourceInterface{
|
|||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
if(\pocketmine\DEBUG > 1 and isset($pk)){
|
if(\pocketmine\DEBUG > 1 and isset($pk)){
|
||||||
$logger = $this->server->getLogger();
|
$logger = $this->server->getLogger();
|
||||||
if($logger instanceof MainLogger){
|
$logger->debug("Packet " . get_class($pk) . " 0x" . bin2hex($packet->buffer));
|
||||||
$logger->debug("Packet " . get_class($pk) . " 0x" . bin2hex($packet->buffer));
|
$logger->logException($e);
|
||||||
$logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(isset($this->players[$identifier])){
|
if(isset($this->players[$identifier])){
|
||||||
|
@ -251,10 +251,7 @@ class PluginManager{
|
|||||||
}
|
}
|
||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
$this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.fileError", [$file, $directory, $e->getMessage()]));
|
$this->server->getLogger()->error($this->server->getLanguage()->translateString("pocketmine.plugin.fileError", [$file, $directory, $e->getMessage()]));
|
||||||
$logger = $this->server->getLogger();
|
$this->server->getLogger()->logException($e);
|
||||||
if($logger instanceof MainLogger){
|
|
||||||
$logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -564,10 +561,7 @@ class PluginManager{
|
|||||||
}
|
}
|
||||||
$plugin->getPluginLoader()->enablePlugin($plugin);
|
$plugin->getPluginLoader()->enablePlugin($plugin);
|
||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
$logger = Server::getInstance()->getLogger();
|
$this->server->getLogger()->logException($e);
|
||||||
if($logger instanceof MainLogger){
|
|
||||||
$logger->logException($e);
|
|
||||||
}
|
|
||||||
$this->disablePlugin($plugin);
|
$this->disablePlugin($plugin);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -638,10 +632,7 @@ class PluginManager{
|
|||||||
try{
|
try{
|
||||||
$plugin->getPluginLoader()->disablePlugin($plugin);
|
$plugin->getPluginLoader()->disablePlugin($plugin);
|
||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
$logger = Server::getInstance()->getLogger();
|
$this->server->getLogger()->logException($e);
|
||||||
if($logger instanceof MainLogger){
|
|
||||||
$logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->server->getScheduler()->cancelTasks($plugin);
|
$this->server->getScheduler()->cancelTasks($plugin);
|
||||||
@ -682,10 +673,7 @@ class PluginManager{
|
|||||||
$e->getMessage(),
|
$e->getMessage(),
|
||||||
get_class($registration->getListener())
|
get_class($registration->getListener())
|
||||||
]));
|
]));
|
||||||
$logger = $this->server->getLogger();
|
$this->server->getLogger()->logException($e);
|
||||||
if($logger instanceof MainLogger){
|
|
||||||
$logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -47,7 +47,7 @@ class AsyncPool{
|
|||||||
|
|
||||||
for($i = 0; $i < $this->size; ++$i){
|
for($i = 0; $i < $this->size; ++$i){
|
||||||
$this->workerUsage[$i] = 0;
|
$this->workerUsage[$i] = 0;
|
||||||
$this->workers[$i] = new AsyncWorker;
|
$this->workers[$i] = new AsyncWorker($this->server->getLogger(), $i);
|
||||||
$this->workers[$i]->setClassLoader($this->server->getLoader());
|
$this->workers[$i]->setClassLoader($this->server->getLoader());
|
||||||
$this->workers[$i]->start();
|
$this->workers[$i]->start();
|
||||||
}
|
}
|
||||||
@ -62,7 +62,7 @@ class AsyncPool{
|
|||||||
if($newSize > $this->size){
|
if($newSize > $this->size){
|
||||||
for($i = $this->size; $i < $newSize; ++$i){
|
for($i = $this->size; $i < $newSize; ++$i){
|
||||||
$this->workerUsage[$i] = 0;
|
$this->workerUsage[$i] = 0;
|
||||||
$this->workers[$i] = new AsyncWorker;
|
$this->workers[$i] = new AsyncWorker($this->server->getLogger(), $i);
|
||||||
$this->workers[$i]->setClassLoader($this->server->getLoader());
|
$this->workers[$i]->setClassLoader($this->server->getLoader());
|
||||||
$this->workers[$i]->start();
|
$this->workers[$i]->start();
|
||||||
}
|
}
|
||||||
@ -142,16 +142,16 @@ class AsyncPool{
|
|||||||
Timings::$schedulerAsyncTimer->startTiming();
|
Timings::$schedulerAsyncTimer->startTiming();
|
||||||
|
|
||||||
foreach($this->tasks as $task){
|
foreach($this->tasks as $task){
|
||||||
if($task->isGarbage() and !$task->isRunning()){
|
if($task->isGarbage() and !$task->isRunning() and !$task->isCrashed()){
|
||||||
|
|
||||||
if(!$task->hasCancelledRun()){
|
if(!$task->hasCancelledRun()){
|
||||||
$task->onCompletion($this->server);
|
$task->onCompletion($this->server);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->removeTask($task);
|
$this->removeTask($task);
|
||||||
}elseif($task->isTerminated()){
|
}elseif($task->isTerminated() or $task->isCrashed()){
|
||||||
$this->removeTask($task, true);
|
|
||||||
$this->server->getLogger()->critical("Could not execute asynchronous task " . (new \ReflectionClass($task))->getShortName() . ": Task crashed");
|
$this->server->getLogger()->critical("Could not execute asynchronous task " . (new \ReflectionClass($task))->getShortName() . ": Task crashed");
|
||||||
|
$this->removeTask($task, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,16 +39,27 @@ abstract class AsyncTask extends \Collectable{
|
|||||||
/** @var int */
|
/** @var int */
|
||||||
private $taskId = null;
|
private $taskId = null;
|
||||||
|
|
||||||
|
private $crashed = false;
|
||||||
|
|
||||||
public function run(){
|
public function run(){
|
||||||
$this->result = null;
|
$this->result = null;
|
||||||
|
|
||||||
if($this->cancelRun !== true){
|
if($this->cancelRun !== true){
|
||||||
$this->onRun();
|
try{
|
||||||
|
$this->onRun();
|
||||||
|
}catch(\Throwable $e){
|
||||||
|
$this->crashed = true;
|
||||||
|
$this->worker->handleException($e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->setGarbage();
|
$this->setGarbage();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function isCrashed(){
|
||||||
|
return $this->crashed;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
|
@ -25,6 +25,14 @@ use pocketmine\Worker;
|
|||||||
|
|
||||||
class AsyncWorker extends Worker{
|
class AsyncWorker extends Worker{
|
||||||
|
|
||||||
|
private $logger;
|
||||||
|
private $id;
|
||||||
|
|
||||||
|
public function __construct(\ThreadedLogger $logger, $id){
|
||||||
|
$this->logger = $logger;
|
||||||
|
$this->id = $id;
|
||||||
|
}
|
||||||
|
|
||||||
public function run(){
|
public function run(){
|
||||||
$this->registerClassLoader();
|
$this->registerClassLoader();
|
||||||
gc_enable();
|
gc_enable();
|
||||||
@ -32,14 +40,13 @@ class AsyncWorker extends Worker{
|
|||||||
|
|
||||||
global $store;
|
global $store;
|
||||||
$store = [];
|
$store = [];
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function start(int $options = PTHREADS_INHERIT_NONE){
|
public function handleException(\Throwable $e){
|
||||||
parent::start(PTHREADS_INHERIT_CONSTANTS | PTHREADS_INHERIT_FUNCTIONS);
|
$this->logger->logException($e);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getThreadName(){
|
public function getThreadName(){
|
||||||
return "Asynchronous Worker";
|
return "Asynchronous Worker #" . $this->id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,7 +26,6 @@ use pocketmine\Server;
|
|||||||
use pocketmine\utils\Utils;
|
use pocketmine\utils\Utils;
|
||||||
use pocketmine\utils\UUID;
|
use pocketmine\utils\UUID;
|
||||||
use pocketmine\utils\VersionString;
|
use pocketmine\utils\VersionString;
|
||||||
use pocketmine\utils\UUID;
|
|
||||||
|
|
||||||
class SendUsageTask extends AsyncTask{
|
class SendUsageTask extends AsyncTask{
|
||||||
|
|
||||||
|
@ -249,10 +249,7 @@ class ServerScheduler{
|
|||||||
$task->run($this->currentTick);
|
$task->run($this->currentTick);
|
||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
Server::getInstance()->getLogger()->critical("Could not execute task " . $task->getTaskName() . ": " . $e->getMessage());
|
Server::getInstance()->getLogger()->critical("Could not execute task " . $task->getTaskName() . ": " . $e->getMessage());
|
||||||
$logger = Server::getInstance()->getLogger();
|
Server::getInstance()->getLogger()->logException($e);
|
||||||
if($logger instanceof MainLogger){
|
|
||||||
$logger->logException($e);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
$task->timings->stopTiming();
|
$task->timings->stopTiming();
|
||||||
}
|
}
|
||||||
|
@ -210,7 +210,7 @@ class Config{
|
|||||||
}catch(\Throwable $e){
|
}catch(\Throwable $e){
|
||||||
$logger = Server::getInstance()->getLogger();
|
$logger = Server::getInstance()->getLogger();
|
||||||
$logger->critical("Could not save Config " . $this->file . ": " . $e->getMessage());
|
$logger->critical("Could not save Config " . $this->file . ": " . $e->getMessage());
|
||||||
if(\pocketmine\DEBUG > 1 and $logger instanceof MainLogger){
|
if(\pocketmine\DEBUG > 1){
|
||||||
$logger->logException($e);
|
$logger->logException($e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
2
src/spl
2
src/spl
@ -1 +1 @@
|
|||||||
Subproject commit 82034afea351b0dbf8b1f9ad41cde9b9de3e1da6
|
Subproject commit 3cd1f13c5d4937a5de1978d1950589082df760d2
|
Loading…
x
Reference in New Issue
Block a user