Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/Archive.php44
-rwxr-xr-xtests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php16
2 files changed, 45 insertions, 15 deletions
diff --git a/core/Archive.php b/core/Archive.php
index dcc14b7ad0..eada3e2b53 100644
--- a/core/Archive.php
+++ b/core/Archive.php
@@ -486,19 +486,43 @@ class Archive
return $recordName . "_" . $id;
}
- private function invalidatedReportsIfNeeded()
+ private function getSiteIdsThatAreRequestedInThisArchiveButWereNotInvalidatedYet()
{
if (is_null(self::$cache)) {
self::$cache = Cache::getTransientCache();
}
- $id = 'Archive.RememberedReportsInvalidated';
+ $id = 'Archive.SiteIdsOfRememberedReportsInvalidated';
- if (self::$cache->contains($id)) {
- return;
+ if (!self::$cache->contains($id)) {
+ self::$cache->save($id, array());
}
- self::$cache->save($id, 1);
+ $siteIdsAlreadyHandled = self::$cache->fetch($id);
+ $siteIdsRequested = $this->params->getIdSites();
+
+ foreach ($siteIdsRequested as $index => $siteIdRequested) {
+ $siteIdRequested = (int) $siteIdRequested;
+
+ if (in_array($siteIdRequested, $siteIdsAlreadyHandled)) {
+ unset($siteIdsRequested[$index]); // was already handled previously, do not do it again
+ } else {
+ $siteIdsAlreadyHandled[] = $siteIdRequested; // we will handle this id this time
+ }
+ }
+
+ self::$cache->save($id, $siteIdsAlreadyHandled);
+
+ return $siteIdsRequested;
+ }
+
+ private function invalidatedReportsIfNeeded()
+ {
+ $siteIdsRequested = $this->getSiteIdsThatAreRequestedInThisArchiveButWereNotInvalidatedYet();
+
+ if (empty($siteIdsRequested)) {
+ return; // all requested site ids were already handled
+ }
$invalidator = new ArchiveInvalidator();
$sitesPerDays = $invalidator->getRememberedArchivedReportsThatShouldBeInvalidated();
@@ -508,10 +532,14 @@ class Archive
continue;
}
+ $siteIdsToActuallyInvalidate = array_intersect($siteIds, $siteIdsRequested);
+
+ if (empty($siteIdsToActuallyInvalidate)) {
+ continue; // all site ids that should be handled are already handled
+ }
+
try {
- // an advanced version would only invalidate siteIds for $this->params->getIdSites() but would make
- // everything way more complex eg the cache above and which siteIds we pass here...
- $invalidator->markArchivesAsInvalidated($siteIds, $date, false);
+ $invalidator->markArchivesAsInvalidated($siteIdsToActuallyInvalidate, $date, false);
} catch (\Exception $e) {
Site::clearCache();
throw $e;
diff --git a/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php b/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php
index 8542e53774..712608c62e 100755
--- a/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php
+++ b/tests/PHPUnit/System/TwoVisitorsTwoWebsitesDifferentDaysConversionsTest.php
@@ -163,13 +163,14 @@ class TwoVisitorsTwoWebsitesDifferentDaysConversionsTest extends SystemTestCase
);
$cache = Cache::getTransientCache();
- $this->assertTrue($cache->contains('Archive.RememberedReportsInvalidated'));
+ $this->assertEquals(array(self::$fixture->idSite1, self::$fixture->idSite2),
+ $cache->fetch('Archive.SiteIdsOfRememberedReportsInvalidated'));
$invalidator = new ArchiveInvalidator();
self::$fixture->trackVisits();
- // trackVisits should remember archived reports as invalid
+ // trackVisits should remember to invalidate archived reports
$this->assertNotEmpty($invalidator->getRememberedArchivedReportsThatShouldBeInvalidated());
// although there were new tracked visists it doesn'T change as the report invalidation is cached and was
@@ -186,16 +187,17 @@ class TwoVisitorsTwoWebsitesDifferentDaysConversionsTest extends SystemTestCase
);
// make sure the caching in archive::get() worked and they are still to be invalidated
- $this->assertNotEmpty($invalidator->getRememberedArchivedReportsThatShouldBeInvalidated());
+ $this->assertCount(10, $invalidator->getRememberedArchivedReportsThatShouldBeInvalidated());
- // now we force to actually invalidate archived reports again and then archive will be rebuilt
- $cache->delete('Archive.RememberedReportsInvalidated');
+ // now we force to actually invalidate archived reports again and then archive will be rebuilt for requsted siteId = 1
+ $cache->delete('Archive.SiteIdsOfRememberedReportsInvalidated');
$archive = Archive::build($idSite1, 'range', $dateTimeRange);
$result = $archive->getNumeric($columns);
- // archive::get() should have invalidated them now as we cleared the lock / cache before
- $this->assertEmpty($invalidator->getRememberedArchivedReportsThatShouldBeInvalidated());
+ // archive::get() should have invalidated siteId 1 and siteId 2 should be still to be done
+ $expectedArchiveReportsLeft = array('2010-01-04' => array(2));
+ $this->assertEquals($expectedArchiveReportsLeft, $invalidator->getRememberedArchivedReportsThatShouldBeInvalidated());
$this->assertEquals(
array(