From: David Stainton <dstainton415@gmail.com>
Date: Tue, 21 Apr 2015 04:48:16 +0000 (+0100)
Subject: Fix race condition in upload deque
X-Git-Url: https://git.rkrishnan.org/components/%22news.html/frontends/...?a=commitdiff_plain;h=2c4ccc5879795089adcb0db89a1b218cff8b5d0f;p=tahoe-lafs%2Ftahoe-lafs.git

Fix race condition in upload deque
---

diff --git a/src/allmydata/frontends/drop_upload.py b/src/allmydata/frontends/drop_upload.py
index f4666f50..b915b978 100644
--- a/src/allmydata/frontends/drop_upload.py
+++ b/src/allmydata/frontends/drop_upload.py
@@ -40,6 +40,7 @@ class DropUploader(service.MultiService):
 
         self._objid = None
         self._classname = 'DropUploader'
+        self._upload_lazy_tail = None
         self._pending = set()
         self._client = client
         self._stats_provider = client.stats_provider
@@ -163,7 +164,6 @@ class DropUploader(service.MultiService):
         self._turn_deque()
 
     def _append_to_deque(self, path):
-        print "_append_to_deque"
         self._upload_deque.append(path)
         self._pending.add(path)
         self._stats_provider.count('drop_upload.objects_queued', 1)
@@ -175,9 +175,13 @@ class DropUploader(service.MultiService):
             path = self._upload_deque.pop()
         except IndexError:
             self._log("magic folder upload deque is now empty")
+            self._upload_lazy_tail = None
             return
-        d = task.deferLater(reactor, 0, self._process, path)
-        d.addCallback(lambda ign: self._turn_deque())
+        if self._upload_lazy_tail is not None:
+            self._upload_lazy_tail.addCallback(lambda ign: task.deferLater(reactor, 0, self._process, path))
+        else:
+            self._upload_lazy_tail = task.deferLater(reactor, 0, self._process, path)
+        self._upload_lazy_tail.addCallback(lambda ign: self._turn_deque())
 
     def _notify(self, opaque, path, events_mask):
         self._log("inotify event %r, %r, %r\n" % (opaque, path, ', '.join(self._inotify.humanReadableMask(events_mask))))