Пример #1
0
 /**
  * @return bool|null
  */
 public function getSplitChanges()
 {
     //Fetching next since value from cache.
     $splitCache = new SplitCache();
     $since_cached_value = $splitCache->getChangeNumber();
     Di::getLogger()->info("SINCE CACHED VALUE: {$since_cached_value}");
     $servicePath = $this->servicePath . '?since=' . $since_cached_value;
     Di::getLogger()->info("SERVICE PATH: {$servicePath}");
     $response = $this->get($servicePath);
     if ($response->isSuccessful()) {
         $splitChanges = json_decode($response->getBody(), true);
         if (isset($splitChanges['since']) && isset($splitChanges['till']) && $splitChanges['since'] == $splitChanges['till']) {
             Di::getLogger()->info("Registering splits ready mark");
             $dateTimeUTC = new \DateTime("now", new \DateTimeZone("UTC"));
             $bur = new BlockUntilReadyCache();
             $bur->setReadySplits($dateTimeUTC->getTimestamp());
         }
         $splits = isset($splitChanges['splits']) ? $splitChanges['splits'] : false;
         if (!$splits) {
             Di::getLogger()->notice("Splits returned by the server are empty");
             return false;
         }
         return $splitChanges;
     }
     return false;
 }
Пример #2
0
 public function execute()
 {
     $registeredSegments = $this->cache()->getItemsOnList(SegmentCache::getCacheKeyForRegisterSegments());
     $log = $this->logger();
     if (is_array($registeredSegments) && !empty($registeredSegments)) {
         foreach ($registeredSegments as $segmentName) {
             $log->info(">>> Fetching data from segment: {$segmentName}");
             $timeStart = Latency::startMeasuringLatency();
             while (true) {
                 $timeStartPart = Latency::startMeasuringLatency();
                 if (!$this->getSplitClient()->updateSegmentChanges($segmentName)) {
                     $timeItTook = Latency::calculateLatency($timeStartPart);
                     $log->debug("Fetching segment last part ({$segmentName}) took {$timeItTook} microseconds");
                     $greedyTime = Latency::calculateLatency($timeStart);
                     $log->info("Finished fetching whole segment {$segmentName}, took {$greedyTime} microseconds");
                     break;
                 }
                 $timeItTook = Latency::calculateLatency($timeStartPart);
                 $log->debug("Fetching segment part ({$segmentName}) took {$timeItTook} microseconds");
                 //Sleep 1/2 second
                 usleep(500000);
             }
         }
         // Setting Segments ready mark
         $dateTimeUTC = new \DateTime("now", new \DateTimeZone("UTC"));
         $bur = new BlockUntilReadyCache();
         $bur->setReadySegments($dateTimeUTC->getTimestamp());
     }
 }
Пример #3
0
 /**
  * @depends testDiLog
  * @depends testDiCache
  */
 public function testBlockUntilReadyCacheInterface()
 {
     $dateTimeUTC = new \DateTime("now", new \DateTimeZone("UTC"));
     $deltaTime = 100;
     $splitsTimestamp = $dateTimeUTC->getTimestamp();
     $segmentsTimestamp = $dateTimeUTC->getTimestamp() + $deltaTime;
     $bur = new BlockUntilReadyCache();
     $bur->setReadySplits($splitsTimestamp);
     $bur->setReadySegments($segmentsTimestamp);
     //Checking
     $this->assertEquals($splitsTimestamp, $bur->getReadySplits());
     $this->assertEquals($segmentsTimestamp, $bur->getReadySegments());
     $this->assertEquals(min($splitsTimestamp, $segmentsTimestamp), $bur->getReadyCheckpoint());
 }
Пример #4
0
 /**
  * @param $timeout
  * @return bool
  */
 private function blockUntilReady($timeout)
 {
     $bur = new BlockUntilReadyCache();
     $startTime = Latency::startMeasuringLatency();
     do {
         $lastreadyCheckpoint = $bur->getReadyCheckpoint();
         if ($lastreadyCheckpoint > 0) {
             return true;
         }
         // Checkpoint in milliseconds
         $checkPoint = Latency::calculateLatency($startTime) / 1000;
         // waiting 10 milliseconds
         usleep(10000);
     } while ($checkPoint < $timeout);
     return false;
 }