Blob Blame History Raw
diff --git a/shell/src/dbck.py b/shell/src/dbck.py
index 796179a2..ed4ea70c 100644
--- a/shell/src/dbck.py
+++ b/shell/src/dbck.py
@@ -1285,7 +1285,7 @@ def fill_missing_checksum(executor, host, fs, checksumtype, timeout=900, updated
                             csumvalue = data.get('checksum', 'unknown')
                             break
                         time.sleep(sleep)
-                        sleep = min(sleep*4, 5)
+                        sleep = min(sleep*2, 5)
                     if csumvalue != '':
                         _log.debug("finished %s checksum calculation on %s:%s for %s (fileid %i, size %i): %s", checksumtype, host, fs, filename, fileid, size, csumvalue)
                         updated += 1
diff --git a/src/plugins/domeadapter/DomeAdapterDiskCatalog.cpp b/src/plugins/domeadapter/DomeAdapterDiskCatalog.cpp
index 5dad85d2..5a3790e1 100644
--- a/src/plugins/domeadapter/DomeAdapterDiskCatalog.cpp
+++ b/src/plugins/domeadapter/DomeAdapterDiskCatalog.cpp
@@ -50,7 +50,8 @@ void DomeAdapterDiskCatalog::getChecksum(const std::string& path,
   int waitsecs1 = waitsecs;
   if (waitsecs1 == 0) waitsecs1 = 1800;
 
-  int cnt = 0;
+  int sleep_ms = 250;
+  struct timespec tm;
   while(true) {
     DomeTalker talker(factory_->davixPool_, sec_, factory_->domehead_,
                       "GET", "dome_chksum");
@@ -69,10 +70,12 @@ void DomeAdapterDiskCatalog::getChecksum(const std::string& path,
     if(talker.status() == 202) {
       if(time(0) - start >= waitsecs1)
         throw DmException(EAGAIN, SSTR(waitsecs << "s were not sufficient to checksum '" << csumtype << ":" << path << "'. Try again later."));
-      if (cnt++ < 4)
-        sleep(1);
-      else
-        sleep(5);
+
+      // wait before next checksum status request and increase sleep time in steps up to 5s
+      tm.tv_sec = sleep_ms / 1000;
+      tm.tv_nsec = (sleep_ms % 1000) * 1000000;
+      nanosleep(&tm, NULL);
+      sleep_ms = std::min(sleep_ms * 2, 5000);
 
       continue;
     }
diff --git a/src/plugins/domeadapter/DomeAdapterHeadCatalog.cpp b/src/plugins/domeadapter/DomeAdapterHeadCatalog.cpp
index ce2947b5..9596e003 100644
--- a/src/plugins/domeadapter/DomeAdapterHeadCatalog.cpp
+++ b/src/plugins/domeadapter/DomeAdapterHeadCatalog.cpp
@@ -100,7 +100,8 @@ void DomeAdapterHeadCatalog::getChecksum(const std::string& path,
   int waitsecs1 = waitsecs;
   if (waitsecs1 == 0) waitsecs1 = 1800;
 
-  int cnt = 0;
+  int sleep_ms = 250;
+  struct timespec tm;
   while(true) {
     DomeCredentials dc(secCtx_);
     
@@ -122,15 +123,19 @@ void DomeAdapterHeadCatalog::getChecksum(const std::string& path,
     if(talker__->status() == 202) {
       if(time(0) - start >= waitsecs1)
         throw DmException(EAGAIN, SSTR(waitsecs << "s were not sufficient to checksum '" << csumtype << ":" << absPath(path) << "'. Try again later."));
-      if (cnt++ < 4)
-        sleep(1);
-      else {
+
+      if (sleep_ms >= 5000) {
         // Don't keep a talker allocated for potentially very long periods
         delete talker__;
         talker__ = 0;
-        
-        sleep(5);
       }
+
+      // wait before next checksum status request and increase sleep time in steps up to 5s
+      tm.tv_sec = sleep_ms / 1000;
+      tm.tv_nsec = (sleep_ms % 1000) * 1000000;
+      nanosleep(&tm, NULL);
+      sleep_ms = std::min(sleep_ms * 2, 5000);
+
       continue;
     }