[CalendarServer-changes] [3979] CalendarServer/branches/users/wsanchez/mo-cache/memcache.py

source_changes at macosforge.org source_changes at macosforge.org
Sat Apr 11 11:00:02 PDT 2009


Revision: 3979
          http://trac.macosforge.org/projects/calendarserver/changeset/3979
Author:   wsanchez at apple.com
Date:     2009-04-11 11:00:02 -0700 (Sat, 11 Apr 2009)
Log Message:
-----------
Add gets_multi, NotFoundError.

Modified Paths:
--------------
    CalendarServer/branches/users/wsanchez/mo-cache/memcache.py

Modified: CalendarServer/branches/users/wsanchez/mo-cache/memcache.py
===================================================================
--- CalendarServer/branches/users/wsanchez/mo-cache/memcache.py	2009-04-11 17:54:43 UTC (rev 3978)
+++ CalendarServer/branches/users/wsanchez/mo-cache/memcache.py	2009-04-11 18:00:02 UTC (rev 3979)
@@ -90,6 +90,11 @@
     Memcache connection error
     """
 
+class NotFoundError(MemcacheError):
+    """
+    NOT_FOUND error
+    """
+
 try:
     # Only exists in Python 2.4+
     from threading import local
@@ -681,20 +686,21 @@
         if not server:
             return 0
 
-        if token:
-            cmd = "cas"
         self._statlog(cmd)
 
         store_info = self._val_to_store_info(val, min_compress_len)
         if not store_info: return(0)
 
         if token:
-            fullcmd = "cas %s %d %d %d %d\r\n%s" % (key, store_info[0], time, store_info[1], token, store_info[2])
+            fullcmd = "cas %s %d %d %d %s\r\n%s" % (key, store_info[0], time, store_info[1], token, store_info[2])
         else:
             fullcmd = "%s %s %d %d %d\r\n%s" % (cmd, key, store_info[0], time, store_info[1], store_info[2])
         try:
             server.send_cmd(fullcmd)
-            return (server.expect("STORED") == "STORED")
+            result = server.expect("STORED")
+            if (result == "NOT_FOUND"):
+                raise NotFoundError(key)
+            return (result == "STORED")
 
         except socket.error, msg:
             if type(msg) is types.TupleType: msg = msg[1]
@@ -736,7 +742,7 @@
         if not server:
             raise MemcacheError("Memcache connection error")
 
-        self._statlog('gets')
+        self._statlog('get')
 
         try:
             server.send_cmd("gets %s" % key)
@@ -823,6 +829,46 @@
                 server.mark_dead(msg)
         return retvals
 
+    def gets_multi(self, keys, key_prefix=''):
+        '''
+        Retrieves multiple keys from the memcache doing just one query.
+        See also L{gets} and L{get_multi}.
+        '''
+
+        self._statlog('gets_multi')
+
+        server_keys, prefixed_to_orig_key = self._map_and_prefix_keys(keys, key_prefix)
+
+        # send out all requests on each server before reading anything
+        dead_servers = []
+        for server in server_keys.iterkeys():
+            try:
+                server.send_cmd("gets %s" % " ".join(server_keys[server]))
+            except socket.error, msg:
+                if type(msg) is types.TupleType: msg = msg[1]
+                server.mark_dead(msg)
+                dead_servers.append(server)
+
+        # if any servers died on the way, don't expect them to respond.
+        for server in dead_servers:
+            del server_keys[server]
+
+        retvals = {}
+        for server in server_keys.iterkeys():
+            try:
+                line = server.readline()
+                while line and line != 'END':
+                    rkey, flags, rlen, cas_token = self._expectvalue_cas(server, line)
+                    #  Bo Yang reports that this can sometimes be None
+                    if rkey is not None:
+                        val = self._recv_value(server, flags, rlen)
+                        retvals[prefixed_to_orig_key[rkey]] = (val, cas_token)   # un-prefix returned key.
+                    line = server.readline()
+            except (_Error, socket.error), msg:
+                if type(msg) is types.TupleType: msg = msg[1]
+                server.mark_dead(msg)
+        return retvals
+
     def _expectvalue(self, server, line=None):
         if not line:
             line = server.readline()
@@ -840,10 +886,9 @@
             line = server.readline()
 
         if line[:5] == 'VALUE':
-            resp, rkey, flags, len, token = line.split()
+            resp, rkey, flags, len, rtoken = line.split()
             flags = int(flags)
             rlen = int(len)
-            rtoken = int(token)
             return (rkey, flags, rlen, rtoken)
         else:
             return (None, None, None, None)
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090411/bb930cee/attachment.html>


More information about the calendarserver-changes mailing list