faster RevertableOpStack.apply_packed_undo_ops
This commit is contained in:
parent
7bc90c425f
commit
c0766f6abc
2 changed files with 16 additions and 3 deletions
|
@ -273,6 +273,7 @@ class BasePrefixDB:
|
||||||
undo_c_f = self.column_families[DB_PREFIXES.undo.value]
|
undo_c_f = self.column_families[DB_PREFIXES.undo.value]
|
||||||
undo_info = self._db.get((undo_c_f, undo_key))
|
undo_info = self._db.get((undo_c_f, undo_key))
|
||||||
self._op_stack.apply_packed_undo_ops(undo_info)
|
self._op_stack.apply_packed_undo_ops(undo_info)
|
||||||
|
self._op_stack.validate_and_apply_stashed_ops()
|
||||||
try:
|
try:
|
||||||
with self._db.write_batch(sync=True) as batch:
|
with self._db.write_batch(sync=True) as batch:
|
||||||
batch_put = batch.put
|
batch_put = batch.put
|
||||||
|
|
|
@ -324,9 +324,21 @@ class RevertableOpStack:
|
||||||
"""
|
"""
|
||||||
Unpack and apply a sequence of undo ops from serialized undo bytes
|
Unpack and apply a sequence of undo ops from serialized undo bytes
|
||||||
"""
|
"""
|
||||||
while packed:
|
offset = 0
|
||||||
op, packed = RevertableOp.unpack(packed)
|
packed_size = len(packed)
|
||||||
self.append_op(op)
|
while offset < packed_size:
|
||||||
|
is_put, key_len, val_len = _OP_STRUCT.unpack(packed[offset:offset + 9])
|
||||||
|
offset += 9
|
||||||
|
key = packed[offset:offset + key_len]
|
||||||
|
offset += key_len
|
||||||
|
value = packed[offset:offset + val_len]
|
||||||
|
offset += val_len
|
||||||
|
if is_put == 1:
|
||||||
|
op = RevertablePut(key, value)
|
||||||
|
else:
|
||||||
|
op = RevertableDelete(key, value)
|
||||||
|
self._stash.append(op)
|
||||||
|
self._stashed_last_op_for_key[op.key] = op
|
||||||
|
|
||||||
def get_pending_op(self, key: bytes) -> Optional[RevertableOp]:
|
def get_pending_op(self, key: bytes) -> Optional[RevertableOp]:
|
||||||
if key in self._stashed_last_op_for_key:
|
if key in self._stashed_last_op_for_key:
|
||||||
|
|
Loading…
Reference in a new issue