/** * @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; }
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()); } }
/** * @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()); }
/** * @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; }