[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