Skip to content
Snippets Groups Projects
Commit eb3cee29 authored by Martin Juhás's avatar Martin Juhás
Browse files

Merge branch '218-handle-exception-in-loop-thread' into 'main'

Resolve "Handle exception in loop thread"

Closes #218

See merge request inject/backend!220
parents 8d570113 393a7302
No related branches found
No related tags found
No related merge requests found
...@@ -32,48 +32,71 @@ class LoopThread(Thread): ...@@ -32,48 +32,71 @@ class LoopThread(Thread):
self.__finished.set() self.__finished.set()
def run(self): def run(self):
SubscriptionHandler.broadcast_exercise_loop(self.updater.exercise, True) try:
self.updater.update(self.elapsed_s) SubscriptionHandler.broadcast_exercise_loop(
SubscriptionHandler.broadcast_exercises( self.updater.exercise, True
self.updater.exercise, ExerciseEventTypeEnum.modify()
)
wait_time: float = self.__interval_s
while (
self.elapsed_s <= self.__total_time_s
and not self.__finished.wait(wait_time)
):
update_time = self.updater.update(self.elapsed_s)
wait_time = (
self.__interval_s - update_time
if update_time < self.__interval_s
else 0
) )
# this is necessary to prevent infinite length loops with 0 interval self.updater.update(self.elapsed_s)
# I wouldn't expect this during any real deployment, however it might SubscriptionHandler.broadcast_exercises(
# be useful during testing for max speed update times self.updater.exercise, ExerciseEventTypeEnum.modify()
if self.__interval_s == 0:
self.elapsed_s += 1
else:
self.elapsed_s += self.__interval_s
logger.info(
f"update loop for exercise id: {self.updater.exercise.id} elapsed time: {self.elapsed_s}s"
) )
wait_time: float = self.__interval_s
while (
self.elapsed_s <= self.__total_time_s
and not self.__finished.wait(wait_time)
):
update_time = self.updater.update(self.elapsed_s)
wait_time = (
self.__interval_s - update_time
if update_time < self.__interval_s
else 0
)
# this is necessary to prevent infinite length loops with 0 interval
# I wouldn't expect this during any real deployment, however it might
# be useful during testing for max speed update times
if self.__interval_s == 0:
self.elapsed_s += 1
else:
self.elapsed_s += self.__interval_s
logger.info(
f"update loop for exercise id: {self.updater.exercise.id} elapsed time: {self.elapsed_s}s"
)
SubscriptionHandler.broadcast_exercise_loop( SubscriptionHandler.broadcast_exercise_loop(
self.updater.exercise, False self.updater.exercise, False
) )
self.__finished.set() self.__finished.set()
if self.elapsed_s >= self.__total_time_s: if self.elapsed_s >= self.__total_time_s:
self.updater.finish() self.updater.finish()
logger.info( logger.info(
f"finishing exercise loop for exercise id: {self.updater.exercise.id}" f"finishing exercise loop for exercise id: {self.updater.exercise.id}"
)
else:
self.updater.stop(self.elapsed_s)
SubscriptionHandler.broadcast_exercises(
self.updater.exercise, ExerciseEventTypeEnum.modify()
)
except Exception as ex:
logger.error(
f"loop thread exception {type(ex).__name__}: {str(ex)}"
) )
else: for i in range(10):
self.updater.stop(self.elapsed_s) try:
SubscriptionHandler.broadcast_exercises( self.updater.stop(self.elapsed_s - self.__interval_s)
self.updater.exercise, ExerciseEventTypeEnum.modify() except:
) logger.error(
f"failed to stop exercise: {self.updater.exercise.id}"
)
else:
logger.info(
f"stopped exercise: {self.updater.exercise.id} on the {i}th try"
)
break
else:
logger.error(
f"failed to stop exercise: {self.updater.exercise.id} 10 times, still running"
)
def remaining_time_s(self) -> int: def remaining_time_s(self) -> int:
return self.__total_time_s - self.elapsed_s return self.__total_time_s - self.elapsed_s
...@@ -100,6 +100,9 @@ DATABASES = { ...@@ -100,6 +100,9 @@ DATABASES = {
"default": { "default": {
"ENGINE": "django.db.backends.sqlite3", "ENGINE": "django.db.backends.sqlite3",
"NAME": os.path.join(BASE_DIR, DATA_STORAGE, "db.sqlite3"), "NAME": os.path.join(BASE_DIR, DATA_STORAGE, "db.sqlite3"),
"OPTIONS": {
"timeout": 20,
},
} }
} }
......
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