[Cache] Propagate expiry when syncing items in ChainAdapter
If a lower adapter provides item metadata, propagate the expiry time when syncing the item to upper ones.
This commit is contained in:
parent
5da657bcf3
commit
77138acea6
@ -61,14 +61,15 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa
|
|||||||
$this->adapterCount = \count($this->adapters);
|
$this->adapterCount = \count($this->adapters);
|
||||||
|
|
||||||
$this->syncItem = \Closure::bind(
|
$this->syncItem = \Closure::bind(
|
||||||
static function ($sourceItem, $item) use ($defaultLifetime) {
|
static function ($sourceItem, $item, $sourceMetadata = null) use ($defaultLifetime) {
|
||||||
$item->value = $sourceItem->value;
|
|
||||||
$item->expiry = $sourceItem->expiry;
|
|
||||||
$item->isHit = $sourceItem->isHit;
|
|
||||||
$item->metadata = $sourceItem->metadata;
|
|
||||||
|
|
||||||
$sourceItem->isTaggable = false;
|
$sourceItem->isTaggable = false;
|
||||||
unset($sourceItem->metadata[CacheItem::METADATA_TAGS]);
|
$sourceMetadata = $sourceMetadata ?? $sourceItem->metadata;
|
||||||
|
unset($sourceMetadata[CacheItem::METADATA_TAGS]);
|
||||||
|
|
||||||
|
$item->value = $sourceItem->value;
|
||||||
|
$item->expiry = $sourceMetadata[CacheItem::METADATA_EXPIRY] ?? $sourceItem->expiry;
|
||||||
|
$item->isHit = $sourceItem->isHit;
|
||||||
|
$item->metadata = $item->newMetadata = $sourceItem->metadata = $sourceMetadata;
|
||||||
|
|
||||||
if (0 < $sourceItem->defaultLifetime && $sourceItem->defaultLifetime < $defaultLifetime) {
|
if (0 < $sourceItem->defaultLifetime && $sourceItem->defaultLifetime < $defaultLifetime) {
|
||||||
$defaultLifetime = $sourceItem->defaultLifetime;
|
$defaultLifetime = $sourceItem->defaultLifetime;
|
||||||
@ -103,7 +104,7 @@ class ChainAdapter implements AdapterInterface, CacheInterface, PruneableInterfa
|
|||||||
$value = $this->doGet($adapter, $key, $callback, $beta, $metadata);
|
$value = $this->doGet($adapter, $key, $callback, $beta, $metadata);
|
||||||
}
|
}
|
||||||
if (null !== $item) {
|
if (null !== $item) {
|
||||||
($this->syncItem)($lastItem = $lastItem ?? $item, $item);
|
($this->syncItem)($lastItem = $lastItem ?? $item, $item, $metadata);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $value;
|
return $value;
|
||||||
|
@ -28,7 +28,7 @@ class ChainAdapterTest extends AdapterTestCase
|
|||||||
public function createCachePool($defaultLifetime = 0, $testMethod = null)
|
public function createCachePool($defaultLifetime = 0, $testMethod = null)
|
||||||
{
|
{
|
||||||
if ('testGetMetadata' === $testMethod) {
|
if ('testGetMetadata' === $testMethod) {
|
||||||
return new ChainAdapter([new FilesystemAdapter('', $defaultLifetime)], $defaultLifetime);
|
return new ChainAdapter([new FilesystemAdapter('a', $defaultLifetime), new FilesystemAdapter('b', $defaultLifetime)], $defaultLifetime);
|
||||||
}
|
}
|
||||||
|
|
||||||
return new ChainAdapter([new ArrayAdapter($defaultLifetime), new ExternalAdapter(), new FilesystemAdapter('', $defaultLifetime)], $defaultLifetime);
|
return new ChainAdapter([new ArrayAdapter($defaultLifetime), new ExternalAdapter(), new FilesystemAdapter('', $defaultLifetime)], $defaultLifetime);
|
||||||
|
Reference in New Issue
Block a user