PluginProbe ʕ •ᴥ•ʔ
Matomo Analytics – Powerful, Privacy-First Insights for WordPress / trunk
Matomo Analytics – Powerful, Privacy-First Insights for WordPress vtrunk
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 5 months ago Loader.php 4 months ago LoaderLock.php 1 year ago Parameters.php 1 month ago PluginsArchiver.php 1 year ago PluginsArchiverException.php 2 years ago Record.php 3 months ago RecordBuilder.php 1 month ago Rules.php 3 months ago
ArchivingStatus.php
110 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 int $idSite
50 * @param string $date1
51 * @param string $date2
52 * @param string $period
53 * @param string $doneFlag
54 * @return Lock
55 */
56 public function acquireArchiveInProgressLock($idSite, $date1, $date2, $period, $doneFlag)
57 {
58 $lock = $this->makeArchivingLockFromDoneFlag($idSite, $date1, $date2, $period, $doneFlag);
59 $lock->acquireLock('', $ttl = 1);
60 return $lock;
61 }
62 public function archiveFinished()
63 {
64 $lock = array_pop($this->lockStack);
65 $lock->unlock();
66 }
67 public function getCurrentArchivingLock()
68 {
69 if (empty($this->lockStack)) {
70 return null;
71 }
72 return end($this->lockStack);
73 }
74 public function getSitesCurrentlyArchiving()
75 {
76 $lockMeta = new Lock($this->lockBackend, self::LOCK_KEY_PREFIX . '.');
77 $acquiredLocks = $lockMeta->getAllAcquiredLockKeys();
78 $sitesCurrentlyArchiving = [];
79 foreach ($acquiredLocks as $lockKey) {
80 $parts = explode('.', $lockKey);
81 if (!isset($parts[1])) {
82 continue;
83 }
84 $sitesCurrentlyArchiving[] = (int) $parts[1];
85 }
86 $sitesCurrentlyArchiving = array_unique($sitesCurrentlyArchiving);
87 $sitesCurrentlyArchiving = array_values($sitesCurrentlyArchiving);
88 return $sitesCurrentlyArchiving;
89 }
90 /**
91 * @return Lock
92 */
93 private function makeArchivingLock(\Piwik\ArchiveProcessor\Parameters $params)
94 {
95 $doneFlag = \Piwik\ArchiveProcessor\Rules::getDoneStringFlagFor([$params->getSite()->getId()], $params->getSegment(), $params->getPeriod()->getLabel(), $params->getRequestedPlugin());
96 return $this->makeArchivingLockFromDoneFlag($params->getSite()->getId(), $params->getSite()->getId(), $params->getPeriod()->getDateStart()->toString(), $params->getPeriod()->getDateEnd()->toString(), $doneFlag);
97 }
98 private function makeArchivingLockFromDoneFlag($idSite, $date1, $date2, $period, $doneFlag)
99 {
100 $lockKeyParts = [
101 self::LOCK_KEY_PREFIX,
102 $idSite,
103 // md5 to keep it within the 70 char limit in the table
104 md5($period . $date1 . ',' . $date2 . $doneFlag),
105 ];
106 $lockKeyPrefix = implode('.', $lockKeyParts);
107 return new Lock(StaticContainer::get(LockBackend::class), $lockKeyPrefix, $this->archivingTTLSecs);
108 }
109 }
110