From: David Stainton <dstainton415@gmail.com>
Date: Thu, 29 Oct 2015 11:16:35 +0000 (+0100)
Subject: Detect remote conflict by checking for pending upload
X-Git-Url: https://git.rkrishnan.org/specifications/%5B/status?a=commitdiff_plain;h=cb6c2e691efda754b90a9e319e36101f4079b2f8;p=tahoe-lafs%2Ftahoe-lafs.git

Detect remote conflict by checking for pending upload
---

diff --git a/src/allmydata/frontends/magic_folder.py b/src/allmydata/frontends/magic_folder.py
index a8b5e79f..8ef4e97a 100644
--- a/src/allmydata/frontends/magic_folder.py
+++ b/src/allmydata/frontends/magic_folder.py
@@ -62,7 +62,7 @@ class MagicFolder(service.MultiService):
         self.is_ready = False
 
         self.uploader = Uploader(client, local_path_u, db, upload_dircap, pending_delay, clock)
-        self.downloader = Downloader(client, local_path_u, db, collective_dircap, clock)
+        self.downloader = Downloader(client, local_path_u, db, collective_dircap, clock, self.uploader.is_pending)
 
     def startService(self):
         # TODO: why is this being called more than once?
@@ -271,6 +271,12 @@ class Uploader(QueueMixin):
 
         return d
 
+    def is_pending(relpath_u):
+        if relpath_u in self._pending:
+            return True
+        else:
+            return False
+
     def _notify(self, opaque, path, events_mask):
         self._log("inotify event %r, %r, %r\n" % (opaque, path, ', '.join(self._inotify.humanReadableMask(events_mask))))
 
@@ -495,9 +501,11 @@ class WriteFileMixin(object):
 class Downloader(QueueMixin, WriteFileMixin):
     REMOTE_SCAN_INTERVAL = 3  # facilitates tests
 
-    def __init__(self, client, local_path_u, db, collective_dircap, clock):
+    def __init__(self, client, local_path_u, db, collective_dircap, clock, is_upload_pending):
         QueueMixin.__init__(self, client, local_path_u, db, 'downloader', clock)
 
+        self._is_upload_pending = is_upload_pending
+
         # TODO: allow a path rather than a cap URI.
         self._collective_dirnode = self._client.create_node_from_uri(collective_dircap)
 
@@ -711,6 +719,12 @@ class Downloader(QueueMixin, WriteFileMixin):
                         if dmd_last_uploaded_uri != local_last_uploaded_uri:
                             is_conflict = True
                             self._count('objects_conflicted')
+                        else:
+                            # XXX todo: mark as conflict if file is in pending upload set
+                            if self._is_upload_pending(relpath_u):
+                                is_conflict = True
+                                self._count('objects_conflicted')
+
             if relpath_u.endswith(u"/"):
                 if metadata.get('deleted', False):
                     self._log("rmdir(%r) ignored" % (abspath_u,))