Commit 72b07356 authored by David Trattnig's avatar David Trattnig
Browse files

Handling for existing but dead commands. #55

parent 1e9f5390
......@@ -225,18 +225,21 @@ class EngineExecutor(Timer):
self.dt = datetime.now() + timedelta(seconds=diff)
self.func = func
self.param = param
self.update_store()
if diff < 0:
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()
is_stored = self.update_store()
if not is_stored:
self.logger.info(SU.red("Timer '{self.timer_id}' omitted because it's already existing but dead"))
else:
self.exec_timed()
self.start()
if diff < 0:
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):
......@@ -273,18 +276,34 @@ class EngineExecutor(Timer):
def update_store(self):
"""
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
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:
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}")
# Check if existing timer has been executed already -> don't update
if not existing_command.is_alive():
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
self.logger.debug(f"Created command timer with ID: {self.timer_id}")
return True
def is_alive(self):
......@@ -306,13 +325,13 @@ class EngineExecutor(Timer):
@staticmethod
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()
del_keys = []
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()):
timer.logger.debug(f"Removing already executed timer with ID: {timer.timer_id}")
del_keys.append(timer.timer_id)
......@@ -327,16 +346,22 @@ class EngineExecutor(Timer):
Prints a list of active timers and inactive timer not older than one hour.
"""
timers = EngineExecutor.timer_store.values()
msg = "\n [ ENGINE COMMAND QUEUE ]\n"
msg = SU.blue("\n [ ENGINE COMMAND QUEUE ]\n")
EngineExecutor.remove_stale_timers()
if not timers:
msg += "None available!\n"
msg += "\nNone available!\n"
else:
for timer in timers:
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:
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")
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment