[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