diff --git a/docs/api/database.rst b/docs/api/database.rst index 93e5741ddc532040b970f039185b7538c9c727e1..17e48e4731e8f3a787aa7b5006ab8c78bda42baa 100644 --- a/docs/api/database.rst +++ b/docs/api/database.rst @@ -16,7 +16,7 @@ Database object Exception. - .. py:method:: put(key, value, sync=False, disable_wal=False) + .. py:method:: put(key, value, sync=False, disable_wal=False, ignore_missing_column_families=False, no_slowdown=False, low_pri=False) Set the database entry for "key" to "value". @@ -42,16 +42,35 @@ Database object If ``True``, writes will not first go to the write ahead log, and the write may got lost after a crash. - .. py:method:: delete(key, sync=False, disable_wal=False) + :param bool ignore_missing_column_families: + If ``True`` and if user is trying to write to column families that don't exist + (they were dropped), ignore the write (don't return an error). If there + are multiple writes in a WriteBatch, other writes will succeed. + + :param bool no_slowdown: + If ``True`` and we need to wait or sleep for the write request, fails + immediately with Status::Incomplete(). + + :param bool low_pri: + If ``True``, this write request is of lower priority if compaction is + behind. In this case, no_slowdown = true, the request will be cancelled + immediately with Status::Incomplete() returned. Otherwise, it will be + slowed down. The slowdown value is determined by RocksDB to guarantee + it introduces minimum impacts to high priority writes. + + .. py:method:: delete(key, sync=False, disable_wal=False, ignore_missing_column_families=False, no_slowdown=False, low_pri=False) Remove the database entry for "key". :param bytes key: Name to delete :param sync: See :py:meth:`rocksdb.DB.put` :param disable_wal: See :py:meth:`rocksdb.DB.put` + :param ignore_missing_column_families: See :py:meth:`rocksdb.DB.put` + :param no_slowdown: See :py:meth:`rocksdb.DB.put` + :param low_pri: See :py:meth:`rocksdb.DB.put` :raises rocksdb.errors.NotFound: If the key did not exists - .. py:method:: merge(key, value, sync=False, disable_wal=False) + .. py:method:: merge(key, value, sync=False, disable_wal=False, ignore_missing_column_families=False, no_slowdown=False, low_pri=False) Merge the database entry for "key" with "value". The semantics of this operation is determined by the user provided @@ -64,13 +83,16 @@ Database object no :py:attr:`rocksdb.Options.merge_operator` was set at creation - .. py:method:: write(batch, sync=False, disable_wal=False) + .. py:method:: write(batch, sync=False, disable_wal=False, ignore_missing_column_families=False, no_slowdown=False, low_pri=False) Apply the specified updates to the database. :param rocksdb.WriteBatch batch: Batch to apply :param sync: See :py:meth:`rocksdb.DB.put` :param disable_wal: See :py:meth:`rocksdb.DB.put` + :param ignore_missing_column_families: See :py:meth:`rocksdb.DB.put` + :param no_slowdown: See :py:meth:`rocksdb.DB.put` + :param low_pri: See :py:meth:`rocksdb.DB.put` .. py:method:: get(key, verify_checksums=False, fill_cache=True, snapshot=None, read_tier="all") diff --git a/rocksdb/_rocksdb.pyx b/rocksdb/_rocksdb.pyx index 4d8cf4103cf084eb1b894eb470f0aa4a9379f08b..996ae9c34a4665bd385a6fd8facdef1b288ef49a 100644 --- a/rocksdb/_rocksdb.pyx +++ b/rocksdb/_rocksdb.pyx @@ -1762,11 +1762,14 @@ cdef class DB(object): if handle.name == name: return handle.weakref - def put(self, key, value, sync=False, disable_wal=False): + def put(self, key, value, sync=False, disable_wal=False, ignore_missing_column_families=False, no_slowdown=False, low_pri=False): cdef Status st cdef options.WriteOptions opts opts.sync = sync opts.disableWAL = disable_wal + opts.ignore_missing_column_families = ignore_missing_column_families + opts.no_slowdown = no_slowdown + opts.low_pri = low_pri if isinstance(key, tuple): column_family, key = key @@ -1783,11 +1786,14 @@ cdef class DB(object): st = self.db.Put(opts, cf_handle, c_key, c_value) check_status(st) - def delete(self, key, sync=False, disable_wal=False): + def delete(self, key, sync=False, disable_wal=False, ignore_missing_column_families=False, no_slowdown=False, low_pri=False): cdef Status st cdef options.WriteOptions opts opts.sync = sync opts.disableWAL = disable_wal + opts.ignore_missing_column_families = ignore_missing_column_families + opts.no_slowdown = no_slowdown + opts.low_pri = low_pri if isinstance(key, tuple): column_family, key = key @@ -1803,11 +1809,14 @@ cdef class DB(object): st = self.db.Delete(opts, cf_handle, c_key) check_status(st) - def merge(self, key, value, sync=False, disable_wal=False): + def merge(self, key, value, sync=False, disable_wal=False, ignore_missing_column_families=False, no_slowdown=False, low_pri=False): cdef Status st cdef options.WriteOptions opts opts.sync = sync opts.disableWAL = disable_wal + opts.ignore_missing_column_families = ignore_missing_column_families + opts.no_slowdown = no_slowdown + opts.low_pri = low_pri if isinstance(key, tuple): column_family, key = key @@ -1824,11 +1833,14 @@ cdef class DB(object): st = self.db.Merge(opts, cf_handle, c_key, c_value) check_status(st) - def write(self, WriteBatch batch, sync=False, disable_wal=False): + def write(self, WriteBatch batch, sync=False, disable_wal=False, ignore_missing_column_families=False, no_slowdown=False, low_pri=False): cdef Status st cdef options.WriteOptions opts opts.sync = sync opts.disableWAL = disable_wal + opts.ignore_missing_column_families = ignore_missing_column_families + opts.no_slowdown = no_slowdown + opts.low_pri = low_pri with nogil: st = self.db.Write(opts, batch.batch) diff --git a/rocksdb/options.pxd b/rocksdb/options.pxd index 1c5a78816d6cd94c965faf23622ff0dc9efe3db2..6d8ca7acbc8fd736ae225cca5845c5b7f5772e0b 100644 --- a/rocksdb/options.pxd +++ b/rocksdb/options.pxd @@ -164,6 +164,9 @@ cdef extern from "rocksdb/options.h" namespace "rocksdb": cdef cppclass WriteOptions: cpp_bool sync cpp_bool disableWAL + cpp_bool ignore_missing_column_families + cpp_bool no_slowdown + cpp_bool low_pri cdef cppclass ReadOptions: cpp_bool verify_checksums diff --git a/rocksdb/tests/test_db.py b/rocksdb/tests/test_db.py index 5709dd3d956e1311f90c31b3d242488795c4035f..900f2784c1df14a746b03b68ac0dc6d791a985a6 100644 --- a/rocksdb/tests/test_db.py +++ b/rocksdb/tests/test_db.py @@ -274,6 +274,14 @@ class TestDB(TestHelper): self.db.compact_range() + def test_write_ignore_missing_column_families(self): + self.db.put(b"a", b"1", ignore_missing_column_families=True) + + def test_write_no_slowdown(self): + self.db.put(b"a", b"1", no_slowdown=True) + + def test_write_low_pri(self): + self.db.put(b"a", b"1", low_pri=True) class AssocCounter(rocksdb.interfaces.AssociativeMergeOperator): def merge(self, key, existing_value, value):