Changeset 16080

Show
Ignore:
Timestamp:
07/22/08 17:55:23 (5 years ago)
Author:
daisuke
Message:

implement fill()

Location:
lang/perl/Data-Valve/trunk
Files:
6 modified

Legend:

Unmodified
Added
Removed
  • lang/perl/Data-Valve/trunk/lib/Data/Valve.pm

    r16079 r16080  
    7070sub try_push { 
    7171    my ($self, %args) = @_; 
    72  
    7372    $args{key} ||= '__default'; 
    7473    $self->bucket_store->try_push(%args); 
     
    7776sub reset { 
    7877    my ($self, %args) = @_; 
    79  
    8078    $args{key} ||= '__default'; 
    8179    $self->bucket_store->reset(%args); 
     80} 
     81 
     82sub fill { 
     83    my ($self, %args) = @_; 
     84    $args{key} ||= '__default'; 
     85    $self->bucket_store->fill(%args); 
    8286} 
    8387 
     
    177181Boolean. Enable/Disable strict interval mode. Default is off. 
    178182 
    179 =cut 
     183=back 
     184 
     185=head2 fill([key => $key_name]) 
    180186 
    181187=head2 reset([key => $key_name]) 
  • lang/perl/Data-Valve/trunk/lib/Data/Valve/BucketStore.pm

    r16071 r16080  
    44use Moose::Role; 
    55 
    6 requires 'try_push'; 
     6requires qw(try_push fill reset); 
    77 
    88has 'context' => ( 
  • lang/perl/Data-Valve/trunk/lib/Data/Valve/BucketStore/Memory.pm

    r16079 r16080  
    1616 
    1717no Moose; 
     18 
     19sub fill { 
     20    my ($self, %args) = @_; 
     21 
     22    my $bucket = $self->store()->{ $args{key} }; 
     23    if (! $bucket) { 
     24        $bucket = $self->create_bucket; 
     25        $self->store()->{ $args{key} } = $bucket; 
     26    } 
     27 
     28    1 while ( $bucket->try_push() ); 
     29} 
    1830 
    1931sub reset { 
     
    5668=head1 METHODS 
    5769 
     70=head2 fill 
     71 
    5872=head2 reset 
    5973 
  • lang/perl/Data-Valve/trunk/lib/Data/Valve/BucketStore/Object.pm

    r16079 r16080  
    4141    return $rv; 
    4242} 
    43      
     43 
     44sub fill { 
     45    my ($self, %args) = @_; 
     46 
     47    my $key = $args{key}; 
     48 
     49    my $rv; 
     50    my $done = 0; 
     51    my $store = $self->store; 
     52    while ( ! $done) { 
     53        my $lock = $self->lock($key); 
     54        next unless $lock; 
     55 
     56        $done = 1; 
     57        my $bucket_source = $store->get($key); 
     58        my $bucket; 
     59        if ($bucket_source) { 
     60            $bucket = Data::Valve::Bucket->deserialize($bucket_source, $self->interval, $self->max_items, $self->strict_interval); 
     61        } else { 
     62            $bucket = Data::Valve::Bucket->new( 
     63                interval        => $self->interval, 
     64                max_items       => $self->max_items, 
     65                strict_interval => $self->strict_interval 
     66            ); 
     67        } 
     68 
     69        1 while ( $bucket->try_push() ); 
     70        $store->set($key, $bucket->serialize); 
     71    } 
     72 
     73    return $rv; 
     74} 
    4475 
    4576sub try_push { 
     
    99130=head1 METHODS 
    100131 
     132=head2 fill 
     133 
    101134=head2 reset 
    102135 
  • lang/perl/Data-Valve/trunk/t/01_basic.t

    r16078 r16080  
    11use strict; 
    2 use Test::More (tests => 31); 
     2use Test::More (tests => 32); 
    33 
    44BEGIN 
     
    5151    ); 
    5252 
     53    $valve->fill(); 
     54    ok( ! $valve->try_push(), "this try should fail" ); 
     55} 
     56 
     57{ 
     58    my $valve = Data::Valve->new( 
     59        max_items => 5, 
     60        interval  => 3 
     61    ); 
     62 
    5363    # 5 items should succeed 
    5464    for( 1.. 5) { 
  • lang/perl/Data-Valve/trunk/t/03_memcached.t

    r16078 r16080  
    3030        $ENV{MEMCACHED_NAMESPACE} ||= join('-', rand(), {}, $$); 
    3131 
    32         plan(tests => 29); 
     32        plan(tests => 30); 
    3333    } 
    3434 
     
    115115        } 
    116116    ); 
     117    $valve->fill(); 
     118 
     119    ok( ! $valve->try_push(), "this try should fail" ); 
     120} 
     121 
     122{ 
     123    my $valve = Data::Valve->new( 
     124        max_items => 5, 
     125        interval => 3, 
     126        bucket_store => { 
     127            module => "Memcached", 
     128            args   => { 
     129                store => { 
     130                    args => { 
     131                        servers => [ $ENV{MEMCACHED_SERVER} ], 
     132                        namespace => $ENV{MEMCACHED_NAMESPACE}, 
     133                    } 
     134                } 
     135            } 
     136        } 
     137    ); 
     138    $valve->reset(); 
    117139 
    118140    # 5 items should succeed