From cb6c2e691efda754b90a9e319e36101f4079b2f8 Mon Sep 17 00:00:00 2001 From: David Stainton Date: Thu, 29 Oct 2015 12:16:35 +0100 Subject: [PATCH] Detect remote conflict by checking for pending upload --- src/allmydata/frontends/magic_folder.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) 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,)) -- 2.45.2