Skip to content

Commit b7b5cd5

Browse files
committed
Close files when CachingFileManager is garbage collected
Fixes GH2560 This frees users from needing to worry about this.
1 parent 483b8a0 commit b7b5cd5

File tree

3 files changed

+19
-3
lines changed

3 files changed

+19
-3
lines changed

xarray/backends/file_manager.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,10 @@ def close(self, needs_lock=True):
164164
else:
165165
self._close()
166166

167+
def __del__(self):
168+
# remove files from the cache when garbage collection happens
169+
self.close()
170+
167171
def __getstate__(self):
168172
"""State for pickling."""
169173
lock = None if self._default_lock else self._lock

xarray/backends/h5netcdf_.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,9 +228,6 @@ def prepare_variable(self, name, variable, check_encoding=False,
228228

229229
def sync(self):
230230
self.ds.sync()
231-
# if self.autoclose:
232-
# self.close()
233-
# super(H5NetCDFStore, self).sync(compute=compute)
234231

235232
def close(self, **kwargs):
236233
self._manager.close(**kwargs)

xarray/tests/test_backends_file_manager.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import gc
12
import pickle
23
import threading
34
try:
@@ -38,6 +39,20 @@ def test_file_manager_mock_write(file_cache):
3839
lock.__enter__.assert_has_calls([mock.call(), mock.call()])
3940

4041

42+
def test_file_manager_autoclose(cache):
43+
mock_file = mock.Mock()
44+
opener = mock.Mock(spec=open, return_value=mock_file)
45+
cache = {}
46+
47+
manager = CachingFileManager(opener, 'filename', cache=cache)
48+
manager.acquire()
49+
del manager
50+
gc.collect()
51+
52+
assert not cache
53+
mock_file.close.assert_called_once_with()
54+
55+
4156
def test_file_manager_write_consecutive(tmpdir, file_cache):
4257
path1 = str(tmpdir.join('testing1.txt'))
4358
path2 = str(tmpdir.join('testing2.txt'))

0 commit comments

Comments
 (0)