From b69005682c3a48f9ddf0f0c10e965ee65bdbf273 Mon Sep 17 00:00:00 2001 From: nolash Date: Mon, 22 Feb 2021 20:54:27 +0100 Subject: [PATCH] Correct flags on resume --- chainsyncer/backend.py | 10 ++++++++-- chainsyncer/db/models/filter.py | 13 ++++++------- tests/test_database.py | 25 +++++++++++++++---------- 3 files changed, 29 insertions(+), 19 deletions(-) diff --git a/chainsyncer/backend.py b/chainsyncer/backend.py index 4cfde9d..60d4597 100644 --- a/chainsyncer/backend.py +++ b/chainsyncer/backend.py @@ -95,6 +95,7 @@ class SyncerBackend: """ self.connect() pair = self.db_object.set(block_height, tx_height) + self.db_object_filter.clear() (filter_state, count, digest)= self.db_object_filter.cursor() self.disconnect() return (pair, filter_state,) @@ -204,8 +205,6 @@ class SyncerBackend: syncers.append(s) last_live_id = BlockchainSync.get_last(session=session) - logg.debug('last_live_id {}'.format(last_live_id)) - logg.debug('higesst {} {}'.format(highest_unsynced_block, highest_unsynced_tx)) if last_live_id != None: q = session.query(BlockchainSync) @@ -279,6 +278,13 @@ class SyncerBackend: self.disconnect() + def complete_filter(self, n): + self.connect() + self.db_object_filter.set(n) + self.disconnect() + + + class MemBackend: def __init__(self, chain_spec, object_id): diff --git a/chainsyncer/db/models/filter.py b/chainsyncer/db/models/filter.py index 93cf4c2..44b6d5f 100644 --- a/chainsyncer/db/models/filter.py +++ b/chainsyncer/db/models/filter.py @@ -32,7 +32,7 @@ class BlockchainSyncFilter(SessionBase): if flags == None: flags = bytearray(0) else: # TODO: handle bytes too - bytecount = int((count - 1) / 8 + 1) + 1 + bytecount = int((count - 1) / 8 + 1) flags = flags.to_bytes(bytecount, 'big') self.flags_start = flags self.flags = flags @@ -49,7 +49,6 @@ class BlockchainSyncFilter(SessionBase): old_byte_count = int((self.count - 1) / 8 + 1) new_byte_count = int((self.count) / 8 + 1) - logg.debug('old new {} {}'.format(old_byte_count, new_byte_count)) if old_byte_count != new_byte_count: self.flags = bytearray(1) + self.flags self.count += 1 @@ -72,7 +71,7 @@ class BlockchainSyncFilter(SessionBase): def clear(self): - self.flags = 0 + self.flags = bytearray(len(self.flags)) def set(self, n): @@ -80,10 +79,10 @@ class BlockchainSyncFilter(SessionBase): raise IndexError('bit flag out of range') b = 1 << (n % 8) - i = int((n - 1) / 8 + 1) - if self.flags[i] & b > 0: - SessionBase.release_session(session) + i = int(n / 8) + byte_idx = len(self.flags)-1-i + if (self.flags[byte_idx] & b) > 0: raise AttributeError('Filter bit already set') flags = bytearray(self.flags) - flags[i] |= b + flags[byte_idx] |= b self.flags = flags diff --git a/tests/test_database.py b/tests/test_database.py index 9797b18..f568407 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -76,7 +76,6 @@ class TestDatabase(TestBase): s.set(42, 13) s = SyncerBackend.first(self.chain_spec) - logg.debug('start {}'.format(s)) self.assertEqual(s.get(), ((42,13), 0)) @@ -127,17 +126,8 @@ class TestDatabase(TestBase): SyncerBackend.live(self.chain_spec, 666) s[0].set(123, 2) - logg.debug('>>>>>') s = SyncerBackend.resume(self.chain_spec, 1024) SyncerBackend.live(self.chain_spec, 1024) - s[0].connect() - logg.debug('syncer 1 {}'.format(s[0].db_object)) - s[0].disconnect() - s[1].connect() - logg.debug('syncer 2 {}'.format(s[1].db_object)) - s[1].disconnect() - - self.assertEqual(len(s), 2) self.assertEqual(s[0].target(), (666, 0)) @@ -146,6 +136,21 @@ class TestDatabase(TestBase): self.assertEqual(s[1].get(), ((666, 0), 0)) + def test_backend_resume_filter(self): + s = SyncerBackend.live(self.chain_spec, 42) + s.register_filter('foo') + s.register_filter('bar') + s.register_filter('baz') + + s.set(43, 13) + s.complete_filter(0) + s.complete_filter(2) + + s = SyncerBackend.resume(self.chain_spec, 666) + (pair, flags) = s[0].get() + + self.assertEqual(flags, 5) + if __name__ == '__main__': unittest.main()