8000 [Cache] fix LockRegistry · symfony/symfony@ebd7194 · GitHub
[go: up one dir, main page]

Skip to content

Commit ebd7194

Browse files
[Cache] fix LockRegistry
1 parent 8907650 commit ebd7194

File tree

2 files changed

+26
-11
lines changed

2 files changed

+26
-11
lines changed

src/Symfony/Component/Cache/LockRegistry.php

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
*
2424
* @author Nicolas Grekas <p@tchwork.com>
2525
*/
26-
class LockRegistry
26+
final class LockRegistry
2727
{
2828
private static $openedFiles = [];
2929
private static $lockedFiles = [];
@@ -74,7 +74,7 @@ public static function setFiles(array $files): array
7474
return $previousFiles;
7575
}
7676

77-
public static function compute(callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool)
77+
public static function compute(callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata = null)
7878
{
7979
$key = self::$files ? crc32($item->getKey()) % \count(self::$files) : -1;
8080

@@ -88,7 +88,18 @@ public static function compute(callable $callback, ItemInterface $item, bool &$s
8888
if (flock($lock, LOCK_EX | LOCK_NB)) {
8989
self::$lockedFiles[$key] = true;
9090

91-
return $callback($item, $save);
91+
$value = $callback($item, $save);
92+
93+
if ($save) {
94+
if ($setMetadata) {
95+
$setMetadata($item);
96+
}
97+
98+
$pool->save($item->set($value));
99+
$save = false;
100+
}
101+
102+
return $value;
92103
}
93104
// if we failed the race, retry locking in blocking mode to wait for the winner
94105
flock($lock, LOCK_SH);
@@ -125,6 +136,6 @@ private static function open(int $key)
125136
restore_error_handler();
126137
}
127138

128-
self::$openedFiles[$key] = $h ?: @fopen(self::$files[$key], 'r');
139+
return self::$openedFiles[$key] = $h ?: @fopen(self::$files[$key], 'r');
129140
}
130141
}

src/Symfony/Component/Cache/Traits/ContractsTrait.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ trait ContractsTrait
4040
public function setCallbackWrapper(?callable $callbackWrapper): callable
4141
{
4242
$previousWrapper = $this->callbackWrapper;
43-
$this->callbackWrapper = $callbackWrapper ?? function (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool) {
43+
$this->callbackWrapper = $callbackWrapper ?? function (callable $callback, ItemInterface $item, bool &$save, CacheInterface $pool, \Closure $setMetadata) {
4444
return $callback($item, $save);
4545
};
4646

@@ -56,17 +56,19 @@ private function doGet(AdapterInterface $pool, string $key, callable $callback,
5656
static $setMetadata;
5757

5858
$setMetadata = $setMetadata ?? \Closure::bind(
59-
function (AdapterInterface $pool, ItemInterface $item, float $startTime) {
59+
function (CacheItem $item, float $startTime, array &$metadata) {
6060
if ($item->expiry > $endTime = microtime(true)) {
61-
$item->newMetadata[ItemInterface::METADATA_EXPIRY] = $item->expiry;
62-
$item->newMetadata[ItemInterface::METADATA_CTIME] = 1000 * (int) ($endTime - $startTime);
61+
$item->newMetadata[ItemInterface::METADATA_EXPIRY] = $metadata[ItemInterface::METADATA_EXPIRY] = $item->expiry;
62+
$item->newMetadata[ItemInterface::METADATA_CTIME] = $metadata[ItemInterface::METADATA_CTIME] = 1000 * (int) ($endTime - $startTime);
63+
} else {
64+
unset($metadata[ItemInterface::METADATA_EXPIRY], $metadata[ItemInterface::METADATA_CTIME]);
6365
}
6466
},
6567
null,
6668
CacheItem::class
6769
);
6870

69-
return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata) {
71+
return $this->contractsGet($pool, $key, function (CacheItem $item, bool &$save) use ($pool, $callback, $setMetadata, &$metadata) {
7072
// don't wrap nor save recursive calls
7173
if (null === $callbackWrapper = $this->callbackWrapper) {
7274
$value = $callback($item, $save);
@@ -78,8 +80,10 @@ function (AdapterInterface $pool, ItemInterface $item, float $startTime) {
7880
$startTime = microtime(true);
7981

8082
try {
81-
$value = $callbackWrapper($callback, $item, $save, $pool);
82-
$setMetadata($pool, $item, $startTime);
83+
$value = $callbackWrapper($callback, $item, $save, $pool, function (CacheItem $item) use ($setMetadata, $startTime, &$metadata) {
84+
$setMetadata($item, $startTime, $metadata);
85+
});
86+
$setMetadata($item, $startTime, $metadata);
8387

8488
return $value;
8589
} finally {

0 commit comments

Comments
 (0)
0