diff --git a/frigate/test/test_shared_memory_frame_manager.py b/frigate/test/test_shared_memory_frame_manager.py index 908ca9f3c0..786fc0563d 100644 --- a/frigate/test/test_shared_memory_frame_manager.py +++ b/frigate/test/test_shared_memory_frame_manager.py @@ -289,10 +289,17 @@ class TestSharedMemoryFrameManagerFrameTimes(unittest.TestCase): manager.shm_store.update( _segments(cam_frame0=1, cam_frame1=1, cam_frame_times=8, other_frame0=1) ) + # a camera named cam_frame shares the cam_frame prefix + manager.shm_store.update( + {"cam_frame_frame0": _fake_shm(1), "cam_frame_frame_times": _fake_shm(8)} + ) manager.close_camera("cam") - self.assertEqual(set(manager.shm_store), {"other_frame0"}) + self.assertEqual( + set(manager.shm_store), + {"other_frame0", "cam_frame_frame0", "cam_frame_frame_times"}, + ) def test_get_without_frame_time_skips_ledger(self) -> None: manager = SharedMemoryFrameManager() diff --git a/frigate/util/image.py b/frigate/util/image.py index 11173c36dc..f62ffed065 100644 --- a/frigate/util/image.py +++ b/frigate/util/image.py @@ -1171,8 +1171,11 @@ class SharedMemoryFrameManager(FrameManager): def close_camera(self, camera: str) -> None: """Drop every cached mapping for a camera's frame ring and ledger.""" - for name in [n for n in self.shm_store if n.startswith(f"{camera}_frame")]: - self.close(name) + for name in list(self.shm_store): + owner, _, suffix = name.rpartition("_frame") + + if owner == camera and (suffix.isdigit() or suffix == "_times"): + self.close(name) def delete(self, name: str): if name in self.shm_store: