[CalendarServer-changes] [4143] CalendarServer/trunk

source_changes at macosforge.org source_changes at macosforge.org
Sat May 2 13:33:07 PDT 2009


Revision: 4143
          http://trac.macosforge.org/projects/calendarserver/changeset/4143
Author:   sagen at apple.com
Date:     2009-05-02 13:33:07 -0700 (Sat, 02 May 2009)
Log Message:
-----------
memcacheclient.set(token=) now raises TokenMismatchError if the value has been modified since we last got it

Modified Paths:
--------------
    CalendarServer/trunk/memcacheclient.py
    CalendarServer/trunk/twistedcaldav/memcacheprops.py

Modified: CalendarServer/trunk/memcacheclient.py
===================================================================
--- CalendarServer/trunk/memcacheclient.py	2009-05-02 19:03:39 UTC (rev 4142)
+++ CalendarServer/trunk/memcacheclient.py	2009-05-02 20:33:07 UTC (rev 4143)
@@ -50,7 +50,11 @@
 import re
 import types
 from twistedcaldav.config import config
+from twistedcaldav.log import Logger
 
+log = Logger()
+
+
 try:
     import cPickle as pickle
 except ImportError:
@@ -97,6 +101,11 @@
     NOT_FOUND error
     """
 
+class TokenMismatchError(MemcacheError):
+    """
+    Check-and-set token mismatch
+    """
+
 try:
     # Only exists in Python 2.4+
     from threading import local
@@ -311,6 +320,7 @@
                 #print "(using server %s)" % server,
                 return server, key
             serverhash = serverHashFunction(str(serverhash) + str(i))
+        log.error("Memcacheclient _get_server( ) failed to connect")
         return None, None
 
     def disconnect_all(self):
@@ -714,16 +724,29 @@
         if not store_info: return(0)
 
         if token is not None:
+            cmd = "cas"
             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)
             result = server.expect("STORED")
+
+            if (result == "STORED"):
+                return True
+
             if (result == "NOT_FOUND"):
                 raise NotFoundError(key)
-            return (result == "STORED")
 
+            if token and result == "EXISTS":
+                log.error("Memcacheclient check-and-set failed")
+                raise TokenMismatchError(key)
+
+            log.error("Memcacheclient %s command failed with result (%s)" %
+                (cmd, result))
+
+            return False
+
         except socket.error, msg:
             if type(msg) is types.TupleType: msg = msg[1]
             server.mark_dead(msg)
@@ -1152,12 +1175,14 @@
         return 0
 
     def mark_dead(self, reason):
+        log.error("Memcacheclient socket marked dead (%s)" % (reason,))
         self.debuglog("MemCache: %s: %s.  Marking dead." % (self, reason))
         self.deaduntil = time.time() + _Host._DEAD_RETRY
         self.close_socket()
 
     def _get_socket(self):
         if self._check_dead():
+            log.error("Memcacheclient _get_socket() found dead socket")
             return None
         if self.socket:
             return self.socket
@@ -1166,10 +1191,14 @@
         try:
             s.connect(self.address)
         except socket.timeout, msg:
+            log.error("Memcacheclient _get_socket() connection timed out (%s)" %
+                (msg,))
             self.mark_dead("connect: %s" % msg)
             return None
         except socket.error, msg:
             if type(msg) is types.TupleType: msg = msg[1]
+            log.error("Memcacheclient _get_socket() connection error (%s)" %
+                (msg,))
             self.mark_dead("connect: %s" % msg[1])
             return None
         self.socket = s

Modified: CalendarServer/trunk/twistedcaldav/memcacheprops.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/memcacheprops.py	2009-05-02 19:03:39 UTC (rev 4142)
+++ CalendarServer/trunk/twistedcaldav/memcacheprops.py	2009-05-02 20:33:07 UTC (rev 4143)
@@ -32,7 +32,7 @@
 except ImportError:
     from md5 import new as md5
 
-from memcacheclient import ClientFactory as MemcacheClientFactory, MemcacheError
+from memcacheclient import ClientFactory as MemcacheClientFactory, MemcacheError, TokenMismatchError
 
 from twisted.python.filepath import FilePath
 from twisted.web2 import responsecode
@@ -209,7 +209,13 @@
 
         client = self.memcacheClient()
         if client is not None:
-            result = client.set(key, childCache, time=self.cacheTimeout, token=token)
+            try:
+                result = client.set(key, childCache, time=self.cacheTimeout, token=token)
+            except TokenMismatchError:
+                # The value in memcache has changed since we last fetched it,
+                log.error("memcacheprops setProperty( ) TokenMismatchError")
+                result = False
+
             if not result:
                 delattr(self, "_propertyCache")
                 raise MemcacheError("Unable to set property %s on %s"
@@ -239,7 +245,13 @@
 
         client = self.memcacheClient()
         if client is not None:
-            result = client.set(key, childCache, time=self.cacheTimeout, token=token)
+            try:
+                result = client.set(key, childCache, time=self.cacheTimeout, token=token)
+            except TokenMismatchError:
+                # The value in memcache has changed since we last fetched it
+                log.error("memcacheprops deleteProperty( ) TokenMismatchError")
+                result = False
+
             if not result:
                 delattr(self, "_propertyCache")
                 raise MemcacheError("Unable to delete property {%s}%s on %s"
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20090502/61d9cb8c/attachment-0001.html>


More information about the calendarserver-changes mailing list