diff --git a/src/Server.php b/src/Server.php index 5eedb66e4..00199b3fe 100644 --- a/src/Server.php +++ b/src/Server.php @@ -519,30 +519,32 @@ class Server{ } public function getOfflinePlayerData(string $name) : ?CompoundTag{ - $name = strtolower($name); - $path = $this->getPlayerDataPath($name); + return Timings::$syncPlayerDataLoad->time(function() use ($name) : ?CompoundTag{ + $name = strtolower($name); + $path = $this->getPlayerDataPath($name); - if(file_exists($path)){ - $contents = @file_get_contents($path); - if($contents === false){ - throw new \RuntimeException("Failed to read player data file \"$path\" (permission denied?)"); - } - $decompressed = @zlib_decode($contents); - if($decompressed === false){ - $this->logger->debug("Failed to decompress raw player data for \"$name\""); - $this->handleCorruptedPlayerData($name); - return null; - } + if(file_exists($path)){ + $contents = @file_get_contents($path); + if($contents === false){ + throw new \RuntimeException("Failed to read player data file \"$path\" (permission denied?)"); + } + $decompressed = @zlib_decode($contents); + if($decompressed === false){ + $this->logger->debug("Failed to decompress raw player data for \"$name\""); + $this->handleCorruptedPlayerData($name); + return null; + } - try{ - return (new BigEndianNbtSerializer())->read($decompressed)->mustGetCompoundTag(); - }catch(NbtDataException $e){ //zlib decode error / corrupt data - $this->logger->debug("Failed to decode NBT data for \"$name\": " . $e->getMessage()); - $this->handleCorruptedPlayerData($name); - return null; + try{ + return (new BigEndianNbtSerializer())->read($decompressed)->mustGetCompoundTag(); + }catch(NbtDataException $e){ //zlib decode error / corrupt data + $this->logger->debug("Failed to decode NBT data for \"$name\": " . $e->getMessage()); + $this->handleCorruptedPlayerData($name); + return null; + } } - } - return null; + return null; + }); } public function saveOfflinePlayerData(string $name, CompoundTag $nbtTag) : void{ @@ -554,13 +556,15 @@ class Server{ $ev->call(); if(!$ev->isCancelled()){ - $nbt = new BigEndianNbtSerializer(); - try{ - file_put_contents($this->getPlayerDataPath($name), zlib_encode($nbt->write(new TreeRoot($ev->getSaveData())), ZLIB_ENCODING_GZIP)); - }catch(\ErrorException $e){ - $this->logger->critical($this->getLanguage()->translateString("pocketmine.data.saveError", [$name, $e->getMessage()])); - $this->logger->logException($e); - } + Timings::$syncPlayerDataSave->time(function() use ($name, $ev) : void{ + $nbt = new BigEndianNbtSerializer(); + try{ + file_put_contents($this->getPlayerDataPath($name), zlib_encode($nbt->write(new TreeRoot($ev->getSaveData())), ZLIB_ENCODING_GZIP)); + }catch(\ErrorException $e){ + $this->logger->critical($this->getLanguage()->translateString("pocketmine.data.saveError", [$name, $e->getMessage()])); + $this->logger->logException($e); + } + }); } } diff --git a/src/timings/Timings.php b/src/timings/Timings.php index d267798dc..69dd54505 100644 --- a/src/timings/Timings.php +++ b/src/timings/Timings.php @@ -107,6 +107,11 @@ abstract class Timings{ /** @var TimingsHandler */ public static $craftingDataCacheRebuildTimer; + /** @var TimingsHandler */ + public static $syncPlayerDataLoad; + /** @var TimingsHandler */ + public static $syncPlayerDataSave; + /** @var TimingsHandler[] */ public static $entityTypeTimingMap = []; /** @var TimingsHandler[] */ @@ -155,6 +160,9 @@ abstract class Timings{ self::$permissibleCalculationTimer = new TimingsHandler("Permissible Calculation"); self::$permissionDefaultTimer = new TimingsHandler("Default Permission Calculation"); + self::$syncPlayerDataLoad = new TimingsHandler("Player Data Load"); + self::$syncPlayerDataSave = new TimingsHandler("Player Data Save"); + self::$entityMoveTimer = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "entityMove"); self::$playerCheckNearEntitiesTimer = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "checkNearEntities"); self::$tickEntityTimer = new TimingsHandler(self::INCLUDED_BY_OTHER_TIMINGS_PREFIX . "tickEntity");