Changeset 746aa9
- Timestamp:
- 05/03/08 14:49:04 (4 years ago)
- 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)
- Files:
-
- 4 edited
-
Changes (modified) (1 diff)
-
Fast.xs (modified) (4 diffs)
-
lib/Cache/Memcached/Fast.pm (modified) (3 diffs)
-
t/big_value.t (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
Changes
rf8618a r746aa9 6 6 Changes since 0.10: 7 7 8 ??? 8 Add new parameter max_size (suggested by Alex Kapranoff, see 9 http://rt.cpan.org/Ticket/Display.html?id=35588). 9 10 10 11 -
Fast.xs
r272c52 r746aa9 35 35 SV *deserialize_method; 36 36 int utf8; 37 size_t max_size; 37 38 }; 38 39 … … 277 278 if (ps && SvOK(*ps)) 278 279 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; 279 286 280 287 parse_compress(memd, conf); … … 677 684 sv = compress(memd, sv, &flags); 678 685 buf = (void *) SvPV(sv, buf_len); 686 if (buf_len > memd->max_size) 687 return XSRETURN_EMPTY; 679 688 if (items > arg) 680 689 { … … 763 772 sv = compress(memd, sv, &flags); 764 773 buf = (void *) SvPV(sv, buf_len); 774 if (buf_len > memd->max_size) 775 continue; 765 776 if (av_len(av) >= arg) 766 777 { -
lib/Cache/Memcached/Fast.pm
rf8618a r746aa9 45 45 serialize_methods => [ \&Storable::freeze, \&Storable::thaw ], 46 46 utf8 => ($^V ge v5.8.1 ? 1 : 0), 47 max_size => 512 * 1024, 47 48 }); 48 49 … … 447 448 retrieved data is marked as being UTF-8 octet sequence). See 448 449 L<perlunicode|perlunicode>. 450 451 452 =item I<max_size> 453 454 max_size => 512 * 1024 455 (default: 1024 * 1024) 456 457 The value is a maximum size of an item to be stored in memcached. 458 When 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, 460 and I<set> methods return I<undef>. 461 462 Note that the real maximum on the server is less than 1MB, and depends 463 on key length among other things. So some values in the range 464 S<I<[1MB - N bytes, 1MB]>>, where N is several hundreds, will still be 465 sent to the server, and rejected there. You may set I<max_size> to a 466 smaller value to avoid this. 449 467 450 468 … … 493 511 serialize_methods => 1, 494 512 utf8 => 1, 513 max_size => 1, 495 514 check_args => 1, 496 515 ); -
t/big_value.t
r3cf2a0 r746aa9 10 10 11 11 if ($Memd::memd) { 12 plan tests => 6;12 plan tests => 13; 13 13 } else { 14 14 plan skip_all => 'Not connected'; … … 16 16 17 17 18 use constant THRESHOLD => 1024 * 1024 - 1024; 19 18 20 my $key = 'big_value'; 19 my $value = 'x' x 500_000; 21 my $value = 'x' x THRESHOLD; 22 my $small_value = 'x' x (THRESHOLD - 2048); 23 my $big_value = 'x' x (THRESHOLD + 2048); 24 25 my %smaller_params = %Memd::params; 26 $smaller_params{max_size} = THRESHOLD - 2048; 27 $smaller_params{namespace} .= 'smaller/'; 28 my $smaller_memd = new Cache::Memcached::Fast(\%smaller_params); 29 30 my %bigger_params = %Memd::params; 31 $bigger_params{max_size} = THRESHOLD + 2048; 32 $bigger_params{namespace} .= 'bigger/'; 33 my $bigger_memd = new Cache::Memcached::Fast(\%bigger_params); 20 34 21 35 $Memd::memd->enable_compress(0); 36 $smaller_memd->enable_compress(0); 37 $bigger_memd->enable_compress(0); 22 38 23 ok(! $Memd::memd->set($key, $value x 4),24 'Values over 1MB should be rejected');25 39 ok($Memd::memd->set($key, $value), 'Store value uncompressed'); 26 40 ok($Memd::memd->get($key) eq $value, 'Fetch'); 41 ok(! $smaller_memd->set($key, $value), 42 'Values equal to or greater than THRESHOLD should be rejected by module'); 43 ok(! $bigger_memd->set($key, $big_value), 44 'Values greater than 1MB should be rejected by server'); 27 45 28 $Memd::memd->enable_compress(1); 46 my @res = $smaller_memd->set_multi(["$key-1", $small_value], 47 ["$key-2", $big_value], 48 ["$key-3", $small_value]); 49 ok($res[0] and not defined $res[1] and $res[2]); 50 ok($smaller_memd->delete_multi("$key-1", "$key-3")); 29 51 30 52 SKIP: { … … 32 54 33 55 { 34 local $SIG{__WARN__} = sub { $warning =$_[0] };56 local $SIG{__WARN__} = sub { die $_[0] }; 35 57 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); 44 62 } 45 63 } 46 64 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'); 48 81 } 49 82
Note: See TracChangeset
for help on using the changeset viewer.
