Changeset 681

Show
Ignore:
Timestamp:
12/13/07 09:09:41 (1 year ago)
Author:
hachi
Message:

CAS testing

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/binary/server/t/binary.t

    r680 r681  
    2626# Flags, expiration 
    2727use constant SET_PKT_FMT => "NN"; 
    28 # flags, expiration, id 
    29 # CAS_PKT_FMT=">IiQ" 
    30 
     28 
     29# Flags, expiration, id 
     30use constant CAS_PKT_FMT => "NNNN"; 
     31 
    3132# How long until the deletion takes effect. 
    3233use constant DEL_PKT_FMT => "N"; 
    33 
     34 
    3435# amount, initial value, expiration 
    3536use constant INCRDECR_PKT_FMT => "NNNNN"; 
     
    3940 
    4041use constant PKT_FMT => "CCCxNN"; 
     42 
    4143#min recv packet size 
    4244use constant MIN_RECV_PACKET => length(pack(PKT_FMT)); 
     
    6163        is($rv, 0, "Didn't get a result from get"); 
    6264        ok($@->not_found, "We got a not found error when we expected one"); 
    63  
    6465}; 
    6566 
     
    7071}; 
    7172 
    72 $mc->flush if 0
     73$mc->flush
    7374 
    7475{ 
     
    142143} 
    143144 
     145{ 
     146        diag "MultiGet"; 
     147        $mc->add('xx', 5, 1, "ex"); 
     148        $mc->add('wye', 5, 2, "why"); 
     149        my $rv = $mc->getMulti(qw(xx wye zed)); 
     150 
     151        is_deeply([1, 'ex'], $rv->{xx}, "X is correct"); 
     152        is_deeply([2, 'why'], $rv->{wye}, "Y is correct"); 
     153        is(keys(%$rv), 2, "Got only two answers like we expect"); 
     154} 
     155 
    144156<<EOT; 
    145     def testMultiGet(self): 
    146         """Testing multiget functionality""" 
    147         self.mc.add("x", 5, 1, "ex") 
    148         self.mc.add("y", 5, 2, "why") 
    149         vals=self.mc.getMulti('xyz') 
    150         self.assertEquals((1, 'ex'), vals['x']) 
    151         self.assertEquals((2, 'why'), vals['y']) 
    152         self.assertEquals(2, len(vals)) 
    153  
    154157    def testIncrDoesntExistNoCreate(self): 
    155158        """Testing incr when a value doesn't exist (and not creating).""" 
     
    179182        self.assertNotExists("x") 
    180183        self.assertEquals(19, self.mc.decr("x", init=19)) 
    181  
    182     def testCas(self): 
    183         """Test CAS operation.""" 
    184         try: 
    185             self.mc.cas("x", 5, 19, 0x7fffffffff, "bad value") 
    186             self.fail("Expected error CASing with no existing value") 
    187         except MemcachedError, e: 
    188             self.assertEquals(memcacheConstants.ERR_NOT_FOUND, e.status) 
    189         self.mc.add("x", 5, 19, "original value") 
    190         flags, i, val=self.mc.gets("x") 
    191         self.assertEquals("original value", val) 
    192         try: 
    193             self.mc.cas("x", 5, 19, i+1, "broken value") 
    194             self.fail("Expected error CASing with invalid id") 
    195         except MemcachedError, e: 
    196             self.assertEquals(memcacheConstants.ERR_EXISTS, e.status) 
    197         self.mc.cas("x", 5, 19, i, "new value") 
    198         newflags, newi, newval=self.mc.gets("x") 
    199         self.assertEquals("new value", newval) 
    200  
    201         # Test a CAS replay 
    202         try: 
    203             self.mc.cas("x", 5, 19, i, "crap value") 
    204             self.fail("Expected error CASing with invalid id") 
    205         except MemcachedError, e: 
    206             self.assertEquals(memcacheConstants.ERR_EXISTS, e.status) 
    207         newflags, newi, newval=self.mc.gets("x") 
    208         self.assertEquals("new value", newval) 
    209184EOT 
     185 
     186{ 
     187        diag "CAS"; 
     188        $mc->flush; 
     189         
     190        { 
     191                my $rv =()= eval { $mc->cas("x", 5, 19, 0x7FFFFFFFFF, "bad value") }; 
     192                is($rv, 0, "Empty return on expected failure"); 
     193                ok($@->not_found, "Error was 'not found' as expected"); 
     194        } 
     195 
     196        $mc->add("x", 5, 19, "original value"); 
     197 
     198        my ($flags, $i, $val) = $mc->gets("x"); 
     199        is($val, "original value", "->gets returned proper value"); 
     200         
     201        { 
     202                my $rv =()= eval { $mc->cas("x", 5, 19, $i+1, "broken value") }; 
     203                is($rv, 0, "Empty return on expected failure (1)"); 
     204                ok($@->exists, "Expected error state of 'exists' (1)"); 
     205        } 
     206 
     207        $mc->cas("x", 5, 19, $i, "new value"); 
     208 
     209        my ($newflags, $newi, $newval) = $mc->gets("x"); 
     210        is($newval, "new value", "CAS properly overwrote value"); 
     211 
     212        { 
     213                my $rv =()= eval { $mc->cas("x", 5, 19, $i, "replay value") }; 
     214                is($rv, 0, "Empty return on expected failure (2)"); 
     215                ok($@->exists, "Expected error state of 'exists' (2)"); 
     216        } 
     217 
     218        (undef, undef, my $newval2) = $mc->gets("x"); 
     219        is($newval2, "new value", "CAS replay didn't overwrite value"); 
     220} 
    210221 
    211222$mc->flush; 
     
    378389} 
    379390 
     391sub getMulti { 
     392        my $self = shift; 
     393        my @keys = @_; 
     394 
     395        for (my $i = 0; $i < @keys; $i++) { 
     396                $self->_sendCmd(::CMD_GETQ, $keys[$i], '', $i); 
     397        } 
     398 
     399        my $terminal = @keys + 10; 
     400        $self->_sendCmd(::CMD_NOOP, '', '', $terminal); 
     401 
     402        my %return; 
     403 
     404        while (1) { 
     405                my ($opaque, $data) = $self->_handleSingleResponse; 
     406                last if $opaque == $terminal; 
     407 
     408                $return{$keys[$opaque]} = [$self->__parseGet($data)]; 
     409        } 
     410        return %return if wantarray; 
     411        return \%return; 
     412} 
     413 
    380414sub gets { 
    381415        my $self = shift; 
     
    384418        my $data = $self->_doCmd(::CMD_GETS, $key, ''); 
    385419        my $header = substr $data, 0, 12, ''; 
    386         my ($flags, $ident_hi, $ident_lo) = unpack "NNN", $data
     420        my ($flags, $ident_hi, $ident_lo) = unpack "NNN", $header
    387421        my $ident = ($ident_hi * 2 ** 32) + $ident_lo; 
    388422 
     
    390424} 
    391425 
    392 <<EOT; 
    393     def cas(self, key, exp, flags, oldVal, val): 
    394         """CAS in a new value for the given key and comparison value.""" 
    395         self._doCmd(memcacheConstants.CMD_CAS, key, val, 
    396             struct.pack(CAS_PKT_FMT, flags, exp, oldVal)) 
    397  
    398     def getMulti(self, keys): 
    399         """Get values for any available keys in the given iterable. 
    400  
    401         Returns a dict of matched keys to their values.""" 
    402         opaqued=dict(enumerate(keys)) 
    403         terminal=len(opaqued)+10 
    404         # Send all of the keys in quiet 
    405         for k,v in opaqued.iteritems(): 
    406             self._sendCmd(memcacheConstants.CMD_GETQ, v, '', k) 
    407  
    408         self._sendCmd(memcacheConstants.CMD_NOOP, '', '', terminal) 
    409  
    410         # Handle the response 
    411         rv={} 
    412         done=False 
    413         while not done: 
    414             opaque, data=self._handleSingleResponse(None) 
    415             if opaque != terminal: 
    416                 rv[opaqued[opaque]]=self.__parseGet(data) 
    417             else: 
    418                 done=True 
    419  
    420         return rv 
    421  
    422 EOT 
     426sub cas { 
     427        my $self = shift; 
     428        my ($key, $exp, $flags, $oldVal, $val) = @_; 
     429 
     430        my $oldVal_hi = int($oldVal / 2 ** 32); 
     431        my $oldVal_lo = int($oldVal % 2 ** 32); 
     432 
     433        return $self->_doCmd(::CMD_CAS, $key, $val, pack(::CAS_PKT_FMT, $flags, $exp, $oldVal_hi, $oldVal_lo)); 
     434
    423435 
    424436sub noop { 
     
    480492        return $self->[0] == ERR_EXISTS; 
    481493} 
     494 
     495# vim: filetype=perl