From f8336d07bdfcc276d165541716d258bdf0670e21 Mon Sep 17 00:00:00 2001 From: Marek Wolan Date: Fri, 31 May 2024 13:28:56 +0100 Subject: [PATCH] #2626 fix too many open files bug --- src/primaite/session/environment.py | 2 ++ src/primaite/session/ray_envs.py | 2 ++ .../simulator/system/core/packet_capture.py | 14 ++++++++++++++ 3 files changed, 18 insertions(+) diff --git a/src/primaite/session/environment.py b/src/primaite/session/environment.py index edb8a476..6bcadab6 100644 --- a/src/primaite/session/environment.py +++ b/src/primaite/session/environment.py @@ -11,6 +11,7 @@ from primaite.game.game import PrimaiteGame from primaite.session.episode_schedule import build_scheduler, EpisodeScheduler from primaite.session.io import PrimaiteIO from primaite.simulator import SIM_OUTPUT +from primaite.simulator.system.core.packet_capture import PacketCapture _LOGGER = getLogger(__name__) @@ -92,6 +93,7 @@ class PrimaiteGymEnv(gymnasium.Env): all_agent_actions = {name: agent.action_history for name, agent in self.game.agents.items()} self.io.write_agent_actions(agent_actions=all_agent_actions, episode=self.episode_counter) self.episode_counter += 1 + PacketCapture.clear() self.game: PrimaiteGame = PrimaiteGame.from_config(cfg=self.episode_scheduler(self.episode_counter)) self.game.setup_for_episode(episode=self.episode_counter) state = self.game.get_sim_state() diff --git a/src/primaite/session/ray_envs.py b/src/primaite/session/ray_envs.py index 5149a225..f4691155 100644 --- a/src/primaite/session/ray_envs.py +++ b/src/primaite/session/ray_envs.py @@ -11,6 +11,7 @@ from primaite.session.environment import _LOGGER, PrimaiteGymEnv from primaite.session.episode_schedule import build_scheduler, EpisodeScheduler from primaite.session.io import PrimaiteIO from primaite.simulator import SIM_OUTPUT +from primaite.simulator.system.core.packet_capture import PacketCapture class PrimaiteRayMARLEnv(MultiAgentEnv): @@ -63,6 +64,7 @@ class PrimaiteRayMARLEnv(MultiAgentEnv): self.io.write_agent_actions(agent_actions=all_agent_actions, episode=self.episode_counter) self.episode_counter += 1 + PacketCapture.clear() self.game: PrimaiteGame = PrimaiteGame.from_config(self.episode_scheduler(self.episode_counter)) self.game.setup_for_episode(episode=self.episode_counter) state = self.game.get_sim_state() diff --git a/src/primaite/simulator/system/core/packet_capture.py b/src/primaite/simulator/system/core/packet_capture.py index cf38e94b..bc8a0584 100644 --- a/src/primaite/simulator/system/core/packet_capture.py +++ b/src/primaite/simulator/system/core/packet_capture.py @@ -21,6 +21,8 @@ class PacketCapture: The PCAPs are logged to: //__pcap.log """ + _logger_instances: List[logging.Logger] = [] + def __init__( self, hostname: str, @@ -65,10 +67,12 @@ class PacketCapture: if outbound: self.outbound_logger = logging.getLogger(self._get_logger_name(outbound)) + PacketCapture._logger_instances.append(self.outbound_logger) logger = self.outbound_logger else: self.inbound_logger = logging.getLogger(self._get_logger_name(outbound)) logger = self.inbound_logger + PacketCapture._logger_instances.append(self.inbound_logger) logger.setLevel(60) # Custom log level > CRITICAL to prevent any unwanted standard DEBUG-CRITICAL logs logger.addHandler(file_handler) @@ -122,3 +126,13 @@ class PacketCapture: if SIM_OUTPUT.save_pcap_logs: msg = frame.model_dump_json() self.outbound_logger.log(level=60, msg=msg) # Log at custom log level > CRITICAL + + @staticmethod + def clear(): + """Close all open PCAP file handlers.""" + for logger in PacketCapture._logger_instances: + handlers = logger.handlers[:] + for handler in handlers: + logger.removeHandler(handler) + handler.close() + PacketCapture._logger_instances = []