Merged PR 394: Fix 'too many open files'
## Summary Add a method to PCAP to clear file handlers. Invoke this method while resetting environment. ## Test process no longer crashes on windows when i run too many episodes ## Checklist - [x] PR is linked to a **work item** - [x] **acceptance criteria** of linked ticket are met - [x] performed **self-review** of the code - [n] written **tests** for any new functionality added with this PR - [n] updated the **documentation** if this PR changes or adds functionality - [n] written/updated **design docs** if this PR implements new functionality - [n] updated the **change log** - [x] ran **pre-commit** checks for code style - [x] attended to any **TO-DOs** left in the code Related work items: #2588, #2626
This commit is contained in:
@@ -11,6 +11,7 @@ from primaite.game.game import PrimaiteGame
|
|||||||
from primaite.session.episode_schedule import build_scheduler, EpisodeScheduler
|
from primaite.session.episode_schedule import build_scheduler, EpisodeScheduler
|
||||||
from primaite.session.io import PrimaiteIO
|
from primaite.session.io import PrimaiteIO
|
||||||
from primaite.simulator import SIM_OUTPUT
|
from primaite.simulator import SIM_OUTPUT
|
||||||
|
from primaite.simulator.system.core.packet_capture import PacketCapture
|
||||||
|
|
||||||
_LOGGER = getLogger(__name__)
|
_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()}
|
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.io.write_agent_actions(agent_actions=all_agent_actions, episode=self.episode_counter)
|
||||||
self.episode_counter += 1
|
self.episode_counter += 1
|
||||||
|
PacketCapture.clear()
|
||||||
self.game: PrimaiteGame = PrimaiteGame.from_config(cfg=self.episode_scheduler(self.episode_counter))
|
self.game: PrimaiteGame = PrimaiteGame.from_config(cfg=self.episode_scheduler(self.episode_counter))
|
||||||
self.game.setup_for_episode(episode=self.episode_counter)
|
self.game.setup_for_episode(episode=self.episode_counter)
|
||||||
state = self.game.get_sim_state()
|
state = self.game.get_sim_state()
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ from primaite.session.environment import _LOGGER, PrimaiteGymEnv
|
|||||||
from primaite.session.episode_schedule import build_scheduler, EpisodeScheduler
|
from primaite.session.episode_schedule import build_scheduler, EpisodeScheduler
|
||||||
from primaite.session.io import PrimaiteIO
|
from primaite.session.io import PrimaiteIO
|
||||||
from primaite.simulator import SIM_OUTPUT
|
from primaite.simulator import SIM_OUTPUT
|
||||||
|
from primaite.simulator.system.core.packet_capture import PacketCapture
|
||||||
|
|
||||||
|
|
||||||
class PrimaiteRayMARLEnv(MultiAgentEnv):
|
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.io.write_agent_actions(agent_actions=all_agent_actions, episode=self.episode_counter)
|
||||||
|
|
||||||
self.episode_counter += 1
|
self.episode_counter += 1
|
||||||
|
PacketCapture.clear()
|
||||||
self.game: PrimaiteGame = PrimaiteGame.from_config(self.episode_scheduler(self.episode_counter))
|
self.game: PrimaiteGame = PrimaiteGame.from_config(self.episode_scheduler(self.episode_counter))
|
||||||
self.game.setup_for_episode(episode=self.episode_counter)
|
self.game.setup_for_episode(episode=self.episode_counter)
|
||||||
state = self.game.get_sim_state()
|
state = self.game.get_sim_state()
|
||||||
|
|||||||
@@ -21,6 +21,8 @@ class PacketCapture:
|
|||||||
The PCAPs are logged to: <simulation output directory>/<hostname>/<hostname>_<ip address>_pcap.log
|
The PCAPs are logged to: <simulation output directory>/<hostname>/<hostname>_<ip address>_pcap.log
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
_logger_instances: List[logging.Logger] = []
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
hostname: str,
|
hostname: str,
|
||||||
@@ -65,10 +67,12 @@ class PacketCapture:
|
|||||||
|
|
||||||
if outbound:
|
if outbound:
|
||||||
self.outbound_logger = logging.getLogger(self._get_logger_name(outbound))
|
self.outbound_logger = logging.getLogger(self._get_logger_name(outbound))
|
||||||
|
PacketCapture._logger_instances.append(self.outbound_logger)
|
||||||
logger = self.outbound_logger
|
logger = self.outbound_logger
|
||||||
else:
|
else:
|
||||||
self.inbound_logger = logging.getLogger(self._get_logger_name(outbound))
|
self.inbound_logger = logging.getLogger(self._get_logger_name(outbound))
|
||||||
logger = self.inbound_logger
|
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.setLevel(60) # Custom log level > CRITICAL to prevent any unwanted standard DEBUG-CRITICAL logs
|
||||||
logger.addHandler(file_handler)
|
logger.addHandler(file_handler)
|
||||||
@@ -122,3 +126,13 @@ class PacketCapture:
|
|||||||
if SIM_OUTPUT.save_pcap_logs:
|
if SIM_OUTPUT.save_pcap_logs:
|
||||||
msg = frame.model_dump_json()
|
msg = frame.model_dump_json()
|
||||||
self.outbound_logger.log(level=60, msg=msg) # Log at custom log level > CRITICAL
|
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 = []
|
||||||
|
|||||||
Reference in New Issue
Block a user