From c4f6bc807b2f0203e8f1731ca31705ec37562b89 Mon Sep 17 00:00:00 2001 From: nolash Date: Fri, 9 Apr 2021 16:07:10 +0200 Subject: [PATCH] Repurpose loop callbacks --- chainsyncer/backend.py | 7 ++++++- chainsyncer/driver.py | 42 +++++++++++++++++++++++------------------- requirements.txt | 2 +- setup.cfg | 2 +- 4 files changed, 31 insertions(+), 22 deletions(-) diff --git a/chainsyncer/backend.py b/chainsyncer/backend.py index 79dc69e..3323074 100644 --- a/chainsyncer/backend.py +++ b/chainsyncer/backend.py @@ -298,12 +298,13 @@ class SyncerBackend: class MemBackend: - def __init__(self, chain_spec, object_id): + def __init__(self, chain_spec, object_id, target_block=None): self.object_id = object_id self.chain_spec = chain_spec self.block_height = 0 self.tx_height = 0 self.flags = 0 + self.target_block = target_block self.db_session = None @@ -325,6 +326,10 @@ class MemBackend: return ((self.block_height, self.tx_height), self.flags) + def target(self): + return (self.target_block, self.flags) + + def register_filter(self, name): pass diff --git a/chainsyncer/driver.py b/chainsyncer/driver.py index b072b98..661c0f2 100644 --- a/chainsyncer/driver.py +++ b/chainsyncer/driver.py @@ -22,8 +22,8 @@ from chainsyncer.error import ( logg = logging.getLogger(__name__) -def noop_callback(block_number, tx_index, s=None): - logg.debug('noop callback ({},{}) {}'.format(block_number, tx_index, s)) +def noop_callback(block, tx): + logg.debug('noop callback ({},{})'.format(block, tx)) class Syncer: @@ -32,13 +32,14 @@ class Syncer: yield_delay=0.005 signal_set = False - def __init__(self, backend, loop_callback=noop_callback, progress_callback=noop_callback): + def __init__(self, backend, pre_callback=None, block_callback=None, post_callback=None): self.cursor = None self.running = True self.backend = backend self.filter = SyncFilter(backend) - self.progress_callback = progress_callback - self.loop_callback = loop_callback + self.block_callback = block_callback + self.pre_callback = pre_callback + self.post_callback = post_callback if not Syncer.signal_set: signal.signal(signal.SIGINT, Syncer.__sig_terminate) signal.signal(signal.SIGTERM, Syncer.__sig_terminate) @@ -73,18 +74,18 @@ class Syncer: class BlockPollSyncer(Syncer): - def __init__(self, backend, loop_callback=noop_callback, progress_callback=noop_callback): - super(BlockPollSyncer, self).__init__(backend, loop_callback, progress_callback) + def __init__(self, backend, pre_callback=None, block_callback=None, post_callback=None): + super(BlockPollSyncer, self).__init__(backend, pre_callback, block_callback, post_callback) def loop(self, interval, conn): - (g, flags) = self.backend.get() - last_tx = g[1] - last_block = g[0] - self.progress_callback(last_block, last_tx, 'loop started') + #(g, flags) = self.backend.get() + #last_tx = g[1] + #last_block = g[0] + #self.progress_callback(last_block, last_tx, 'loop started') while self.running and Syncer.running_global: - if self.loop_callback != None: - self.loop_callback(last_block, last_tx) + if self.pre_callback != None: + self.pre_callback() while True and Syncer.running_global: try: block = self.get(conn) @@ -97,12 +98,16 @@ class BlockPollSyncer(Syncer): # except sqlalchemy.exc.OperationalError as e: # logg.error('database error: {}'.format(e)) # break - last_block = block.number + + if self.block_callback != None: + self.block_callback(block, None) + + last_block = block self.process(conn, block) start_tx = 0 - self.progress_callback(last_block, last_tx, 'processed block {}'.format(self.backend.get())) time.sleep(self.yield_delay) - self.progress_callback(last_block + 1, last_tx, 'loop ended') + if self.post_callback != None: + self.post_callback() time.sleep(interval) @@ -117,7 +122,6 @@ class HeadSyncer(BlockPollSyncer): tx = block.tx(i) rcpt = conn.do(receipt(tx.hash)) tx.apply_receipt(rcpt) - self.progress_callback(block.number, i, 'processing {}'.format(repr(tx))) self.backend.set(block.number, i) self.filter.apply(conn, block, tx) except IndexError as e: @@ -146,8 +150,8 @@ class HeadSyncer(BlockPollSyncer): class HistorySyncer(HeadSyncer): - def __init__(self, backend, loop_callback=noop_callback, progress_callback=noop_callback): - super(HeadSyncer, self).__init__(backend, loop_callback, progress_callback) + def __init__(self, backend, pre_callback=None, block_callback=None, post_callback=None): + super(HeadSyncer, self).__init__(backend, pre_callback, block_callback, post_callback) self.block_target = None (block_number, flags) = self.backend.target() if block_number == None: diff --git a/requirements.txt b/requirements.txt index 4d34603..52f23b7 100644 --- a/requirements.txt +++ b/requirements.txt @@ -3,4 +3,4 @@ SQLAlchemy==1.3.20 confini~=0.3.6rc3 semver==2.13.0 hexathon~=0.0.1a7 -chainlib~=0.0.2a1 +chainlib~=0.0.2a6 diff --git a/setup.cfg b/setup.cfg index 5f1a9f6..ce10e5d 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = chainsyncer -version = 0.0.1a21 +version = 0.0.1a22 description = Generic blockchain syncer driver author = Louis Holbrook author_email = dev@holbrook.no