From aa17ee94145d781d72ab8352aa39f0a0149e76cb Mon Sep 17 00:00:00 2001 From: Guillaume Fieni Date: Wed, 5 Aug 2026 14:55:45 +0200 Subject: [PATCH 1/2] fix(processor/openstack): Handle monitor agent stop events correctly --- src/powerapi/processor/pre/openstack/monitor_agent.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/powerapi/processor/pre/openstack/monitor_agent.py b/src/powerapi/processor/pre/openstack/monitor_agent.py index fdebe392..07dd09d4 100644 --- a/src/powerapi/processor/pre/openstack/monitor_agent.py +++ b/src/powerapi/processor/pre/openstack/monitor_agent.py @@ -31,7 +31,6 @@ from dataclasses import dataclass from multiprocessing import Process, Event from signal import signal, SIGINT, SIGTERM -from time import sleep from openstack.compute.v2.server import Server from openstack.connection import Connection @@ -88,7 +87,7 @@ def _setup_signal_handlers(self): Setup signal handlers for the current Process. """ def stop_monitor(_, __): - self._stop_monitoring = True + self._stop_monitoring.set() sys.exit(0) signal(SIGTERM, stop_monitor) @@ -104,11 +103,12 @@ def run(self): # Prevents orphaned entries that no longer exist in the OpenStack API. self.metadata_cache_manager.clear_metadata_cache() - while not self._stop_monitoring: + while not self._stop_monitoring.is_set(): for server in self.fetch_servers_metadata(openstack_api): self.metadata_cache_manager.update_server_metadata(server) - sleep(self.config.polling_interval) + if self._stop_monitoring.wait(self.config.polling_interval): + break @staticmethod def build_metadata_cache_entry_from_server(server: Server) -> ServerMetadata: From 64d0e49fd9ea2dc3120f5b7beffb9f8a8c40a40e Mon Sep 17 00:00:00 2001 From: Guillaume Fieni Date: Wed, 5 Aug 2026 14:59:58 +0200 Subject: [PATCH 2/2] fix(processor/k8s): Interrupt monitor agent polling on shutdown --- src/powerapi/processor/pre/k8s/monitor_agent.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/powerapi/processor/pre/k8s/monitor_agent.py b/src/powerapi/processor/pre/k8s/monitor_agent.py index 940d5029..53fd4f3d 100644 --- a/src/powerapi/processor/pre/k8s/monitor_agent.py +++ b/src/powerapi/processor/pre/k8s/monitor_agent.py @@ -32,7 +32,6 @@ from dataclasses import dataclass from multiprocessing import Process, Event from signal import signal, SIGTERM, SIGINT -from time import sleep from kubernetes import client, config, watch from kubernetes.client import V1Pod, V1PodList, V1ContainerStatus @@ -158,7 +157,9 @@ def run(self): while not self._stop_monitoring.is_set(): resource_id = self.fetch_list_all_pod_for_all_namespaces(api_client) self.watch_list_pod_for_all_namespaces(api_client, resource_id) - sleep(K8S_MONITOR_RETRY_DELAY_SECONDS) + + if self._stop_monitoring.wait(K8S_MONITOR_RETRY_DELAY_SECONDS): + break @staticmethod def get_containers_id_name_from_statuses(container_statuses: list[V1ContainerStatus]) -> dict[str, str]: