Bug 16229: Deep copy on first L2 fetch
When a value exists in L2 cache but not in L1 cache, it should be deep copied if needed (i.e. not a scalar). Otherwise the calling code is able to modify the value in cache. Note that is theoretical, it's possible that no code does that. Signed-off-by: Jacek Ablewicz <abl@biblos.pk.edu.pl> Signed-off-by: Tomas Cohen Arazi <tomascohen@unc.edu.ar> Signed-off-by: Brendan Gallagher <bredan@bywatersolutions.com>
This commit is contained in:
parent
8ec54c86fe
commit
956dc953b5
|
|
@ -335,6 +335,8 @@ sub get_from_cache {
|
|||
# Otherwise the L1 cache won't ever be populated
|
||||
$L1_cache{$key} = $value;
|
||||
|
||||
$value = clone $value if ref $L1_cache{$key} and not $unsafe;
|
||||
|
||||
return $value;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
use Modern::Perl;
|
||||
|
||||
use Test::More tests => 37;
|
||||
use Test::More tests => 38;
|
||||
|
||||
my $destructorcount = 0;
|
||||
|
||||
|
|
@ -181,6 +181,12 @@ SKIP: {
|
|||
$item_from_cache = $cache->get_from_cache('test_deep_copy_array');
|
||||
@$item_from_cache = qw( another array ref );
|
||||
is_deeply( $cache->get_from_cache('test_deep_copy_array'), [ qw ( an array ref ) ], 'An array will be deep copied');
|
||||
|
||||
$cache->flush_L1_cache();
|
||||
$item_from_cache = $cache->get_from_cache('test_deep_copy_array');
|
||||
@$item_from_cache = qw( another array ref );
|
||||
is_deeply( $cache->get_from_cache('test_deep_copy_array'), [ qw ( an array ref ) ], 'An array will be deep copied even it is the first fetch from L2');
|
||||
|
||||
$item_from_cache = $cache->get_from_cache('test_deep_copy_array', { unsafe => 1 });
|
||||
@$item_from_cache = qw( another array ref );
|
||||
is_deeply( $cache->get_from_cache('test_deep_copy_array'), [ qw ( another array ref ) ], 'An array will not be deep copied if the unsafe flag is set');
|
||||
|
|
|
|||
Loading…
Reference in New Issue