From ede6421e6d2e318457753c474751dc1c5e5dc55c Mon Sep 17 00:00:00 2001
From: Giorgos Korfiatis <gkorf@grnet.gr>
Date: Thu, 7 May 2015 18:27:13 +0300
Subject: [PATCH] probe all in single transaction BUT check probe_candidates on
 retry

---
 agkyra/agkyra/syncer/localfs_client.py |  5 ++---
 agkyra/agkyra/syncer/pithos_client.py  |  7 +++----
 agkyra/agkyra/syncer/syncer.py         | 12 ++++++++----
 3 files changed, 13 insertions(+), 11 deletions(-)

diff --git a/agkyra/agkyra/syncer/localfs_client.py b/agkyra/agkyra/syncer/localfs_client.py
index 76d676f..731ae74 100644
--- a/agkyra/agkyra/syncer/localfs_client.py
+++ b/agkyra/agkyra/syncer/localfs_client.py
@@ -532,7 +532,7 @@ class LocalfsFileClient(FileClient):
         final_part = parts[-1]
         return exclude_pattern.match(final_part)
 
-    def start_probing_file(self, objname, old_state, ref_state, callback=None):
+    def probe_file(self, objname, old_state, ref_state):
         with self.probe_candidates.lock() as d:
             cached_info = d.pop(objname, None)
         if self.exclude_file(objname):
@@ -545,8 +545,7 @@ class LocalfsFileClient(FileClient):
         if live_info is None:
             return
         live_state = old_state.set(info=live_info)
-        if callback is not None:
-            callback(live_state)
+        return live_state
 
     def stage_file(self, source_state):
         return LocalfsSourceHandle(self.settings, source_state)
diff --git a/agkyra/agkyra/syncer/pithos_client.py b/agkyra/agkyra/syncer/pithos_client.py
index 14818de..0080bb5 100644
--- a/agkyra/agkyra/syncer/pithos_client.py
+++ b/agkyra/agkyra/syncer/pithos_client.py
@@ -340,7 +340,7 @@ class PithosFileClient(FileClient):
                 PITHOS_TYPE: p_type,
                 }
 
-    def start_probing_file(self, objname, old_state, ref_state, callback=None):
+    def probe_file(self, objname, old_state, ref_state):
         info = old_state.info
         with self.probe_candidates.lock() as d:
             cached_info = d.pop(objname, None)
@@ -354,9 +354,8 @@ class PithosFileClient(FileClient):
         else:
             live_info = cached_info
         if info != live_info:
-            if callback is not None:
-                live_state = old_state.set(info=live_info)
-                callback(live_state)
+            live_state = old_state.set(info=live_info)
+            return live_state
 
     def stage_file(self, source_state):
         return PithosSourceHandle(self.settings, source_state)
diff --git a/agkyra/agkyra/syncer/syncer.py b/agkyra/agkyra/syncer/syncer.py
index ab0c830..0d8999c 100644
--- a/agkyra/agkyra/syncer/syncer.py
+++ b/agkyra/agkyra/syncer/syncer.py
@@ -97,6 +97,9 @@ class FileSyncer(object):
 
     @transaction()
     def probe_file(self, archive, objname):
+        return self._probe_file(archive, objname)
+
+    def _probe_file(self, archive, objname):
         logger.info("Probing archive: %s, object: '%s'" % (archive, objname))
         db = self.get_db()
         client = self.clients[archive]
@@ -114,10 +117,10 @@ class FileSyncer(object):
             logger.warning("Serial mismatch in probing archive: %s, "
                            "object: '%s'" % (archive, objname))
             return
-        client.start_probing_file(objname, db_state, ref_state,
-                                  callback=self.update_file_state)
+        live_state = client.probe_file(objname, db_state, ref_state)
+        if live_state is not None:
+            self.update_file_state(live_state)
 
-    @transaction()
     def update_file_state(self, live_state):
         db = self.get_db()
         archive = live_state.archive
@@ -345,11 +348,12 @@ class FileSyncer(object):
         return set(db.list_deciding(archives=archives,
                                     sync=self.SYNC))
 
+    @transaction()
     def probe_archive(self, archive, forced=False):
         client = self.clients[archive]
         candidates = client.list_candidate_files(forced=forced)
         for objname in candidates:
-            self.probe_file(archive, objname)
+            self._probe_file(archive, objname)
 
     def decide_archive(self, archive):
         for objname in self.list_deciding([archive]):
-- 
GitLab