PocketMine-MP/tests/phpunit/scheduler/AsyncPoolTest.php
Dylan K. Taylor 29f6ed3f68 Use Snooze to improve AsyncTask collection times
regardless of how long an async task takes to run, it will take a multiple of 50ms to get the result processed. This delay causes issues in some cases for stuff like generation, which causes locking of adjacent chunks, and async packet compression, which experiences elevated latency because of this problem.
This is not an ideal solution for packet compression since it will cause the sleeper handler to get hammered, but since it's already getting hammered by every packet from RakLib, I don't think that's a big problem.
2020-12-02 19:34:34 +00:00

76 lines
2.2 KiB
PHP

<?php
/*
*
* ____ _ _ __ __ _ __ __ ____
* | _ \ ___ ___| | _____| |_| \/ (_)_ __ ___ | \/ | _ \
* | |_) / _ \ / __| |/ / _ \ __| |\/| | | '_ \ / _ \_____| |\/| | |_) |
* | __/ (_) | (__| < __/ |_| | | | | | | | __/_____| | | | __/
* |_| \___/ \___|_|\_\___|\__|_| |_|_|_| |_|\___| |_| |_|_|
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* @author PocketMine Team
* @link http://www.pocketmine.net/
*
*
*/
declare(strict_types=1);
namespace pocketmine\scheduler;
use PHPUnit\Framework\TestCase;
use pocketmine\snooze\SleeperHandler;
use pocketmine\utils\MainLogger;
use pocketmine\utils\Terminal;
use function define;
use function dirname;
use function microtime;
use function sys_get_temp_dir;
use function tempnam;
use function usleep;
class AsyncPoolTest extends TestCase{
/** @var AsyncPool */
private $pool;
/** @var MainLogger */
private $mainLogger;
public function setUp() : void{
Terminal::init();
@define('pocketmine\\COMPOSER_AUTOLOADER_PATH', dirname(__DIR__, 3) . '/vendor/autoload.php');
$this->mainLogger = new MainLogger(tempnam(sys_get_temp_dir(), "pmlog"));
$this->pool = new AsyncPool(2, 1024, new \BaseClassLoader(), $this->mainLogger, new SleeperHandler());
}
public function tearDown() : void{
$this->pool->shutdown();
$this->mainLogger->shutdown();
$this->mainLogger->join();
}
public function testTaskLeak() : void{
$start = microtime(true);
$this->pool->submitTask(new LeakTestAsyncTask());
while(!LeakTestAsyncTask::$destroyed and microtime(true) < $start + 30){
usleep(50 * 1000);
$this->pool->collectTasks();
}
self::assertTrue(LeakTestAsyncTask::$destroyed, "Task was not destroyed after 30 seconds");
}
public function testPublishProgressRace() : void{
$task = new PublishProgressRaceAsyncTask();
$this->pool->submitTask($task);
while($this->pool->collectTasks()){
usleep(50 * 1000);
}
self::assertTrue(PublishProgressRaceAsyncTask::$success, "Progress was not reported before task completion");
}
}