diff --git a/README.md b/README.md index b70034e1d9b27d8b01e73708744ecc9c8ecd1172..c6624eac6560f9f10d80fc5e7368cccefa362ed6 100644 --- a/README.md +++ b/README.md @@ -55,6 +55,7 @@ Then copy your resulting wheel and install it via pip on the target system. * added the context manager syntax to VarlenIterator * fixed a memory leak that happened during getting current value from an empty series +* added `MemoryPressureManager` support for `Database` ## v0.6.1 diff --git a/setup.cfg b/setup.cfg index 3e4aa7c5433a910ae72a0ab5e4a14f44da6c2622..3e4676bd3690e8ff241f3ef2d383e709d66b4443 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ # coding: utf-8 [metadata] name = tempsdb -version = 0.6.2a3 +version = 0.6.2a4 long-description = file: README.md long-description-content-type = text/markdown; charset=UTF-8 license_files = LICENSE diff --git a/tempsdb/database.pxd b/tempsdb/database.pxd index 03b94beec0d87881a84c6b748f8daac218a4e757..24594a7434590859cfc677ffa0e791b6202491ab 100644 --- a/tempsdb/database.pxd +++ b/tempsdb/database.pxd @@ -6,11 +6,12 @@ cdef class Database: readonly str path bint closed object lock - object mpm + object mpm, mpm_handler dict open_series dict open_varlen_series readonly dict metadata + cpdef int checkpoint(self) except -1 cpdef int reload_metadata(self) except -1 cpdef int set_metadata(self, dict meta) except -1 cpdef int close(self) except -1 diff --git a/tempsdb/database.pyx b/tempsdb/database.pyx index 8bd7c3b93831e6e690f98b8526bbf3f5db255de4..7391449cee939b9568e1151c402d973904f125c6 100644 --- a/tempsdb/database.pyx +++ b/tempsdb/database.pyx @@ -38,6 +38,7 @@ cdef class Database: self.open_varlen_series = {} self.lock = threading.RLock() self.mpm = None + self.mpm_handler = None self.metadata = {} self.reload_metadata() @@ -89,6 +90,24 @@ cdef class Database: output.append(v_series) return output + cpdef int checkpoint(self) except -1: + """ + Destroy closed series + """ + cdef: + TimeSeries series + VarlenSeries v_series + with self.lock: + with DictDeleter(self.open_series) as dd: + for series in dd.values(): + if series.closed: + dd.delete() + with DictDeleter(self.open_varlen_series) as dd: + for v_series in dd.values(): + if v_series.closed: + dd.delete() + return 0 + cpdef int delete_series(self, str name) except -1: """ Deletes a constant-length time series. @@ -353,6 +372,7 @@ cdef class Database: cdef TimeSeries series for series in self.open_series.values(): series.register_memory_pressure_manager(mpm) # no-op if already closed + self.mpm_handler = mpm.register_on_entered_severity(1)(self.checkpoint) return 0 def __del__(self): @@ -378,6 +398,9 @@ cdef class Database: var_series.close(True) self.open_varlen_series = {} self.closed = True + if self.mpm_handler is not None: + self.mpm_handler.cancel() + self.mpm_handler = None return 0