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;
}