protected function execute(InputInterface $input, OutputInterface $output)
 {
     $systemCheck = new SystemCheck();
     $systemCheck->checkRedisIsInstalled();
     $settings = Queue\Factory::getSettings();
     if ($settings->queueEnabled->getValue()) {
         $output->writeln('Queue is enabled');
     } else {
         $output->writeln('<comment>' . strtoupper('Queue is disabled: ') . 'No new requests will be written into the queue, processing the remaining requests is still possible.</comment>');
     }
     $backend = Queue\Factory::makeBackend();
     $manager = Queue\Factory::makeQueueManager($backend);
     $queues = $manager->getAllQueues();
     $lock = Queue\Factory::makeLock($backend);
     if ($settings->processDuringTrackingRequest->getValue()) {
         $output->writeln('Request sets in the queue will be processed automatically after a tracking request');
     } else {
         $output->writeln('The command <comment>./console queuedtracking:process</comment> has to be executed to process request sets within queue');
     }
     $output->writeln(sprintf('Up to %d workers will be used', $manager->getNumberOfAvailableQueues()));
     $output->writeln(sprintf('Processor will start once there are at least %s request sets in the queue', $manager->getNumberOfRequestsToProcessAtSameTime()));
     while (1) {
         $memory = $backend->getMemoryStats();
         // I know this will only work with redis currently as it is not defined in backend interface etc. needs to be refactored once we add another backend
         $numInQueue = array();
         foreach ($queues as $queue) {
             $numInQueue[] = $queue->getNumberOfRequestSetsInQueue();
         }
         $message = sprintf('%s (%s) request sets left in queue. %s used memory (%s peak). %d workers active.        ', array_sum($numInQueue), implode('+', $numInQueue), $memory['used_memory_human'], $memory['used_memory_peak_human'], $lock->getNumberOfAcquiredLocks());
         $output->write("\r");
         $output->write($message);
         sleep(2);
     }
 }
 public function test_makeQueueMananger_shouldConfigureTheNumberOfWorkers()
 {
     $redis = $this->createRedisBackend();
     Factory::getSettings()->numQueueWorkers->setValue(7);
     $queue = Factory::makeQueueManager($redis);
     $this->assertSame(7, $queue->getNumberOfAvailableQueues());
 }
 public function setUp()
 {
     parent::setUp();
     Fixture::createWebsite('2014-01-01 00:00:00');
     Fixture::createSuperUser();
     Tracker\Cache::deleteTrackerCache();
     $this->backend = $this->createRedisBackend();
     $this->queue = Queue\Factory::makeQueueManager($this->backend);
     $this->response = new Response();
     $this->handler = new Handler();
     $this->handler->setResponse($this->response);
     $this->tracker = new Tracker();
     $this->requestSet = new RequestSet();
 }
 public function setValue($value)
 {
     $newNumWorkers = $value;
     $oldNumWorkers = $this->getValue();
     parent::setValue($value);
     if ($newNumWorkers && $oldNumWorkers) {
         try {
             $manager = Factory::makeQueueManager(Factory::makeBackend());
             $manager->setNumberOfAvailableQueues($newNumWorkers);
             $manager->moveSomeQueuesIfNeeded($newNumWorkers, $oldNumWorkers);
         } catch (\Exception $e) {
             // it is ok if this fails. then it is most likely not enabled etc.
         }
     }
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $systemCheck = new SystemCheck();
     $systemCheck->checkRedisIsInstalled();
     $trackerEnvironment = new Environment('tracker');
     $trackerEnvironment->init();
     Log::unsetInstance();
     $trackerEnvironment->getContainer()->get('Piwik\\Access')->setSuperUserAccess(false);
     $trackerEnvironment->getContainer()->get('Piwik\\Plugin\\Manager')->setTrackerPluginsNotToLoad(array('Provider'));
     Tracker::loadTrackerEnvironment();
     if (OutputInterface::VERBOSITY_VERY_VERBOSE <= $output->getVerbosity()) {
         $GLOBALS['PIWIK_TRACKER_DEBUG'] = true;
     }
     $backend = Queue\Factory::makeBackend();
     $queueManager = Queue\Factory::makeQueueManager($backend);
     if (!$queueManager->canAcquireMoreLocks()) {
         $trackerEnvironment->destroy();
         $this->writeSuccessMessage($output, array("Nothing to proccess. Already max number of workers in process."));
         return;
     }
     $shouldProcess = false;
     foreach ($queueManager->getAllQueues() as $queue) {
         if ($queue->shouldProcess()) {
             $shouldProcess = true;
             break;
         }
     }
     if (!$shouldProcess) {
         $trackerEnvironment->destroy();
         $this->writeSuccessMessage($output, array("No queue currently needs processing"));
         return;
     }
     $output->writeln("<info>Starting to process request sets, this can take a while</info>");
     register_shutdown_function(function () use($queueManager) {
         $queueManager->unlock();
     });
     $startTime = microtime(true);
     $processor = new Processor($queueManager);
     $processor->setNumberOfMaxBatchesToProcess(1000);
     $tracker = $processor->process();
     $neededTime = microtime(true) - $startTime;
     $numRequestsTracked = $tracker->getCountOfLoggedRequests();
     $requestsPerSecond = $this->getNumberOfRequestsPerSecond($numRequestsTracked, $neededTime);
     Piwik::postEvent('Tracker.end');
     $trackerEnvironment->destroy();
     $this->writeSuccessMessage($output, array(sprintf('This worker finished queue processing with %sreq/s (%s requests in %02.2f seconds)', $requestsPerSecond, $numRequestsTracked, $neededTime)));
 }
 protected function execute(InputInterface $input, OutputInterface $output)
 {
     $systemCheck = new SystemCheck();
     $systemCheck->checkRedisIsInstalled();
     $backend = Queue\Factory::makeBackend();
     $manager = Queue\Factory::makeQueueManager($backend);
     $queueId = $input->getOption('queue-id');
     foreach ($manager->getAllQueues() as $index => $queue) {
         $thisQueueId = $queue->getId();
         if (isset($queueId) && $queueId != $thisQueueId) {
             continue;
         }
         $output->writeln(sprintf('<info>Showing requests of queue %s. Use <comment>--queue-id=%s</comment> to print only information for this queue.</info>', $thisQueueId, $thisQueueId));
         $requests = $queue->getRequestSetsToProcess();
         $output->writeln(var_export($requests, 1));
         $output->writeln(sprintf('<info>These were the requests of queue %s. Use <comment>--queue-id=%s</comment> to print only information for this queue.</info>', $thisQueueId, $thisQueueId));
     }
 }
 public function test_numQueueWorkers_WhenChangingAValueItMovesRequestsIntoDifferentQueues()
 {
     $oldNumWorkers = 4;
     $newNumWorkers = 2;
     $this->settings->numQueueWorkers->setValue($oldNumWorkers);
     $manager = Factory::makeQueueManager(Factory::makeBackend());
     $requestSet = new RequestSet();
     $requestSet->setRequests(array('idsite' => '1', '_id' => 1));
     $queues = $manager->getAllQueues();
     foreach ($queues as $queue) {
         $queue->addRequestSet($requestSet);
     }
     $this->assertSame(4, $manager->getNumberOfRequestSetsInAllQueues());
     $this->assertSame(1, $queues[0]->getNumberOfRequestSetsInQueue());
     $this->assertSame(1, $queues[1]->getNumberOfRequestSetsInQueue());
     $this->assertSame(1, $queues[2]->getNumberOfRequestSetsInQueue());
     $this->assertSame(1, $queues[3]->getNumberOfRequestSetsInQueue());
     $this->settings->numQueueWorkers->setValue($newNumWorkers);
     $this->assertSame(4, $manager->getNumberOfRequestSetsInAllQueues());
     $this->assertGreaterThanOrEqual(1, $queues[0]->getNumberOfRequestSetsInQueue());
     $this->assertGreaterThanOrEqual(1, $queues[1]->getNumberOfRequestSetsInQueue());
     $this->assertSame(0, $queues[2]->getNumberOfRequestSetsInQueue());
     $this->assertSame(0, $queues[3]->getNumberOfRequestSetsInQueue());
 }
 private function getQueueManager()
 {
     $backend = $this->getBackend();
     $queue = Queue\Factory::makeQueueManager($backend);
     return $queue;
 }
 protected function createQueue()
 {
     return Queue\Factory::makeQueueManager($this->createRedisBackend());
 }