[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