Skip to content

Commit 24b4b46

Browse files
committed
ACP2E-3537: Corresponding cache key entries are not available in cache tags, hence cache cleaning does not work correctly
1 parent 2217274 commit 24b4b46

File tree

4 files changed

+66
-61
lines changed

4 files changed

+66
-61
lines changed

app/etc/di.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,14 @@
825825
<item name="cache_dir" xsi:type="string">page_cache</item>
826826
</item>
827827
</item>
828+
<item name="default" xsi:type="array">
829+
<item name="backend_options" xsi:type="array">
830+
<!-- Disable lua by default -->
831+
<item name="use_lua" xsi:type="boolean">false</item>
832+
<!-- Enable lua in the garbage collector to prevent race conditions -->
833+
<item name="use_lua_on_gc" xsi:type="boolean">true</item>
834+
</item>
835+
</item>
828836
</argument>
829837
</arguments>
830838
</type>

lib/internal/Magento/Framework/Cache/Backend/Redis.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
3-
* Copyright © Magento, Inc. All rights reserved.
4-
* See COPYING.txt for license details.
3+
* Copyright 2020 Adobe
4+
* All Rights Reserved.
55
*/
66

77
namespace Magento\Framework\Cache\Backend;
@@ -25,13 +25,21 @@ class Redis extends \Cm_Cache_Backend_Redis
2525
*/
2626
private $preloadKeys = [];
2727

28+
/**
29+
* Whether to use lua on garbage collection
30+
*
31+
* @var bool
32+
*/
33+
private bool $useLuaOnGc;
34+
2835
/**
2936
* @param array $options
3037
*/
3138
public function __construct($options = [])
3239
{
3340
$this->preloadKeys = $options['preload_keys'] ?? [];
3441
parent::__construct($options);
42+
$this->useLuaOnGc = isset($options['use_lua_on_gc']) ? (bool) $options['use_lua_on_gc'] : (bool) $this->_useLua;
3543
}
3644

3745
/**
@@ -99,6 +107,17 @@ public function remove($id)
99107
return $result;
100108
}
101109

110+
/**
111+
* @inheritDoc
112+
*/
113+
protected function _collectGarbage()
114+
{
115+
$useLua = $this->_useLua;
116+
$this->_useLua = $this->useLuaOnGc;
117+
parent::_collectGarbage();
118+
$this->_useLua = $useLua;
119+
}
120+
102121
/**
103122
* Disable show internals with var_dump
104123
*

setup/src/Magento/Setup/Model/ConfigOptionsList/Cache.php

Lines changed: 13 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
3-
* Copyright © Magento, Inc. All rights reserved.
4-
* See COPYING.txt for license details.
3+
* Copyright 2017 Adobe
4+
* All Rights Reserved.
55
*/
66
declare(strict_types=1);
77

@@ -33,6 +33,7 @@ class Cache implements ConfigOptionsListInterface
3333
public const INPUT_KEY_CACHE_BACKEND_REDIS_COMPRESSION_LIB = 'cache-backend-redis-compression-lib';
3434
public const INPUT_KEY_CACHE_BACKEND_REDIS_LUA_KEY = 'cache-backend-redis-lua-key';
3535
public const INPUT_KEY_CACHE_BACKEND_REDIS_USE_LUA = 'cache-backend-redis-use-lua';
36+
public const INPUT_KEY_CACHE_BACKEND_REDIS_USE_LUA_ON_GC = 'cache-backend-redis-use-lua-on-gc';
3637
public const INPUT_KEY_CACHE_ID_PREFIX = 'cache-id-prefix';
3738
public const INPUT_KEY_CACHE_ALLOW_PARALLEL_CACHE_GENERATION = 'allow-parallel-generation';
3839

@@ -45,6 +46,7 @@ class Cache implements ConfigOptionsListInterface
4546
public const CONFIG_PATH_CACHE_BACKEND_COMPRESSION_LIB = 'cache/frontend/default/backend_options/compression_lib';
4647
public const CONFIG_PATH_CACHE_BACKEND_LUA_KEY = 'cache/frontend/default/backend_options/_useLua';
4748
public const CONFIG_PATH_CACHE_BACKEND_USE_LUA = 'cache/frontend/default/backend_options/use_lua';
49+
public const CONFIG_PATH_CACHE_BACKEND_USE_LUA_ON_GC = 'cache/frontend/default/backend_options/use_lua_on_gc';
4850
public const CONFIG_PATH_CACHE_ID_PREFIX = 'cache/frontend/default/id_prefix';
4951
public const CONFIG_PATH_ALLOW_PARALLEL_CACHE_GENERATION = 'cache/allow_parallel_generation';
5052

@@ -59,8 +61,8 @@ class Cache implements ConfigOptionsListInterface
5961
self::INPUT_KEY_CACHE_BACKEND_REDIS_COMPRESS_DATA => '1',
6062
self::INPUT_KEY_CACHE_BACKEND_REDIS_COMPRESSION_LIB => '',
6163
self::INPUT_KEY_CACHE_ALLOW_PARALLEL_CACHE_GENERATION => 'false',
62-
self::INPUT_KEY_CACHE_BACKEND_REDIS_LUA_KEY => true,
63-
self::INPUT_KEY_CACHE_BACKEND_REDIS_USE_LUA => false
64+
self::INPUT_KEY_CACHE_BACKEND_REDIS_USE_LUA => '0',
65+
self::INPUT_KEY_CACHE_BACKEND_REDIS_USE_LUA_ON_GC => '1'
6466
];
6567

6668
/**
@@ -81,8 +83,8 @@ class Cache implements ConfigOptionsListInterface
8183
self::INPUT_KEY_CACHE_BACKEND_REDIS_COMPRESS_DATA => self::CONFIG_PATH_CACHE_BACKEND_COMPRESS_DATA,
8284
self::INPUT_KEY_CACHE_BACKEND_REDIS_COMPRESSION_LIB => self::CONFIG_PATH_CACHE_BACKEND_COMPRESSION_LIB,
8385
self::INPUT_KEY_CACHE_ALLOW_PARALLEL_CACHE_GENERATION => self::CONFIG_PATH_ALLOW_PARALLEL_CACHE_GENERATION,
84-
self::INPUT_KEY_CACHE_BACKEND_REDIS_LUA_KEY => self::CONFIG_PATH_CACHE_BACKEND_LUA_KEY,
8586
self::INPUT_KEY_CACHE_BACKEND_REDIS_USE_LUA => self::CONFIG_PATH_CACHE_BACKEND_USE_LUA,
87+
self::INPUT_KEY_CACHE_BACKEND_REDIS_USE_LUA_ON_GC=> self::CONFIG_PATH_CACHE_BACKEND_USE_LUA_ON_GC,
8688
];
8789

8890
/**
@@ -155,6 +157,12 @@ public function getOptions()
155157
self::CONFIG_PATH_CACHE_BACKEND_USE_LUA,
156158
'Set to 1 to enable lua (default is 0, disabled)'
157159
),
160+
new TextConfigOption(
161+
self::INPUT_KEY_CACHE_BACKEND_REDIS_USE_LUA_ON_GC,
162+
TextConfigOption::FRONTEND_WIZARD_TEXT,
163+
self::CONFIG_PATH_CACHE_BACKEND_USE_LUA_ON_GC,
164+
'Set to 0 to disable lua on garbage collection (default is 1, enabled)'
165+
),
158166
new TextConfigOption(
159167
self::INPUT_KEY_CACHE_ID_PREFIX,
160168
TextConfigOption::FRONTEND_WIZARD_TEXT,
@@ -266,20 +274,6 @@ private function validateRedisConfig(array $options, DeploymentConfig $deploymen
266274
$this->getDefaultConfigValue(self::INPUT_KEY_CACHE_BACKEND_REDIS_PASSWORD)
267275
);
268276

269-
$config['_useLua'] = isset($options[self::INPUT_KEY_CACHE_BACKEND_REDIS_LUA_KEY])
270-
? $options[self::INPUT_KEY_CACHE_BACKEND_REDIS_LUA_KEY]
271-
: $deploymentConfig->get(
272-
self::CONFIG_PATH_CACHE_BACKEND_LUA_KEY,
273-
$this->getDefaultConfigValue(self::CONFIG_PATH_CACHE_BACKEND_LUA_KEY)
274-
);
275-
276-
$config['use_lua'] = isset($options[self::INPUT_KEY_CACHE_BACKEND_REDIS_USE_LUA])
277-
? $options[self::INPUT_KEY_CACHE_BACKEND_REDIS_USE_LUA]
278-
: $deploymentConfig->get(
279-
self::CONFIG_PATH_CACHE_BACKEND_USE_LUA,
280-
$this->getDefaultConfigValue(self::CONFIG_PATH_CACHE_BACKEND_USE_LUA)
281-
);
282-
283277
return $this->redisValidator->isValidConnection($config);
284278
}
285279

setup/src/Magento/Setup/Test/Unit/Model/ConfigOptionsList/CacheTest.php

Lines changed: 24 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<?php
22
/**
3-
* Copyright © Magento, Inc. All rights reserved.
4-
* See COPYING.txt for license details.
3+
* Copyright 2017 Adobe
4+
* All Rights Reserved.
55
*/
66
declare(strict_types=1);
77

@@ -49,7 +49,7 @@ protected function setUp(): void
4949
public function testGetOptions()
5050
{
5151
$options = $this->configOptionsList->getOptions();
52-
$this->assertCount(10, $options);
52+
$this->assertCount(11, $options);
5353

5454
$this->assertArrayHasKey(0, $options);
5555
$this->assertInstanceOf(SelectConfigOption::class, $options[0]);
@@ -85,39 +85,44 @@ public function testGetOptions()
8585

8686
$this->assertArrayHasKey(8, $options);
8787
$this->assertInstanceOf(TextConfigOption::class, $options[8]);
88-
$this->assertEquals('cache-id-prefix', $options[8]->getName());
88+
$this->assertEquals('cache-backend-redis-use-lua-on-gc', $options[8]->getName());
8989

9090
$this->assertArrayHasKey(9, $options);
91-
$this->assertInstanceOf(FlagConfigOption::class, $options[9]);
92-
$this->assertEquals('allow-parallel-generation', $options[9]->getName());
91+
$this->assertInstanceOf(TextConfigOption::class, $options[9]);
92+
$this->assertEquals('cache-id-prefix', $options[9]->getName());
93+
94+
$this->assertArrayHasKey(10, $options);
95+
$this->assertInstanceOf(FlagConfigOption::class, $options[10]);
96+
$this->assertEquals('allow-parallel-generation', $options[10]->getName());
9397
}
9498

9599
/**
96100
* testCreateConfigCacheRedis
97101
*/
98102
public function testCreateConfigCacheRedis()
99103
{
100-
$this->deploymentConfigMock->method('get')->willReturn('');
104+
// Return default value for all config options
105+
$this->deploymentConfigMock->method('get')->willReturnArgument(1);
101106

102107
$expectedConfigData = [
103108
'cache' => [
104109
'frontend' => [
105110
'default' => [
106111
'backend' => \Magento\Framework\Cache\Backend\Redis::class,
107112
'backend_options' => [
108-
'server' => '',
109-
'port' => '',
110-
'database' => '',
113+
'server' => '127.0.0.1',
114+
'port' => '6379',
115+
'database' => '0',
111116
'password' => '',
112-
'compress_data' => '',
117+
'compress_data' => '1',
113118
'compression_lib' => '',
114-
'_useLua' => '',
115-
'use_lua' => ''
119+
'use_lua' => '0',
120+
'use_lua_on_gc' => '1'
116121
],
117122
'id_prefix' => $this->expectedIdPrefix(),
118123
]
119124
],
120-
'allow_parallel_generation' => '',
125+
'allow_parallel_generation' => 'false',
121126
]
122127
];
123128

@@ -137,27 +142,8 @@ public function testCreateConfigWithRedisConfig()
137142
function ($arg1, $arg2 = null) {
138143
if ($arg1 === CacheConfigOptionsList::CONFIG_PATH_CACHE_ID_PREFIX) {
139144
return 'XXX_';
140-
} elseif ($arg1 === CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_SERVER &&
141-
$arg2 === '127.0.0.1') {
142-
return '127.0.0.1';
143-
} elseif ($arg1 === CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_DATABASE &&
144-
$arg2 === '0') {
145-
return '0';
146-
} elseif ($arg1 === CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_PORT &&
147-
$arg2 === '6379') {
148-
return '6379';
149-
} elseif ($arg1 === CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_PASSWORD &&
150-
$arg2 === '') {
151-
return '';
152-
} elseif ($arg1 === CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_COMPRESS_DATA &&
153-
$arg2 === '1') {
154-
return '1';
155-
} elseif ($arg1 === CacheConfigOptionsList::CONFIG_PATH_CACHE_BACKEND_COMPRESSION_LIB &&
156-
$arg2 === '') {
157-
return '';
158-
} elseif ($arg1 === CacheConfigOptionsList::CONFIG_PATH_ALLOW_PARALLEL_CACHE_GENERATION &&
159-
$arg2 === 'false') {
160-
return null;
145+
} else {
146+
return $arg2;
161147
}
162148
}
163149
);
@@ -174,12 +160,12 @@ function ($arg1, $arg2 = null) {
174160
'password' => '',
175161
'compress_data' => '1',
176162
'compression_lib' => 'gzip',
177-
'_useLua' => null,
178-
'use_lua' => null
163+
'use_lua' => '0',
164+
'use_lua_on_gc' => '1'
179165
],
180166
]
181167
],
182-
'allow_parallel_generation' => null,
168+
'allow_parallel_generation' => 'false',
183169
]
184170
];
185171

@@ -261,8 +247,6 @@ public function testValidateWithValidInput()
261247
'db' => '',
262248
'port' => '',
263249
'password' => '',
264-
'_useLua' => null,
265-
'use_lua' => null
266250
])
267251
->willReturn(true);
268252

0 commit comments

Comments
 (0)