Skip to content

Race condition in CHI::Driver::Role::IsSizeAware #35

@bes-internal

Description

@bes-internal

1

Race condition in discard_to_size():

setup

$cache = CHI->new(
namespace	=> 'resizeimg',
expires_in	=> '5 d',
max_size	=> int(10.01 * 1024*1024), # M
driver		=> 'File',
depth		=> 3,
);

and die in concurency at line 127, when one process working on clean keys from cache in while { } when second process got keys to clean but got empty list (because the final size is not written to cache store in the first process yet) then enter in else { } and die in eval as affirm (line 129) then at line 138

Assertion (iterator returned undef, cache should be empty) failed!
 at /usr/local/lib64/perl5/5.36/Carp/Assert.pm line 341.
        Carp::Assert::affirm(CODE(0x55e658a67468), "iterator returned undef, cache should be empty") called at /usr/local/lib64/perl5/5.36/CHI/Driver/Role/IsSizeAware.pm line 129
        eval {...} called at /usr/local/lib64/perl5/5.36/CHI/Driver/Role/IsSizeAware.pm line 118
        CHI::Driver::Role::IsSizeAware::discard_to_size(CHI::Driver::File__WITH__CHI::Driver::Role::Universal__AND__CHI::Driver::Role::IsSizeAware=HASH(0x55e658642e58), 8396996) called at /usr/local/lib64/perl5/5.36/CHI/Driver/Role/IsSizeAware.pm line 71
        CHI::Driver::Role::IsSizeAware::__ANON__(CODE(0x55e65892d6e0), CHI::Driver::File__WITH__CHI::Driver::Role::Universal__AND__CHI::Driver::Role::IsSizeAware=HASH(0x55e658642e58), "/var/www/nestormedia/testsite/img/pages/647-s.jpg;f=webp;w=40"..., CHI::CacheObject=ARRAY(0x55e658a66f58)) called at (eval 93) line 1
        CHI::Driver::File__WITH__CHI::Driver::Role::Universal__AND__CHI::Driver::Role::IsSizeAware::__ANON__(CHI::Driver::File__WITH__CHI::Driver::Role::Universal__AND__CHI::Driver::Role::IsSizeAware=HASH(0x55e658642e58), "/var/www/nestormedia/testsite/img/pages/647-s.jpg;f=webp;w=40"..., CHI::CacheObject=ARRAY(0x55e658a66f58)) called at (eval 95) line 2

Need to remove affirm at line 127.

2

I don't think we should ever die outside eval in discard_to_size at line 138

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions