summaryrefslogtreecommitdiffstats
path: root/share/common
diff options
context:
space:
mode:
Diffstat (limited to 'share/common')
-rw-r--r--share/common/msapi/helper.py26
1 files changed, 22 insertions, 4 deletions
diff --git a/share/common/msapi/helper.py b/share/common/msapi/helper.py
index 48626cc9..bb07b097 100644
--- a/share/common/msapi/helper.py
+++ b/share/common/msapi/helper.py
@@ -187,7 +187,7 @@ class MultiCloudThreadHelper(object):
self.backlog = {}
# expired backlog items
self.expired_backlog = {}
- # self.lock = threading.Lock()
+ self.lock = threading.Lock()
self.state_ = 0 # 0: stopped, 1: started
self.thread = None
@@ -195,12 +195,14 @@ class MultiCloudThreadHelper(object):
return self.state_
def start(self):
+ self.lock.acquire()
if 0 == self.state_:
self.state_ = 1
self.thread = MultiCloudThreadHelper.HelperThread(self)
self.thread.start()
else:
pass
+ self.lock.release()
def stop(self):
self.state_ = 0
@@ -215,6 +217,8 @@ class MultiCloudThreadHelper(object):
backlog_item["timestamp"] = 0
# self.lock.acquire()
+ # make sure there is no identical backlog in expired backlog
+ self.expired_backlog.pop(backlog_item["id"], None)
self.backlog.update(backlog_item["id"], backlog_item)
# self.lock.release()
return len(self.backlog)
@@ -222,6 +226,13 @@ class MultiCloudThreadHelper(object):
def get(self, backlog_id):
self.backlog.get(backlog_id, None) or self.expired_backlog.get(backlog_id, None)
+ # check if the backlog item is in expired backlog
+ def expired(self, backlog_id):
+ if not self.backlog.get(backlog_id, None):
+ if self.expired_backlog.get(backlog_id, None):
+ return True
+ return False
+
def remove(self, backlog_id):
# self.lock.acquire()
self.backlog.pop(backlog_id, None)
@@ -246,18 +257,25 @@ class MultiCloudThreadHelper(object):
def run(self):
logger.debug("Start processing backlogs")
+ nexttimer = 0
while self.owner.state_ == 1 and self.owner.count() > 0:
+ if nexttimer > 1000000:
+ # sleep in case of interval > 1 second
+ time.sleep(nexttimer // 1000000)
+ nexttimer = 30*1000000 # initial interval in us to be updated:30 seconds
for backlog_id, item in self.owner.backlog:
# check interval for repeatable backlog item
now = MultiCloudThreadHelper.get_epoch_now_usecond()
repeat_interval = item.get("repeat", 0)
if repeat_interval > 0:
timestamp = item.get("timestamp", 0)
+ timeleft = (now - timestamp
+ if now > timestamp
+ else repeat_interval)
+ nexttimer = timeleft if nexttimer > timeleft else nexttimer
# compare interval with elapsed time.
# workaround the case of timestamp turnaround
- if repeat_interval > (now - timestamp
- if now > timestamp
- else repeat_interval):
+ if repeat_interval > timeleft:
# not time to run this backlog item yet
continue