@@ -39,7 +39,6 @@ class TagAwareAdapter implements TagAwareAdapterInterface, TagAwareCacheInterfac
39
39
use LoggerAwareTrait;
40
40
41
41
public const TAGS_PREFIX = "\0tags \0" ;
42
- private const MAX_NUMBER_OF_KNOWN_TAG_VERSIONS = 1000 ;
43
42
44
43
private array $ deferred = [];
45
44
private AdapterInterface $ pool ;
@@ -79,8 +78,7 @@ static function (array $items, array $itemTags) {
79
78
);
80
79
self ::$ setTagVersions ??= \Closure::bind (
81
80
static function (array $ items , array $ tagVersions ) {
82
- $ now = null ;
83
- foreach ($ items as $ key => $ item ) {
81
+ foreach ($ items as $ item ) {
84
82
$ item ->newMetadata [CacheItem::METADATA_TAGS ] = array_intersect_key ($ tagVersions , $ item ->newMetadata [CacheItem::METADATA_TAGS ] ?? []);
85
83
}
86
84
},
@@ -343,14 +341,16 @@ public function __destruct()
343
341
private function getTagVersions (array $ tagsByKey , bool $ persistTags ): array
344
342
{
345
343
$ tagVersions = [];
346
- $ fetchTagVersions = false ;
344
+ $ fetchTagVersions = $ persistTags ;
347
345
348
346
foreach ($ tagsByKey as $ tags ) {
349
347
$ tagVersions += $ tags ;
350
-
348
+ if ($ fetchTagVersions ) {
349
+ continue ;
350
+ }
351
351
foreach ($ tags as $ tag => $ version ) {
352
352
if ($ tagVersions [$ tag ] !== $ version ) {
353
- unset( $ this -> knownTagVersions [ $ tag ]) ;
353
+ $ fetchTagVersions = true ;
354
354
}
355
355
}
356
356
}
@@ -364,14 +364,10 @@ private function getTagVersions(array $tagsByKey, bool $persistTags): array
364
364
foreach ($ tagVersions as $ tag => $ version ) {
365
365
$ tags [$ tag .static ::TAGS_PREFIX ] = $ tag ;
366
366
$ 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
367
+ if ($ fetchTagVersions || $ now > $ knownTagVersion [0 ] || $ knownTagVersion [1 ] !== $ version ) {
368
+ // reuse previously fetched tag versions until the expiration
369
369
$ fetchTagVersions = true ;
370
370
}
371
- unset($ this ->knownTagVersions [$ tag ]); // For LRU tracking
372
- if ([0 , null ] !== $ knownTagVersion ) {
373
- $ this ->knownTagVersions [$ tag ] = $ knownTagVersion ;
374
- }
375
371
}
376
372
377
373
if (!$ fetchTagVersions ) {
@@ -380,20 +376,24 @@ private function getTagVersions(array $tagsByKey, bool $persistTags): array
380
376
381
377
$ newTags = [];
382
378
$ newVersion = null ;
379
+ $ expiration = $ now + $ this ->knownTagVersionsTtl ;
383
380
foreach ($ this ->tags ->getItems (array_keys ($ tags )) as $ tag => $ version ) {
384
- if (!$ version ->isHit ()) {
381
+ unset($ this ->knownTagVersions [$ tag = $ tags [$ tag ]]); // update FIFO
382
+ if (null !== $ tagVersions [$ tag ] = $ version ->get ()) {
383
+ $ this ->knownTagVersions [$ tag ] = [$ expiration , $ tagVersions [$ tag ]];
384
+ } elseif ($ persistTags ) {
385
385
$ newTags [$ tag ] = $ version ->set ($ newVersion ??= random_bytes (6 ));
386
+ $ tagVersions [$ tag ] = $ newVersion ;
387
+ $ this ->knownTagVersions [$ tag ] = [$ expiration , $ newVersion ];
386
388
}
387
- $ tagVersions [$ tag = $ tags [$ tag ]] = $ version ->get ();
388
- $ this ->knownTagVersions [$ tag ] = [$ now , $ tagVersions [$ tag ]];
389
389
}
390
390
391
- if ($ newTags && $ persistTags ) {
391
+ if ($ newTags ) {
392
392
(self ::$ saveTags )($ this ->tags , $ newTags );
393
393
}
394
394
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 );
395
+ while ( $ now > ($ this ->knownTagVersions [ $ tag = array_key_first ( $ this -> knownTagVersions )][ 0 ] ?? \ INF )) {
396
+ unset ($ this ->knownTagVersions [ $ tag ] );
397
397
}
398
398
399
399
return $ tagVersions ;
0 commit comments