diff --git a/README.md b/README.md index 874b59a8a3d3704bd3b34f15fa8f7374e880bdad..69efa1c0815fa9578db03b70ecfeb94935ba59c6 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ So no variable encoding for you! ## v0.2 -* _TBA_ +* added `get_open_series` ## v0.1 diff --git a/docs/conf.py b/docs/conf.py index ed098b54bd0299a63ff73cb023719d54a0d89263..3c743542406a49224d48a78a1c2bc950269fa845 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -16,11 +16,13 @@ # -- Project information ----------------------------------------------------- +import pkg_resources project = 'tempsdb' copyright = '2020, Piotr MaĹlanka' author = 'Piotr MaĹlanka' +release = pkg_resources.require("tempsdb")[0].version # -- General configuration --------------------------------------------------- diff --git a/setup.py b/setup.py index 5675e035b8323a37d94e60842123d14c15aee7bc..3fa4d7d5cd14d044b166c87867ac3524ea818181 100644 --- a/setup.py +++ b/setup.py @@ -21,7 +21,7 @@ def find_pyx(*path) -> tp.List[str]: # setup(name='tempsdb', - version='0.2_a1', + version='0.2_a2', packages=['tempsdb'], install_requires=['satella>=2.14.21', 'ujson'], ext_modules=build([Multibuild('tempsdb', find_pyx('tempsdb')), ], diff --git a/tempsdb/database.pxd b/tempsdb/database.pxd index cfe5710b8a07839ee38ec04985833f88b5f826ee..b837ae6577133aba159eaab6736e3378dbd14ef0 100644 --- a/tempsdb/database.pxd +++ b/tempsdb/database.pxd @@ -14,6 +14,7 @@ cdef class Database: cpdef TimeSeries create_series(self, str name, int block_size, unsigned long entries_per_chunk, int page_size=*) + cpdef list get_open_series(self) cpdef Database create_database(str path) diff --git a/tempsdb/database.pyx b/tempsdb/database.pyx index bf83cd5099a2c0d164b5dcf292604a44763738eb..96a294e3d2be663224ea3209736016064f501ff1 100644 --- a/tempsdb/database.pyx +++ b/tempsdb/database.pyx @@ -1,6 +1,8 @@ import os import threading +from satella.coding import DictDeleter + from tempsdb.exceptions import DoesNotExist, AlreadyExists from .series cimport TimeSeries, create_series @@ -20,6 +22,28 @@ cdef class Database: self.lock = threading.Lock() self.mpm = None + cpdef list get_open_series(self): + """ + Return all open series + + .. versionadded:: 0.2 + + :return: open series + :rtype: tp.List[TimeSeries] + """ + cdef: + list output = [] + TimeSeries series + str name + with self.lock: + with DictDeleter(self.open_series) as dd: + for name, series in dd.items(): + if series.closed: + dd.delete() + else: + output.append(series) + return series + cpdef TimeSeries get_series(self, name: str): """ Load and return an existing series @@ -92,8 +116,7 @@ cdef class Database: self.mpm = mpm cdef TimeSeries series for series in self.open_series.values(): - if not series.closed: - series.register_memory_pressure_manager(mpm) + series.register_memory_pressure_manager(mpm) # no-op if already closed return 0 def __del__(self): @@ -106,8 +129,10 @@ cdef class Database: if self.closed: return 0 cdef TimeSeries series - for series in self.open_series.values(): - series.close() + with self.lock: + for series in self.open_series.values(): + series.close() # because already closed series won't close themselves + self.open_series = {} self.closed = True return 0 diff --git a/tempsdb/series.pyx b/tempsdb/series.pyx index 41a9bb7a55416b7383c856b062e19c598fcda7d5..038cb1aa8ed023d793b33565da11448e7e358760 100644 --- a/tempsdb/series.pyx +++ b/tempsdb/series.pyx @@ -276,8 +276,12 @@ cdef class TimeSeries: Register a memory pressure manager. This registers :meth:`~tempsdb.series.TimeSeries.close_chunks` as remaining in severity - to be called each 30 minutes. + to be called each 30 seconds. + + No op if already closed """ + if self.closed: + return self.mpm = mpm.register_on_remaining_in_severity(1, 30)(self.close_chunks) cpdef int close_chunks(self) except -1: