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

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit f49df4a

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

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[CacheItem::METADATA_EXPIRY] = $metadata[CacheItem::METADATA_EXPIRY] = $item->expiry;
62+
$item->newMetadata[CacheItem::METADATA_CTIME] = $metadata[CacheItem::METADATA_CTIME] = 1000 * (int) ($endTime - $startTime);
63+
} else {
64+
unset($metadata[CacheItem::METADATA_EXPIRY], $metadata[CacheItem::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