From 08628f0c288b4a580136a5a43c8b6c62d7a9072b Mon Sep 17 00:00:00 2001
From: Christopher Rhodes <christopher.rhodes@embl.de>
Date: Sun, 10 Nov 2024 08:22:14 +0100
Subject: [PATCH] Added unload method

---
 model_server/base/accessors.py |  4 ++++
 model_server/base/session.py   |  1 +
 tests/base/test_accessors.py   | 12 ++++++++++--
 3 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/model_server/base/accessors.py b/model_server/base/accessors.py
index 4175ef9c..1241548a 100644
--- a/model_server/base/accessors.py
+++ b/model_server/base/accessors.py
@@ -29,6 +29,10 @@ class GenericImageDataAccessor(ABC):
     def loaded(self):
         return self._data is not None
 
+    def unload(self):
+        self._data = None
+        self._metadata = None
+
     @property
     def chroma(self):
         return self.shape_dict['C']
diff --git a/model_server/base/session.py b/model_server/base/session.py
index 5f8c6611..c61d6a6e 100644
--- a/model_server/base/session.py
+++ b/model_server/base/session.py
@@ -186,6 +186,7 @@ class _Session(object):
         self.log_info(f'Deleted accessor {accessor_id}')
         return accessor_id
 
+    # TODO: call unload method on file-backed accessors
     def del_all_accessors(self) -> list[str]:
         """
         Remove (unload) all accessors but keep their info in dictionary
diff --git a/tests/base/test_accessors.py b/tests/base/test_accessors.py
index 2d9e9a6d..bef1506d 100644
--- a/tests/base/test_accessors.py
+++ b/tests/base/test_accessors.py
@@ -229,15 +229,23 @@ class TestCziImageFileAccess(unittest.TestCase):
         )
 
     def test_lazy_load(self):
+        # initialize an accessor with lazy flag
         acc_cf = generate_file_accessor(data['czifile']['path'], lazy=True)
-        self.assertEqual(acc_cf._data, None)
-        self.assertEqual(acc_cf._metadata, None)
+        self.assertIsNone(acc_cf._data)
+        self.assertIsNone(acc_cf._metadata)
+
+        # implicitly load by accessing its data property
         nda = acc_cf.data
         self.assertIsNotNone(acc_cf._data)
         self.assertIsNotNone(acc_cf._metadata)
         self.assertIsInstance(acc_cf._data, np.ndarray)
         self.assertIsInstance(acc_cf._metadata, dict)
 
+        # explicitly unload
+        acc_cf.unload()
+        self.assertIsNone(acc_cf._data)
+        self.assertIsNone(acc_cf._metadata)
+
 
 class TestPatchStackAccessor(unittest.TestCase):
     def setUp(self) -> None:
-- 
GitLab