@@ -79,8 +79,7 @@ static function (array $items, array $itemTags) {
79
79
);
80
80
self ::$ setTagVersions ??= \Closure::bind (
81
81
static function (array $ items , array $ tagVersions ) {
82
- $ now = null ;
83
- foreach ($ items as $ key => $ item ) {
82
+ foreach ($ items as $ item ) {
84
83
$ item ->newMetadata [CacheItem::METADATA_TAGS ] = array_intersect_key ($ tagVersions , $ item ->newMetadata [CacheItem::METADATA_TAGS ] ?? []);
85
84
}
86
85
},
@@ -343,14 +342,16 @@ public function __destruct()
343
342
private function getTagVersions (array $ tagsByKey , bool $ persistTags ): array
344
343
{
345
344
$ tagVersions = [];
346
- $ fetchTagVersions = false ;
345
+ $ fetchTagVersions = $ persistTags ;
347
346
348
347
foreach ($ tagsByKey as $ tags ) {
349
348
$ tagVersions += $ tags ;
350
-
349
+ if ($ fetchTagVersions ) {
350
+ continue ;
351
+ }
351
352
foreach ($ tags as $ tag => $ version ) {
352
353
if ($ tagVersions [$ tag ] !== $ version ) {
353
- unset( $ this -> knownTagVersions [ $ tag ]) ;
354
+ $ fetchTagVersions = true ;
354
355
}
355
356
}
356
357
}
@@ -364,38 +365,38 @@ private function getTagVersions(array $tagsByKey, bool $persistTags): array
364
365
foreach ($ tagVersions as $ tag => $ version ) {
365
366
$ tags [$ tag .static ::TAGS_PREFIX ] = $ tag ;
366
367
$ knownTagVersion = $ this ->knownTagVersions [$ tag ] ?? [0 , null ];
367
- if ($ fetchTagVersions || $ knownTagVersion [1 ] !== $ version || $ now - $ knownTagVersion [0 ] >= $ this ->knownTagVersionsTtl ) {
368
- // reuse previously fetched tag versions up to the ttl
368
+ if ($ fetchTagVersions || $ knownTagVersion [1 ] !== $ version || $ now > $ knownTagVersion [0 ]) {
369
+ // reuse previously fetched tag versions until the expiration
370
+ unset($ this ->knownTagVersions [$ tag ];
369
371
$ fetchTagVersions = true ;
370
372
}
371
- unset($ this ->knownTagVersions [$ tag ]); // For LRU tracking
372
- if ([0 , null ] !== $ knownTagVersion ) {
373
- $ this ->knownTagVersions [$ tag ] = $ knownTagVersion ;
374
- }
375
373
}
376
374
377
375
if (!$ fetchTagVersions ) {
378
376
return $ tagVersions ;
379
377
}
380
378
379
+ if (\count ($ this ->knownTagVersions ) > self ::MAX_NUMBER_OF_KNOWN_TAG_VERSIONS && $ now > reset ($ this ->knownTagVersions )[0 ]) {
380
+ array_splice ($ this ->knownTagVersions , 0 , \count ($ this ->knownTagVersions ) >> 2 );
381
+ }
382
+
381
383
$ newTags = [];
382
384
$ newVersion = null ;
385
+ $ expiration = $ now + $ this ->knownTagVersionsTtl ;
383
386
foreach ($ this ->tags ->getItems (array_keys ($ tags )) as $ tag => $ version ) {
384
- if (!$ version ->isHit ()) {
387
+ unset($ this ->knownTagVersions [$ tag = $ tags [$ tag ]]); // update FIFO
388
+ if ($ persistTags && !$ version ->isHit ()) {
385
389
$ newTags [$ tag ] = $ version ->set ($ newVersion ??= random_bytes (6 ));
386
390
}
387
- $ tagVersions [$ tag = $ tags [$ tag ]] = $ version ->get ();
388
- $ this ->knownTagVersions [$ tag ] = [$ now , $ tagVersions [$ tag ]];
391
+ if ($ tagVersions [$ tag ] = $ version ->get ()) {
392
+ $ this ->knownTagVersions [$ tag ] = [$ expiration , $ tagVersions [$ tag ]];
393
+ }
389
394
}
390
395
391
- if ($ newTags && $ persistTags ) {
396
+ if ($ newTags ) {
392
397
(self ::$ saveTags )($ this ->tags , $ newTags );
393
398
}
394
399
395
- if (\count ($ this ->knownTagVersions ) > $ maxTags = max (self ::MAX_NUMBER_OF_KNOWN_TAG_VERSIONS , \count ($ newTags ) << 1 )) {
396
- array_splice ($ this ->knownTagVersions , 0 , $ maxTags >> 1 );
397
- }
398
-
399
400
return $ tagVersions ;
400
401
}
401
402
}
0 commit comments