Server: don't catch Throwable for level ticking

this usually causes the console to get spammed with errors. Additionally, in the case where doTick() throws any exception, it's usually because we're in a state we didn't want to be in, so we really should not carry on trying to keep ticking when something breaks here. Instead, this should generate a crashdump.
This commit is contained in:
Dylan K. Taylor 2018-09-08 14:13:28 +01:00
parent c447d51e3f
commit a3b78236eb

View File

@ -2356,37 +2356,29 @@ class Server{
if($level->getTickRate() > $this->baseTickRate and --$level->tickRateCounter > 0){ if($level->getTickRate() > $this->baseTickRate and --$level->tickRateCounter > 0){
continue; continue;
} }
try{
$levelTime = microtime(true);
$level->doTick($currentTick);
$tickMs = (microtime(true) - $levelTime) * 1000;
$level->tickRateTime = $tickMs;
if($this->autoTickRate){ $levelTime = microtime(true);
if($tickMs < 50 and $level->getTickRate() > $this->baseTickRate){ $level->doTick($currentTick);
$level->setTickRate($r = $level->getTickRate() - 1); $tickMs = (microtime(true) - $levelTime) * 1000;
if($r > $this->baseTickRate){ $level->tickRateTime = $tickMs;
$level->tickRateCounter = $level->getTickRate();
} if($this->autoTickRate){
$this->getLogger()->debug("Raising level \"{$level->getName()}\" tick rate to {$level->getTickRate()} ticks"); if($tickMs < 50 and $level->getTickRate() > $this->baseTickRate){
}elseif($tickMs >= 50){ $level->setTickRate($r = $level->getTickRate() - 1);
if($level->getTickRate() === $this->baseTickRate){ if($r > $this->baseTickRate){
$level->setTickRate(max($this->baseTickRate + 1, min($this->autoTickRateLimit, (int) floor($tickMs / 50))));
$this->getLogger()->debug(sprintf("Level \"%s\" took %gms, setting tick rate to %d ticks", $level->getName(), (int) round($tickMs, 2), $level->getTickRate()));
}elseif(($tickMs / $level->getTickRate()) >= 50 and $level->getTickRate() < $this->autoTickRateLimit){
$level->setTickRate($level->getTickRate() + 1);
$this->getLogger()->debug(sprintf("Level \"%s\" took %gms, setting tick rate to %d ticks", $level->getName(), (int) round($tickMs, 2), $level->getTickRate()));
}
$level->tickRateCounter = $level->getTickRate(); $level->tickRateCounter = $level->getTickRate();
} }
$this->getLogger()->debug("Raising level \"{$level->getName()}\" tick rate to {$level->getTickRate()} ticks");
}elseif($tickMs >= 50){
if($level->getTickRate() === $this->baseTickRate){
$level->setTickRate(max($this->baseTickRate + 1, min($this->autoTickRateLimit, (int) floor($tickMs / 50))));
$this->getLogger()->debug(sprintf("Level \"%s\" took %gms, setting tick rate to %d ticks", $level->getName(), (int) round($tickMs, 2), $level->getTickRate()));
}elseif(($tickMs / $level->getTickRate()) >= 50 and $level->getTickRate() < $this->autoTickRateLimit){
$level->setTickRate($level->getTickRate() + 1);
$this->getLogger()->debug(sprintf("Level \"%s\" took %gms, setting tick rate to %d ticks", $level->getName(), (int) round($tickMs, 2), $level->getTickRate()));
}
$level->tickRateCounter = $level->getTickRate();
} }
}catch(\Throwable $e){
if(!$level->isClosed()){
$this->logger->critical($this->getLanguage()->translateString("pocketmine.level.tickError", [$level->getName(), $e->getMessage()]));
}else{
$this->logger->critical($this->getLanguage()->translateString("pocketmine.level.tickUnloadError", [$level->getName()]));
}
$this->logger->logException($e);
} }
} }
} }