[CalendarServer-changes] [3237] CalendarServer/trunk/twistedcaldav
source_changes at macosforge.org
source_changes at macosforge.org
Mon Oct 27 13:00:31 PDT 2008
Revision: 3237
http://trac.macosforge.org/projects/calendarserver/changeset/3237
Author: cdaboo at apple.com
Date: 2008-10-27 13:00:31 -0700 (Mon, 27 Oct 2008)
Log Message:
-----------
Properly handle a zero timeout value.
Modified Paths:
--------------
CalendarServer/trunk/twistedcaldav/memcachelock.py
CalendarServer/trunk/twistedcaldav/test/test_memcachelock.py
Modified: CalendarServer/trunk/twistedcaldav/memcachelock.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/memcachelock.py 2008-10-27 18:17:17 UTC (rev 3236)
+++ CalendarServer/trunk/twistedcaldav/memcachelock.py 2008-10-27 20:00:31 UTC (rev 3237)
@@ -61,9 +61,9 @@
assert not self._hasLock, "Lock already acquired."
- start_time = time.time()
+ timeout_at = time.time() + self._timeout
waiting = False
- while time.time() < start_time + self._timeout:
+ while True:
result = (yield self.add(self._locktoken, "1", self._expire_time))
if result:
@@ -72,16 +72,17 @@
self.log_debug("Got lock after waiting on %s" % (self._locktoken,))
break
- waiting = True
- self.log_debug("Waiting for lock on %s" % (self._locktoken,))
- pause = Deferred()
- def _timedDeferred():
- pause.callback(True)
- reactor.callLater(self._retry_interval, _timedDeferred)
- yield pause
- else:
- self.log_debug("Timed out lock after waiting on %s" % (self._locktoken,))
- raise MemcacheLockTimeoutError()
+ if self._timeout and time.time() < timeout_at:
+ waiting = True
+ self.log_debug("Waiting for lock on %s" % (self._locktoken,))
+ pause = Deferred()
+ def _timedDeferred():
+ pause.callback(True)
+ reactor.callLater(self._retry_interval, _timedDeferred)
+ yield pause
+ else:
+ self.log_debug("Timed out lock after waiting on %s" % (self._locktoken,))
+ raise MemcacheLockTimeoutError()
returnValue(True)
Modified: CalendarServer/trunk/twistedcaldav/test/test_memcachelock.py
===================================================================
--- CalendarServer/trunk/twistedcaldav/test/test_memcachelock.py 2008-10-27 18:17:17 UTC (rev 3236)
+++ CalendarServer/trunk/twistedcaldav/test/test_memcachelock.py 2008-10-27 20:00:31 UTC (rev 3237)
@@ -6,12 +6,12 @@
"""
from twistedcaldav.memcache import MemCacheProtocol
+from twistedcaldav.memcachelock import MemcacheLock, MemcacheLockTimeoutError
from twisted.trial.unittest import TestCase
from twisted.test.proto_helpers import StringTransportWithDisconnection
from twisted.internet.task import Clock
from twisted.internet.defer import inlineCallbacks
-from twistedcaldav.memcachelock import MemcacheLock
class MemCacheTestCase(TestCase):
@@ -125,6 +125,29 @@
self.assertTrue(lock._hasLock)
@inlineCallbacks
+ def test_acquire_fails_timeout_0(self):
+ """
+ L{MemCacheProtocol.get} should return a L{Deferred} which is
+ called back with the value and the flag associated with the given key
+ if the server returns a successful result.
+ """
+ lock = MemCacheTestCase.FakedMemcacheLock(self.proto, "lock", "locking", timeout=0)
+ try:
+ yield self._test(
+ lock.acquire(),
+ "add lock:locking 0 0 1\r\n1\r\n",
+ "NOT_STORED\r\n",
+ True
+ )
+ except MemcacheLockTimeoutError:
+ pass
+ except Exception, e:
+ self.fail("Unknown exception thrown: %s" % (e,))
+ else:
+ self.fail("No timeout exception thrown")
+ self.assertFalse(lock._hasLock)
+
+ @inlineCallbacks
def test_acquire_release(self):
"""
L{MemCacheProtocol.get} should return a L{Deferred} which is
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/calendarserver-changes/attachments/20081027/f4395101/attachment-0001.html>
More information about the calendarserver-changes
mailing list