diff --git a/README.md b/README.md index 61c5707..f92222b 100644 --- a/README.md +++ b/README.md @@ -144,10 +144,20 @@ Scheduler is responsible for: - running _Server Services_ in parallel using __preemptive multitasking__ - supporting custom _Multi-Processing Modules_ -- managing the number of processes based on a Task-Pool strategy +- managing the number of processes based on a Task-Pool strategy and Scheduler Disciplines - handling Process lifecycle - keeping track of and reporting Process state +#### Scheduler Disciplines + +In ZEUS, scheduling disciplines are algorithms used for distributing hardware resources (such as CPU time or memory) among Scheduler processes. + +The main purpose of scheduling algorithms is to minimize resource starvation by creating or termination of processes to keep number of active processes within the boundaries specified by Scheduler configuration. +Some algorithms may focus on termination of processes that were idle for too long, while other may terminate processes based on their actual memory footprint or a number of requests that they already processed. + +> Since version 1.3.4, Schedulers can be configured to use custom `\Zeus\Kernel\ProcessManager\Scheduler\Discipline\DisciplineInterface` implementations. +> **If no such implementation is specified, ZEUS defaults to a built-in _LRU (Least Recently Used) Discipline_.** + #### Multi-Processing Modules Certain multitasking architectures are incompatible or not efficient enough on different operating systems. To remedy this issue, ZEUS provides a Multi-Processing Module interface between an application and the underlying operating system that is designed to hide these differences by providing a consistent platform on which the application is run. @@ -243,11 +253,15 @@ Multiple _Process Schedulers_ can be configured in a regular Zend Framework 3 co ```php // contents of "zf3-application-directory/config/some-config.config.php" file: +use Zeus\Kernel\ProcessManager\MultiProcessingModule\PosixProcess; +use Zeus\Kernel\ProcessManager\Scheduler\Discipline\LruDiscipline; + return [ 'zeus_process_manager' => [ 'schedulers' => [ 'scheduler_1' => [ 'scheduler_name' => 'sample_scheduler', + 'scheduler_discipline' => LruDiscipline::class, // choice available since version 1.3.4 'multiprocessing_module' => PosixProcess::class, 'max_processes' => 32, 'max_process_tasks' => 100, @@ -266,6 +280,7 @@ The table below describes the configuration parameters: | Parameter | Required | Description | |------------------------|:--------:|---------------------------------------------------------------------------------------| | scheduler_name | yes | Unique name of the scheduler configuration | +| scheduler_discipline | no | Zend Framework service providing Scheduler's process management strategy | | multiprocessing_module | yes | Specifies a `MultiProcessingModuleInterface` implementation to be used in a Scheduler | | start_processes | yes | Specifies the number of processes that will initially launch with each Server Service | | max_processes | yes | Maximum number of running/waiting processes of each Server Service | @@ -283,6 +298,8 @@ Multiple _Server Services_ can be configured in a regular Zend Framework 3 confi ```php // contents of "zf3-application-directory/config/some-config.config.php" file: +use Zeus\ServerService\Shared\Logger\LoggerInterface; + return [ 'zeus_process_manager' => [ 'services' => [ @@ -358,6 +375,9 @@ Each service must be listed in the `services` section of `zeus_process_manager` ```php // contents of "zf3-application-directory/config/some-config.config.php" file: +use Zeus\ServerService\Shared\Logger\LoggerInterface; +use Zeus\Kernel\ProcessManager\MultiProcessingModule\PosixProcess; + return [ 'zeus_process_manager' => [ 'services' => [ @@ -441,6 +461,13 @@ The above configuration parameters have been described in the __Process Schedule # Changelog +## Version 1.3.4 +- [Feature] Implemented Scheduler Disciplines functionality +- [Feature] Extracted LRU Discipline from Scheduler core +- [Fix] Scheduler was too aggressive in its calculations of number of spare processes to create +- [Fix] Documentation fixes (added missing namespaces in configuration examples) +- [Tests improvements] Improved code coverage + ## Version 1.3.3 - [Tests improvements] Improved code coverage - [Improvement] Documentation improvements and enhancements diff --git a/config/module.config.php b/config/module.config.php index b1f223c..e18615f 100644 --- a/config/module.config.php +++ b/config/module.config.php @@ -12,6 +12,8 @@ use Zeus\Kernel\ProcessManager\Factory\ManagerFactory; use Zeus\Kernel\ProcessManager\Factory\SchedulerFactory; use Zeus\Kernel\ProcessManager\Factory\ProcessFactory; +use Zeus\Kernel\ProcessManager\Scheduler\Discipline\Factory\LruDisciplineFactory; +use Zeus\Kernel\ProcessManager\Scheduler\Discipline\LruDiscipline; use Zeus\ServerService\Manager; use Zeus\Kernel\ProcessManager\Scheduler; use Zeus\Kernel\ProcessManager\Process; @@ -44,6 +46,7 @@ Process::class => ProcessFactory::class, Manager::class => ManagerFactory::class, PosixProcess::class => PosixProcessFactory::class, + LruDiscipline::class => LruDisciplineFactory::class, //Service::class => ServiceFactory::class, ], 'abstract_factories' => [ @@ -56,6 +59,7 @@ 'zeus_web_scheduler_1' => [ 'scheduler_name' => 'zeus_web_scheduler', 'multiprocessing_module' => PosixProcess::class, + 'scheduler_discipline' => LruDiscipline::class, 'max_processes' => 32, 'max_process_tasks' => 100, 'min_spare_processes' => 3, diff --git a/src/Zeus/Kernel/ProcessManager/Factory/SchedulerFactory.php b/src/Zeus/Kernel/ProcessManager/Factory/SchedulerFactory.php index bd2a312..8500611 100644 --- a/src/Zeus/Kernel/ProcessManager/Factory/SchedulerFactory.php +++ b/src/Zeus/Kernel/ProcessManager/Factory/SchedulerFactory.php @@ -9,6 +9,7 @@ use Zend\ServiceManager\Factory\FactoryInterface; use Zeus\Kernel\ProcessManager\Scheduler; use Zeus\Kernel\ProcessManager\Process; +use Zeus\Kernel\ProcessManager\Scheduler\Discipline\LruDiscipline; use Zeus\Kernel\ProcessManager\SchedulerEvent; use Zeus\ServerService\Shared\Logger\LoggerInterface; @@ -35,10 +36,12 @@ public function __invoke(ContainerInterface $container, $requestedName, array $o $serviceLoggerAdapter = $options['service_logger_adapter']; $mainLoggerAdapter = $options['main_logger_adapter']; + $schedulerDiscipline = + isset($schedulerConfig['scheduler_discipline']) ? $container->get($schedulerConfig['scheduler_discipline']) : $container->get(LruDiscipline::class); $processService = $container->build(Process::class, ['logger_adapter' => $serviceLoggerAdapter, 'process_event' => $schedulerEvent]); - $scheduler = new Scheduler($schedulerConfig, $processService, $mainLoggerAdapter, $options['ipc_adapter'], $schedulerEvent); + $scheduler = new Scheduler($schedulerConfig, $processService, $mainLoggerAdapter, $options['ipc_adapter'], $schedulerEvent, $schedulerDiscipline); $container->build($schedulerConfig['multiprocessing_module'], ['scheduler' => $scheduler, 'scheduler_event' => $schedulerEvent]); return $scheduler; diff --git a/src/Zeus/Kernel/ProcessManager/MultiProcessingModule/PosixProcess.php b/src/Zeus/Kernel/ProcessManager/MultiProcessingModule/PosixProcess.php index 96df116..43356a0 100644 --- a/src/Zeus/Kernel/ProcessManager/MultiProcessingModule/PosixProcess.php +++ b/src/Zeus/Kernel/ProcessManager/MultiProcessingModule/PosixProcess.php @@ -24,9 +24,6 @@ final class PosixProcess implements MultiProcessingModuleInterface /** @var SchedulerEvent */ protected $processEvent; - /** @var bool|null */ - private static $isPcntlExtensionLoaded = null; - /** @var PosixProcessBridgeInterface */ protected static $pcntlBridge; diff --git a/src/Zeus/Kernel/ProcessManager/Scheduler.php b/src/Zeus/Kernel/ProcessManager/Scheduler.php index d6ef826..867e2d9 100644 --- a/src/Zeus/Kernel/ProcessManager/Scheduler.php +++ b/src/Zeus/Kernel/ProcessManager/Scheduler.php @@ -17,6 +17,11 @@ use Zeus\Kernel\ProcessManager\Status\ProcessTitle; use Zeus\Kernel\ProcessManager\Helper\EventManager; +/** + * Class Scheduler + * @package Zeus\Kernel\ProcessManager + * @internal + */ final class Scheduler { use Logger; @@ -126,25 +131,24 @@ public function setContinueMainLoop($continueMainLoop) } /** - * Handles input arguments. - * + * Scheduler constructor. * @param mixed[] $config * @param Process $processService * @param LoggerInterface $logger * @param IpcAdapterInterface $ipcAdapter - * @param $schedulerEvent + * @param SchedulerEvent $schedulerEvent + * @param DisciplineInterface $discipline */ - public function __construct($config, Process $processService, LoggerInterface $logger, IpcAdapterInterface $ipcAdapter, $schedulerEvent) + public function __construct($config, Process $processService, LoggerInterface $logger, IpcAdapterInterface $ipcAdapter, SchedulerEvent $schedulerEvent, DisciplineInterface $discipline) { $this->discipline = new LruDiscipline(); $this->config = new Config($config); $this->ipcAdapter = $ipcAdapter; $this->processService = $processService; $this->schedulerStatus = new ProcessState($this->config->getServiceName()); - $this->processStatusTemplate = new ProcessState($this->config->getServiceName()); - - $this->processes = new ProcessCollection($this->config->getMaxProcesses() + 1); $this->setLogger($logger); + + $this->processes = new ProcessCollection($this->config->getMaxProcesses()); $this->setLoggerExtraDetails(['service' => $this->config->getServiceName()]); if (!Console::isConsole()) { @@ -203,9 +207,9 @@ protected function onProcessMessage(EventInterface $event) } /** - * @param EventInterface $event + * @param SchedulerEvent $event */ - protected function onProcessExit(EventInterface $event) + protected function onProcessExit(SchedulerEvent $event) { $pid = $event->getParam('uid'); if ($pid === $this->getId()) { @@ -214,7 +218,7 @@ protected function onProcessExit(EventInterface $event) $event->setName(SchedulerEvent::EVENT_SCHEDULER_STOP); $event->setParams($this->getEventExtraData()); $this->getEventManager()->triggerEvent($event); - return $this; + return; } $this->log(\Zend\Log\Logger::DEBUG, "Process $pid exited"); @@ -228,8 +232,6 @@ protected function onProcessExit(EventInterface $event) unset($this->processes[$pid]); } - - return $this; } /** @@ -245,11 +247,10 @@ public function stop() $pid = (int)$pid; if ($pid) { - $this->events->trigger(SchedulerEvent::EVENT_PROCESS_TERMINATE, $this, - $this->getEventExtraData([ - 'uid' => $pid, 'soft' => true, - ] - )); + $event = $this->event; + $event->setName(SchedulerEvent::EVENT_PROCESS_TERMINATE); + $event->setParams($this->getEventExtraData(['uid' => $pid, 'soft' => true])); + $this->events->triggerEvent($event); $this->log(\Zend\Log\Logger::INFO, "Server stopped"); unlink($fileName); @@ -434,7 +435,10 @@ protected function onShutdown(EventInterface $event) foreach (array_keys($this->processes->toArray()) as $pid) { $this->log(\Zend\Log\Logger::DEBUG, "Terminating process $pid"); - $this->events->trigger(SchedulerEvent::EVENT_PROCESS_TERMINATE, $this, $this->getEventExtraData(['uid' => $pid])); + $event = $this->event; + $event->setName(SchedulerEvent::EVENT_PROCESS_TERMINATE); + $event->setParams($this->getEventExtraData(['uid' => $pid])); + $this->events->triggerEvent($event); } $this->handleMessages(); diff --git a/src/Zeus/Kernel/ProcessManager/Scheduler/Discipline/Factory/LruDisciplineFactory.php b/src/Zeus/Kernel/ProcessManager/Scheduler/Discipline/Factory/LruDisciplineFactory.php new file mode 100644 index 0000000..8275e12 --- /dev/null +++ b/src/Zeus/Kernel/ProcessManager/Scheduler/Discipline/Factory/LruDisciplineFactory.php @@ -0,0 +1,31 @@ +getStatusSummary(); $idleProcesses = $statusSummary[ProcessState::WAITING]; - //$busyProcesses = $statusSummary[ProcessState::RUNNING]; + $busyProcesses = $statusSummary[ProcessState::RUNNING]; //$terminatedProcesses = $statusSummary[ProcessStatus::STATUS_EXITING] + $statusSummary[ProcessStatus::STATUS_KILL]; $allProcesses = $processes->count(); @@ -70,7 +70,7 @@ public function manage(Config $config, ProcessCollection $processes) if ($idleProcesses < $config->getMinSpareProcesses()) { $idleProcessSlots = $processes->getSize() - $processes->count(); - $processesToCreate = min($idleProcessSlots, $config->getMinSpareProcesses()); + $processesToCreate = min($idleProcessSlots, $config->getMinSpareProcesses() - $idleProcesses); } if ($allProcesses === 0 && $config->getMinSpareProcesses() === 0 && $config->getMaxSpareProcesses() > 0) { diff --git a/src/Zeus/Module.php b/src/Zeus/Module.php index cd251fb..633b154 100644 --- a/src/Zeus/Module.php +++ b/src/Zeus/Module.php @@ -22,7 +22,7 @@ class Module implements ConsoleUsageProviderInterface, ConsoleBannerProviderInterface { - const MODULE_VERSION = "1.3.3"; + const MODULE_VERSION = "1.3.4"; protected static $overrideConfig = []; diff --git a/src/Zeus/ServerService/Http/Service.php b/src/Zeus/ServerService/Http/Service.php index 5a75c5a..6dc2b0d 100644 --- a/src/Zeus/ServerService/Http/Service.php +++ b/src/Zeus/ServerService/Http/Service.php @@ -61,7 +61,6 @@ protected function createReactLoop($messageComponent) $loop = LoopFactory::create(); $reactServer = new ReactServer($loop); $reactServer->listen($httpConfig->getListenPort(), $httpConfig->getListenAddress()); - //$socket->listenByUri('unix:///tmp/test.sock'); $loop->removeStream($reactServer->master); $dispatcherConfig = $this->getConfig(); diff --git a/test/Helpers/ZeusFactories.php b/test/Helpers/ZeusFactories.php index 2bf9dee..95d518c 100644 --- a/test/Helpers/ZeusFactories.php +++ b/test/Helpers/ZeusFactories.php @@ -22,6 +22,8 @@ use Zeus\Kernel\ProcessManager\Factory\SchedulerFactory; use Zeus\Kernel\ProcessManager\Process; use Zeus\Kernel\ProcessManager\Scheduler; +use Zeus\Kernel\ProcessManager\Scheduler\Discipline\Factory\LruDisciplineFactory; +use Zeus\Kernel\ProcessManager\Scheduler\Discipline\LruDiscipline; use Zeus\Kernel\ProcessManager\SchedulerEvent; use Zeus\ServerService\Manager; use Zeus\ServerService\Shared\Factory\AbstractServerServiceFactory; @@ -48,6 +50,7 @@ public function getServiceManager() $sm->setFactory(DummyServiceFactory::class, DummyServiceFactory::class); $sm->setFactory(ZeusController::class, ZeusControllerFactory::class); $sm->setFactory(Manager::class, ManagerFactory::class); + $sm->setFactory(LruDiscipline::class, LruDisciplineFactory::class); $sm->setFactory('ServiceListener', ServiceListenerFactory::class); $sm->setFactory('EventManager', EventManagerFactory::class); $sm->setFactory('ModuleManager', ModuleManagerFactory::class); diff --git a/test/HttpMessageTest.php b/test/HttpMessageTest.php index 2b0cc12..231f15d 100644 --- a/test/HttpMessageTest.php +++ b/test/HttpMessageTest.php @@ -199,11 +199,10 @@ public function testIfQueryDataIsCorrectlyInterpreted() for($chunkSize = 1, $messageSize = strlen($message); $chunkSize < $messageSize; $chunkSize++) { /** @var Request $request */ $request = null; + $errorOccurred = false; - $errorOccured = false; - - $errorHandler = function($request, $exception) use (& $errorOccured) { - $errorOccured = $exception; + $errorHandler = function($request, $exception) use (& $errorOccurred) { + $errorOccurred = $exception; }; $requestHandler = function ($_request) use (&$request) { @@ -215,8 +214,8 @@ public function testIfQueryDataIsCorrectlyInterpreted() foreach ($chunks as $index => $chunk) { $httpAdapter->onMessage($testConnection, $chunk); - if ($errorOccured) { - $this->fail("Error handler caught an error when parsing chunk #$index: " . $errorOccured->getMessage()); + if ($errorOccurred) { + $this->fail("Error handler caught an error when parsing chunk #$index: " . $errorOccurred->getMessage()); } } @@ -283,10 +282,10 @@ public function testIfRequestBodyIsReadCorrectly() $fileList = []; $tmpDir = $this->getTmpDir(); - $errorOccured = false; + $errorOccurred = false; - $errorHandler = function($request, $exception) use (& $errorOccured) { - $errorOccured = $exception; + $errorHandler = function($request, $exception) use (& $errorOccurred) { + $errorOccurred = $exception; }; $requestHandler = function (Request $_request) use (&$request, & $fileList, $tmpDir) { $request = $_request; @@ -304,8 +303,8 @@ public function testIfRequestBodyIsReadCorrectly() foreach ($chunks as $index => $chunk) { $httpAdapter->onMessage($testConnection, $chunk); - if ($errorOccured) { - $this->fail("Error handler caught an error when parsing chunk #$index: " . $errorOccured->getMessage()); + if ($errorOccurred) { + $this->fail("Error handler caught an error when parsing chunk #$index: " . $errorOccurred->getMessage()); } } @@ -333,10 +332,10 @@ public function testRegularPostRequestWithBody() $fileList = []; $tmpDir = $this->getTmpDir(); - $errorOccured = false; + $errorOccurred = false; - $errorHandler = function ($request, $exception) use (& $errorOccured) { - $errorOccured = $exception; + $errorHandler = function ($request, $exception) use (& $errorOccurred) { + $errorOccurred = $exception; }; @@ -351,8 +350,8 @@ public function testRegularPostRequestWithBody() foreach ($chunks as $index => $chunk) { $httpAdapter->onMessage($testConnection, $chunk); - if ($errorOccured) { - $this->fail("Error handler caught an error when parsing chunk #$index: " . $errorOccured->getMessage()); + if ($errorOccurred) { + $this->fail("Error handler caught an error when parsing chunk #$index: " . $errorOccurred->getMessage()); } } @@ -381,10 +380,10 @@ public function testChunkedPostRequest() $fileList = []; $tmpDir = $this->getTmpDir(); - $errorOccured = false; + $errorOccurred = false; - $errorHandler = function ($request, $exception) use (& $errorOccured) { - $errorOccured = $exception; + $errorHandler = function ($request, $exception) use (& $errorOccurred) { + $errorOccurred = $exception; }; $requestHandler = function (Request $_request) use (&$request, & $fileList, $tmpDir) { @@ -398,8 +397,8 @@ public function testChunkedPostRequest() foreach ($chunks as $index => $chunk) { $httpAdapter->onMessage($testConnection, $chunk); - if ($errorOccured) { - $this->fail("Error handler caught an error when parsing chunk #$index: " . $errorOccured->getMessage()); + if ($errorOccurred) { + $this->fail("Error handler caught an error when parsing chunk #$index: " . $errorOccurred->getMessage()); } } diff --git a/test/SchedulerStatusTest.php b/test/SchedulerStatusTest.php index 8f17197..be16e4e 100644 --- a/test/SchedulerStatusTest.php +++ b/test/SchedulerStatusTest.php @@ -3,7 +3,6 @@ namespace ZeusTest; use PHPUnit_Framework_TestCase; -use Zend\EventManager\EventInterface; use Zend\Log\Logger; use Zend\Log\Writer\Noop; use Zeus\Kernel\ProcessManager\Scheduler; diff --git a/test/SchedulerTest.php b/test/SchedulerTest.php index ba75e4c..4291089 100644 --- a/test/SchedulerTest.php +++ b/test/SchedulerTest.php @@ -160,41 +160,33 @@ function(SchedulerEvent $e) use (&$processesInitialized) { public function testProcessCreationWhenTooLittleOfThemIsWaiting() { - $scheduler = $this->getScheduler(1); + $scheduler = $this->getScheduler(20); + $scheduler->getConfig()->setStartProcesses(0); $amountOfScheduledProcesses = 0; $processesCreated = []; $em = $scheduler->getEventManager(); - $em->attach(SchedulerEvent::EVENT_PROCESS_EXIT, function(EventInterface $e) {$e->stopPropagation(true);}); + $em->attach(SchedulerEvent::EVENT_PROCESS_EXIT, function(SchedulerEvent $e) {$e->stopPropagation(true);}); $em->attach(SchedulerEvent::EVENT_PROCESS_INIT, function(SchedulerEvent $e) {$e->stopPropagation(true);}); $em->attach(SchedulerEvent::EVENT_PROCESS_CREATE, function(SchedulerEvent $e) use ($em, &$amountOfScheduledProcesses, $scheduler) { + $process = clone $e->getProcess(); + $e->setProcess($process); $e->getProcess()->setConfig($scheduler->getConfig()); $e->getProcess()->setEventManager($em); $amountOfScheduledProcesses++; $uid = 100000000 + $amountOfScheduledProcesses; - $e->stopPropagation(true); + $process->setId($uid); + // mark all processes as busy + if ($amountOfScheduledProcesses < 9) { + $e->getProcess()->setRunning(); + } $e->setName(SchedulerEvent::EVENT_PROCESS_CREATED); $e->setParam('uid', $uid); $em->triggerEvent($e); } ); - $em->attach(SchedulerEvent::EVENT_PROCESS_CREATED, - function(SchedulerEvent $e) use (&$processesCreated, $em) { - $event = new SchedulerEvent(); - $event->setName(SchedulerEvent::EVENT_PROCESS_INIT); - - $em->triggerEvent($event); - $processesCreated[] = $event->getParam('uid'); - - $uid = $event->getParam('uid'); - $processesInitialized[] = $uid; - - // mark all processes as busy - $e->getProcess()->setRunning(); - } - ); $scheduler->onSchedulerStart(); @@ -355,18 +347,20 @@ public function testProcessShutdownSequence() $processesCreated = []; $em = $scheduler->getEventManager(); - $em->attach(SchedulerEvent::EVENT_PROCESS_EXIT, function(EventInterface $e) {$e->stopPropagation(true);}); + $em->attach(SchedulerEvent::EVENT_PROCESS_EXIT, function(SchedulerEvent $e) {$e->stopPropagation(true);}); $em->attach(SchedulerEvent::EVENT_PROCESS_CREATE, - function(EventInterface $e) use (&$amountOfScheduledProcesses, &$processesCreated, $em) { + function(SchedulerEvent $e) use (&$amountOfScheduledProcesses, &$processesCreated, $em) { $amountOfScheduledProcesses++; $uid = 100000000 + $amountOfScheduledProcesses; $processesCreated[$uid] = true; - $em->trigger(SchedulerEvent::EVENT_PROCESS_CREATED, null, ['uid' => $uid]); + $e->setName(SchedulerEvent::EVENT_PROCESS_CREATED); + $e->setParam('uid', $uid); + $em->triggerEvent($e); } ); $em->attach(SchedulerEvent::EVENT_PROCESS_LOOP, - function(EventInterface $e) { + function(SchedulerEvent $e) { // stop the process $e->getTarget()->getStatus()->incrementNumberOfFinishedTasks(100); } @@ -374,21 +368,23 @@ function(EventInterface $e) { $schedulerStopped = false; $em->attach(SchedulerEvent::EVENT_SCHEDULER_STOP, - function(EventInterface $e) use (&$schedulerStopped) { + function(SchedulerEvent $e) use (&$schedulerStopped) { $schedulerStopped = true; $e->stopPropagation(true); }, -9999); $unknownProcesses = []; $em->attach(SchedulerEvent::EVENT_PROCESS_TERMINATE, - function(EventInterface $e) use ($em) { + function(SchedulerEvent $e) use ($em) { $uid = $e->getParam('uid'); - $em->trigger(SchedulerEvent::EVENT_PROCESS_TERMINATED, null, ['uid' => $uid]); + $e->setName(SchedulerEvent::EVENT_PROCESS_TERMINATED); + $e->setParam('uid', $uid); + $em->triggerEvent($e); } ); $em->attach(SchedulerEvent::EVENT_PROCESS_TERMINATED, - function(EventInterface $e) use (&$unknownProcesses, &$processesCreated, $em) { + function(SchedulerEvent $e) use (&$unknownProcesses, &$processesCreated, $em) { $uid = $e->getParam('uid'); if (!isset($processesCreated[$uid])) { $unknownProcesses[] = true; @@ -398,11 +394,14 @@ function(EventInterface $e) use (&$unknownProcesses, &$processesCreated, $em) { } ); - $scheduler->onSchedulerStart(new Event()); + + $event = new SchedulerEvent(); + $scheduler->onSchedulerStart($event); $this->assertEquals(8, $amountOfScheduledProcesses, "Scheduler should try to create 8 processes on its startup"); - $scheduler->getEventManager()->trigger(SchedulerEvent::EVENT_SCHEDULER_STOP, null); + $event->setName(SchedulerEvent::EVENT_SCHEDULER_STOP); + $scheduler->getEventManager()->triggerEvent($event); $this->assertEquals(0, count($processesCreated), 'All processes should have been planned to be terminated on scheduler shutdown'); $this->assertEquals(0, count($unknownProcesses), 'No unknown processes should have been terminated'); diff --git a/test/ZeusControllerTest.php b/test/ZeusControllerTest.php index bf49ece..f13e07d 100644 --- a/test/ZeusControllerTest.php +++ b/test/ZeusControllerTest.php @@ -32,6 +32,7 @@ public function tearDown() { unlink(__DIR__ . '/tmp/test.log'); rmdir(__DIR__ . '/tmp'); + parent::tearDown(); } /**