Skip to content
Snippets Groups Projects
Commit 72b07356 authored by David Trattnig's avatar David Trattnig
Browse files

Handling for existing but dead commands. #55

parent 1e9f5390
No related branches found
No related tags found
No related merge requests found
Pipeline #894 passed
...@@ -225,18 +225,21 @@ class EngineExecutor(Timer): ...@@ -225,18 +225,21 @@ class EngineExecutor(Timer):
self.dt = datetime.now() + timedelta(seconds=diff) self.dt = datetime.now() + timedelta(seconds=diff)
self.func = func self.func = func
self.param = param self.param = param
self.update_store()
is_stored = self.update_store()
if diff < 0: if not is_stored:
msg = f"Timer '{self.timer_id}' is due in the past. Executing immediately ..." self.logger.info(SU.red("Timer '{self.timer_id}' omitted because it's already existing but dead"))
self.logger.error(SU.red(msg))
self.exec_now()
elif diff == 0:
self.logger.info(f"Timer '{self.timer_id}' to be executed immediately")
self.exec_now()
else: else:
self.exec_timed() if diff < 0:
self.start() msg = f"Timer '{self.timer_id}' is due in the past. Executing immediately ..."
self.logger.error(SU.red(msg))
self.exec_now()
elif diff == 0:
self.logger.info(f"Timer '{self.timer_id}' to be executed immediately")
self.exec_now()
else:
self.exec_timed()
self.start()
def wait_for_parent(self): def wait_for_parent(self):
...@@ -273,18 +276,34 @@ class EngineExecutor(Timer): ...@@ -273,18 +276,34 @@ class EngineExecutor(Timer):
def update_store(self): def update_store(self):
""" """
Adds the instance to the store and cancels any previously existing commands. Adds the instance to the store and cancels any previously existing commands.
If a timer with the given ID is already existing but also already executed,
then it is not added to the store. In such case the method returns `False`.
Returns:
(Boolean): True if the timer has been added to the store
""" """
existing_command = None existing_command = None
if self.timer_id in EngineExecutor.timer_store: if self.timer_id in EngineExecutor.timer_store:
existing_command = EngineExecutor.timer_store[self.timer_id] existing_command = EngineExecutor.timer_store[self.timer_id]
if existing_command: if existing_command:
self.logger.debug(f"Cancelling previous timer with ID: {self.timer_id}")
existing_command.cancel() # Check if existing timer has been executed already -> don't update
if existing_command.child_timer: if not existing_command.is_alive():
self.logger.debug(f"Cancelling child timer with ID: {existing_command.child_timer.timer_id}") self.logger.debug(f"Existing previous timer with ID: {self.timer_id}. Don't update.")
return False
# Still waiting for execution -> update
else:
self.logger.debug(f"Cancelling previous timer with ID: {self.timer_id}")
existing_command.cancel()
if existing_command.child_timer:
self.logger.debug(f"Cancelling child timer with ID: {existing_command.child_timer.timer_id}")
EngineExecutor.timer_store[self.timer_id] = self EngineExecutor.timer_store[self.timer_id] = self
self.logger.debug(f"Created command timer with ID: {self.timer_id}") self.logger.debug(f"Created command timer with ID: {self.timer_id}")
return True
def is_alive(self): def is_alive(self):
...@@ -306,13 +325,13 @@ class EngineExecutor(Timer): ...@@ -306,13 +325,13 @@ class EngineExecutor(Timer):
@staticmethod @staticmethod
def remove_stale_timers(): def remove_stale_timers():
""" """
Removes timers from store which have been executed and are older than one hour. Removes timers from store which have been executed and are older than 5 hours.
""" """
timers = EngineExecutor.timer_store.values() timers = EngineExecutor.timer_store.values()
del_keys = [] del_keys = []
for timer in timers: for timer in timers:
if timer.dt < datetime.now() - timedelta(seconds=3600): if timer.dt < datetime.now() - timedelta(hours=5):
if not timer.child_timer or (timer.child_timer and not timer.child_timer.is_alive()): if not timer.child_timer or (timer.child_timer and not timer.child_timer.is_alive()):
timer.logger.debug(f"Removing already executed timer with ID: {timer.timer_id}") timer.logger.debug(f"Removing already executed timer with ID: {timer.timer_id}")
del_keys.append(timer.timer_id) del_keys.append(timer.timer_id)
...@@ -327,16 +346,22 @@ class EngineExecutor(Timer): ...@@ -327,16 +346,22 @@ class EngineExecutor(Timer):
Prints a list of active timers and inactive timer not older than one hour. Prints a list of active timers and inactive timer not older than one hour.
""" """
timers = EngineExecutor.timer_store.values() timers = EngineExecutor.timer_store.values()
msg = "\n [ ENGINE COMMAND QUEUE ]\n" msg = SU.blue("\n [ ENGINE COMMAND QUEUE ]\n")
EngineExecutor.remove_stale_timers() EngineExecutor.remove_stale_timers()
if not timers: if not timers:
msg += "None available!\n" msg += "\nNone available!\n"
else: else:
for timer in timers: for timer in timers:
if not timer.parent_timer: if not timer.parent_timer:
msg += f" => {str(timer)}\n" line = f" => {str(timer)}\n"#
if timer.is_alive():
line = SU.green(line)
msg += line
if timer.child_timer: if timer.child_timer:
msg += f" => {str(timer.child_timer)}\n" line = f" => {str(timer.child_timer)}\n"
if timer.child_timer.is_alive():
line = SU.green(line)
msg += line
EngineExecutor.logger.info(msg + "\n") EngineExecutor.logger.info(msg + "\n")
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment