Changeset 746aa9


Ignore:
Timestamp:
05/03/08 14:49:04 (4 years ago)
Author:
Tomash Brechko <tomash.brechko@…>
Branches:
master
Children:
3d952a
Parents:
182fc0
git-author:
Tomash Brechko <tomash.brechko@…> (05/03/08 14:49:04)
git-committer:
Tomash Brechko <tomash.brechko@…> (05/03/08 14:49:04)
Message:

Add max_size parameter.

See  http://rt.cpan.org/Ticket/Display.html?id=35588.

Files:
4 edited

Legend:

Unmodified
Added
Removed
  • Changes

    rf8618a r746aa9  
    66        Changes since 0.10: 
    77 
    8         ??? 
     8        Add new parameter max_size (suggested by Alex Kapranoff, see 
     9        http://rt.cpan.org/Ticket/Display.html?id=35588). 
    910 
    1011 
  • Fast.xs

    r272c52 r746aa9  
    3535  SV *deserialize_method; 
    3636  int utf8; 
     37  size_t max_size; 
    3738}; 
    3839 
     
    277278  if (ps && SvOK(*ps)) 
    278279    client_set_nowait(c, SvTRUE(*ps)); 
     280 
     281  ps = hv_fetch(conf, "max_size", 8, 0); 
     282  if (ps && SvOK(*ps)) 
     283    memd->max_size = SvUV(*ps); 
     284  else 
     285    memd->max_size = 1024 * 1024; 
    279286 
    280287  parse_compress(memd, conf); 
     
    677684        sv = compress(memd, sv, &flags); 
    678685        buf = (void *) SvPV(sv, buf_len); 
     686        if (buf_len > memd->max_size) 
     687          return XSRETURN_EMPTY; 
    679688        if (items > arg) 
    680689          { 
     
    763772            sv = compress(memd, sv, &flags); 
    764773            buf = (void *) SvPV(sv, buf_len); 
     774            if (buf_len > memd->max_size) 
     775              continue; 
    765776            if (av_len(av) >= arg) 
    766777              { 
  • lib/Cache/Memcached/Fast.pm

    rf8618a r746aa9  
    4545      serialize_methods => [ \&Storable::freeze, \&Storable::thaw ], 
    4646      utf8 => ($^V ge v5.8.1 ? 1 : 0), 
     47      max_size => 512 * 1024, 
    4748  }); 
    4849 
     
    447448retrieved data is marked as being UTF-8 octet sequence).  See 
    448449L<perlunicode|perlunicode>. 
     450 
     451 
     452=item I<max_size> 
     453 
     454  max_size => 512 * 1024 
     455  (default: 1024 * 1024) 
     456 
     457The value is a maximum size of an item to be stored in memcached. 
     458When trying to set a key to a value longer than I<max_size> bytes 
     459(after serialization and compression) nothing is sent to the server, 
     460and I<set> methods return I<undef>. 
     461 
     462Note that the real maximum on the server is less than 1MB, and depends 
     463on key length among other things.  So some values in the range 
     464S<I<[1MB - N bytes, 1MB]>>, where N is several hundreds, will still be 
     465sent to the server, and rejected there.  You may set I<max_size> to a 
     466smaller value to avoid this. 
    449467 
    450468 
     
    493511    serialize_methods => 1, 
    494512    utf8 => 1, 
     513    max_size => 1, 
    495514    check_args => 1, 
    496515); 
  • t/big_value.t

    r3cf2a0 r746aa9  
    1010 
    1111if ($Memd::memd) { 
    12     plan tests => 6; 
     12    plan tests => 13; 
    1313} else { 
    1414    plan skip_all => 'Not connected'; 
     
    1616 
    1717 
     18use constant THRESHOLD => 1024 * 1024 - 1024; 
     19 
    1820my $key = 'big_value'; 
    19 my $value = 'x' x 500_000; 
     21my $value = 'x' x THRESHOLD; 
     22my $small_value = 'x' x (THRESHOLD - 2048); 
     23my $big_value = 'x' x (THRESHOLD + 2048); 
     24 
     25my %smaller_params = %Memd::params; 
     26$smaller_params{max_size} = THRESHOLD - 2048; 
     27$smaller_params{namespace} .= 'smaller/'; 
     28my $smaller_memd = new Cache::Memcached::Fast(\%smaller_params); 
     29 
     30my %bigger_params = %Memd::params; 
     31$bigger_params{max_size} = THRESHOLD + 2048; 
     32$bigger_params{namespace} .= 'bigger/'; 
     33my $bigger_memd = new Cache::Memcached::Fast(\%bigger_params); 
    2034 
    2135$Memd::memd->enable_compress(0); 
     36$smaller_memd->enable_compress(0); 
     37$bigger_memd->enable_compress(0); 
    2238 
    23 ok(! $Memd::memd->set($key, $value x 4), 
    24    'Values over 1MB should be rejected'); 
    2539ok($Memd::memd->set($key, $value), 'Store value uncompressed'); 
    2640ok($Memd::memd->get($key) eq $value, 'Fetch'); 
     41ok(! $smaller_memd->set($key, $value), 
     42   'Values equal to or greater than THRESHOLD should be rejected by module'); 
     43ok(! $bigger_memd->set($key, $big_value), 
     44   'Values greater than 1MB should be rejected by server'); 
    2745 
    28 $Memd::memd->enable_compress(1); 
     46my @res = $smaller_memd->set_multi(["$key-1", $small_value], 
     47                                   ["$key-2", $big_value], 
     48                                   ["$key-3", $small_value]); 
     49ok($res[0] and not defined $res[1] and $res[2]); 
     50ok($smaller_memd->delete_multi("$key-1", "$key-3")); 
    2951 
    3052SKIP: { 
     
    3254 
    3355    { 
    34         local $SIG{__WARN__} = sub { $warning = $_[0] }; 
     56        local $SIG{__WARN__} = sub { die $_[0] }; 
    3557 
    36         ok($Memd::memd->set($key, $value), 'Store value possibly compressed'); 
    37     } 
    38  
    39     if (defined $warning) { 
    40         if ($warning =~ /^Can't find module IO::Compress::/) { 
    41             skip $warning, 1; 
    42         } else { 
    43             warn "$warning\n"; 
     58        eval { 
     59            $Memd::memd->enable_compress(1); 
     60            $smaller_memd->enable_compress(1); 
     61            $bigger_memd->enable_compress(1); 
    4462        } 
    4563    } 
    4664 
    47     ok($Memd::memd->get($key) eq $value, 'Fetch and uncompress'); 
     65    if ($@) { 
     66        if ($@ =~ /^Compression module was not found/) { 
     67            skip $@, 6; 
     68        } else { 
     69            warn "$@\n"; 
     70        } 
     71    } 
     72 
     73    ok($smaller_memd->set($key, $value), 'Store compressed value'); 
     74    ok($bigger_memd->set($key, $big_value), 'Store compressed value'); 
     75 
     76    ok($smaller_memd->get($key) eq $value, 'Fetch and uncompress'); 
     77    ok($bigger_memd->get($key) eq $big_value, 'Fetch and uncompress'); 
     78 
     79    ok($smaller_memd->delete($key), 'Delete'); 
     80    ok($bigger_memd->delete($key), 'Delete'); 
    4881} 
    4982 
Note: See TracChangeset for help on using the changeset viewer.