update undo key to include the block hash

This commit is contained in:
Jack Robison 2022-01-06 12:36:33 -05:00
parent 358fa21eaf
commit d3da442727
No known key found for this signature in database
GPG key ID: DF25C68FE0239BB2
2 changed files with 16 additions and 12 deletions

View file

@ -341,7 +341,7 @@ class BlockProcessor:
def flush(): def flush():
self.db.write_db_state() self.db.write_db_state()
if save_undo: if save_undo:
self.db.prefix_db.commit(self.height) self.db.prefix_db.commit(self.height, self.tip)
else: else:
self.db.prefix_db.unsafe_commit() self.db.prefix_db.unsafe_commit()
self.clear_after_advance_or_reorg() self.clear_after_advance_or_reorg()
@ -1559,7 +1559,7 @@ class BlockProcessor:
self.db.last_flush_tx_count = self.db.fs_tx_count self.db.last_flush_tx_count = self.db.fs_tx_count
def rollback(): def rollback():
self.db.prefix_db.rollback(self.height + 1) self.db.prefix_db.rollback(self.height + 1, reverted_block_hash)
self.db.es_sync_height = self.height self.db.es_sync_height = self.height
self.db.write_db_state() self.db.write_db_state()
self.db.prefix_db.unsafe_commit() self.db.prefix_db.unsafe_commit()

View file

@ -1104,24 +1104,28 @@ class RepostedPrefixRow(PrefixRow):
return cls.pack_key(reposted_claim_hash, tx_num, position), cls.pack_value(claim_hash) return cls.pack_key(reposted_claim_hash, tx_num, position), cls.pack_value(claim_hash)
class UndoKey(NamedTuple):
height: int
block_hash: bytes
class UndoPrefixRow(PrefixRow): class UndoPrefixRow(PrefixRow):
prefix = DB_PREFIXES.undo.value prefix = DB_PREFIXES.undo.value
key_struct = struct.Struct(b'>Q') key_struct = struct.Struct(b'>Q32s')
key_part_lambdas = [ key_part_lambdas = [
lambda: b'', lambda: b'',
struct.Struct(b'>Q').pack struct.Struct(b'>Q').pack,
struct.Struct(b'>Q32s').pack
] ]
@classmethod @classmethod
def pack_key(cls, height: int): def pack_key(cls, height: int, block_hash: bytes):
return super().pack_key(height) return super().pack_key(height, block_hash)
@classmethod @classmethod
def unpack_key(cls, key: bytes) -> int: def unpack_key(cls, key: bytes) -> UndoKey:
assert key[:1] == cls.prefix return UndoKey(*super().unpack_key(key))
height, = cls.key_struct.unpack(key[1:])
return height
@classmethod @classmethod
def pack_value(cls, undo_ops: bytes) -> bytes: def pack_value(cls, undo_ops: bytes) -> bytes:
@ -1132,8 +1136,8 @@ class UndoPrefixRow(PrefixRow):
return data return data
@classmethod @classmethod
def pack_item(cls, height: int, undo_ops: bytes): def pack_item(cls, height: int, block_hash: bytes, undo_ops: bytes):
return cls.pack_key(height), cls.pack_value(undo_ops) return cls.pack_key(height, block_hash), cls.pack_value(undo_ops)
class BlockHashPrefixRow(PrefixRow): class BlockHashPrefixRow(PrefixRow):