PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / 5.2.0
Matomo Analytics – Powerful, Privacy-First Insights for WordPress v5.2.0
5.11.1 5.11.0 5.10.2 5.10.1 trunk 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.1.0 1.1.1 1.1.2 1.1.3 1.2.0 1.3.0 1.3.1 1.3.2 4.0.0 4.0.1 4.0.2 4.0.3 4.0.4 4.1.0 4.1.1 4.1.2 4.1.3 4.10.0 4.11.0 4.12.0 4.13.0 4.13.2 4.13.3 4.13.4 4.13.5 4.14.0 4.14.1 4.14.2 4.15.0 4.15.1 4.15.2 4.15.3 4.2.0 4.3.0 4.3.1 4.4.1 4.4.2 4.5.0 4.6.0 5.0.1 5.0.2 5.0.3 5.0.4 5.0.5 5.0.6 5.0.7 5.0.8 5.1.0 5.1.1 5.1.2 5.1.3 5.1.4 5.1.5 5.1.6 5.1.7 5.10.0 5.2.0 5.2.1 5.2.2 5.3.0 5.3.1 5.3.2 5.3.3 5.6.0 5.6.1 5.7.0 5.7.1 5.8.0 5.8.1 5.8.2
matomo / app / core / ArchiveProcessor / ArchivingStatus.php
matomo / app / core / ArchiveProcessor Last commit date
ArchivingStatus.php 2 years ago Loader.php 1 year ago LoaderLock.php 1 year ago Parameters.php 1 year ago PluginsArchiver.php 1 year ago PluginsArchiverException.php 2 years ago Record.php 1 year ago RecordBuilder.php 1 year ago Rules.php 1 year ago
ArchivingStatus.php
107 lines
1 <?php
2
3 /**
4 * Matomo - free/libre analytics platform
5 *
6 * @link https://matomo.org
7 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
8 */
9 namespace Piwik\ArchiveProcessor;
10
11 use Piwik\Concurrency\Lock;
12 use Piwik\Concurrency\LockBackend;
13 use Piwik\Container\StaticContainer;
14 class ArchivingStatus
15 {
16 public const LOCK_KEY_PREFIX = 'Archiving';
17 public const DEFAULT_ARCHIVING_TTL = 7200;
18 // 2 hours
19 /**
20 * @var LockBackend
21 */
22 private $lockBackend;
23 /**
24 * @var int
25 */
26 private $archivingTTLSecs;
27 /**
28 * @var Lock[]
29 */
30 private $lockStack = [];
31 public function __construct(LockBackend $lockBackend, $archivingTTLSecs = self::DEFAULT_ARCHIVING_TTL)
32 {
33 $this->lockBackend = $lockBackend;
34 $this->archivingTTLSecs = $archivingTTLSecs;
35 }
36 public function archiveStarted(\Piwik\ArchiveProcessor\Parameters $params)
37 {
38 $lock = $this->makeArchivingLock($params);
39 $locked = $lock->acquireLock('', $this->archivingTTLSecs);
40 if ($locked) {
41 array_push($this->lockStack, $lock);
42 }
43 return $locked;
44 }
45 /**
46 * Try to acquire the lock that is acquired before starting archiving. If it is acquired, it
47 * means archiving is not ongoing. If it is not acquired, then archiving is ongoing.
48 *
49 * @param Parameters $params
50 * @param $doneFlag
51 * @return Lock
52 */
53 public function acquireArchiveInProgressLock($idSite, $date1, $date2, $period, $doneFlag)
54 {
55 $lock = $this->makeArchivingLockFromDoneFlag($idSite, $date1, $date2, $period, $doneFlag);
56 $lock->acquireLock('', $ttl = 1);
57 return $lock;
58 }
59 public function archiveFinished()
60 {
61 $lock = array_pop($this->lockStack);
62 $lock->unlock();
63 }
64 public function getCurrentArchivingLock()
65 {
66 if (empty($this->lockStack)) {
67 return null;
68 }
69 return end($this->lockStack);
70 }
71 public function getSitesCurrentlyArchiving()
72 {
73 $lockMeta = new Lock($this->lockBackend, self::LOCK_KEY_PREFIX . '.');
74 $acquiredLocks = $lockMeta->getAllAcquiredLockKeys();
75 $sitesCurrentlyArchiving = [];
76 foreach ($acquiredLocks as $lockKey) {
77 $parts = explode('.', $lockKey);
78 if (!isset($parts[1])) {
79 continue;
80 }
81 $sitesCurrentlyArchiving[] = (int) $parts[1];
82 }
83 $sitesCurrentlyArchiving = array_unique($sitesCurrentlyArchiving);
84 $sitesCurrentlyArchiving = array_values($sitesCurrentlyArchiving);
85 return $sitesCurrentlyArchiving;
86 }
87 /**
88 * @return Lock
89 */
90 private function makeArchivingLock(\Piwik\ArchiveProcessor\Parameters $params)
91 {
92 $doneFlag = \Piwik\ArchiveProcessor\Rules::getDoneStringFlagFor([$params->getSite()->getId()], $params->getSegment(), $params->getPeriod()->getLabel(), $params->getRequestedPlugin());
93 return $this->makeArchivingLockFromDoneFlag($params->getSite()->getId(), $params->getSite()->getId(), $params->getPeriod()->getDateStart()->toString(), $params->getPeriod()->getDateEnd()->toString(), $doneFlag);
94 }
95 private function makeArchivingLockFromDoneFlag($idSite, $date1, $date2, $period, $doneFlag)
96 {
97 $lockKeyParts = [
98 self::LOCK_KEY_PREFIX,
99 $idSite,
100 // md5 to keep it within the 70 char limit in the table
101 md5($period . $date1 . ',' . $date2 . $doneFlag),
102 ];
103 $lockKeyPrefix = implode('.', $lockKeyParts);
104 return new Lock(StaticContainer::get(LockBackend::class), $lockKeyPrefix, $this->archivingTTLSecs);
105 }
106 }
107