Remove unique chain row constraint

This commit is contained in:
nolash 2021-02-23 22:56:12 +01:00
parent caabe288a7
commit c599a80a6c
Signed by: lash
GPG Key ID: 21D2E7BB88C2A746
6 changed files with 66 additions and 16 deletions

View File

@ -10,7 +10,7 @@ from chainsyncer.db.models.sync import BlockchainSync
from chainsyncer.db.models.filter import BlockchainSyncFilter from chainsyncer.db.models.filter import BlockchainSyncFilter
from chainsyncer.db.models.base import SessionBase from chainsyncer.db.models.base import SessionBase
logg = logging.getLogger() logg = logging.getLogger(__name__)
class SyncerBackend: class SyncerBackend:
@ -203,8 +203,8 @@ class SyncerBackend:
session.close() session.close()
for object_id in object_ids: for object_id in object_ids:
logg.debug('block syncer resume added previously unsynced sync entry id {}'.format(object_id))
s = SyncerBackend(chain_spec, object_id) s = SyncerBackend(chain_spec, object_id)
logg.debug('resume unfinished {}'.format(s))
syncers.append(s) syncers.append(s)
session = SessionBase.create_session() session = SessionBase.create_session()
@ -237,9 +237,10 @@ class SyncerBackend:
session.add(of) session.add(of)
session.commit() session.commit()
syncers.append(SyncerBackend(chain_spec, object_id)) backend = SyncerBackend(chain_spec, object_id)
syncers.append(backend)
logg.debug('block syncer resume added new sync entry from previous run id {}, start{}:{} target {}'.format(object_id, block_resume, tx_resume, block_height)) logg.debug('last live session resume {}'.format(backend))
session.close() session.close()
@ -287,6 +288,11 @@ class SyncerBackend:
self.connect() self.connect()
self.db_object_filter.set(n) self.db_object_filter.set(n)
self.disconnect() self.disconnect()
def __str__(self):
return "syncerbackend chain {} start {} target {}".format(self.chain(), self.start(), self.target())

View File

@ -11,7 +11,7 @@ def r0_0_1_u():
op.create_table( op.create_table(
'chain_sync', 'chain_sync',
sa.Column('id', sa.Integer, primary_key=True), sa.Column('id', sa.Integer, primary_key=True),
sa.Column('blockchain', sa.String, nullable=False, unique=True), sa.Column('blockchain', sa.String, nullable=False),
sa.Column('block_start', sa.Integer, nullable=False, default=0), sa.Column('block_start', sa.Integer, nullable=False, default=0),
sa.Column('tx_start', sa.Integer, nullable=False, default=0), sa.Column('tx_start', sa.Integer, nullable=False, default=0),
sa.Column('block_cursor', sa.Integer, nullable=False, default=0), sa.Column('block_cursor', sa.Integer, nullable=False, default=0),

View File

@ -126,6 +126,7 @@ class BlockchainSync(SessionBase):
""" """
self.block_cursor = block_height self.block_cursor = block_height
self.tx_cursor = tx_height self.tx_cursor = tx_height
self.date_updated = datetime.datetime.utcnow()
return (self.block_cursor, self.tx_cursor,) return (self.block_cursor, self.tx_cursor,)

View File

@ -13,12 +13,16 @@ from chainlib.eth.tx import receipt
# local imports # local imports
from chainsyncer.filter import SyncFilter from chainsyncer.filter import SyncFilter
from chainsyncer.error import (
SyncDone,
NoBlockForYou,
)
logg = logging.getLogger() logg = logging.getLogger(__name__)
def noop_callback(block_number, tx_index, s=None): def noop_callback(block_number, tx_index, s=None):
logg.debug('({},{}) {}'.format(block_number, tx_index, s)) logg.debug('noop callback ({},{}) {}'.format(block_number, tx_index, s))
class Syncer: class Syncer:
@ -83,8 +87,10 @@ class BlockPollSyncer(Syncer):
while True and Syncer.running_global: while True and Syncer.running_global:
try: try:
block = self.get(conn) block = self.get(conn)
except Exception as e: except SyncDone as e:
logg.debug('erro {}'.format(e)) logg.info('sync done: {}'.format(e))
return self.backend.get()
except NoBlockForYou as e:
break break
last_block = block.number last_block = block.number
self.process(conn, block) self.process(conn, block)
@ -97,10 +103,6 @@ class BlockPollSyncer(Syncer):
class HeadSyncer(BlockPollSyncer): class HeadSyncer(BlockPollSyncer):
def __init__(self, backend, loop_callback=noop_callback, progress_callback=noop_callback):
super(HeadSyncer, self).__init__(backend, loop_callback, progress_callback)
def process(self, conn, block): def process(self, conn, block):
logg.debug('process block {}'.format(block)) logg.debug('process block {}'.format(block))
i = 0 i = 0
@ -120,13 +122,51 @@ class HeadSyncer(BlockPollSyncer):
def get(self, conn): def get(self, conn):
#(block_number, tx_number) = self.backend.get()
(height, flags) = self.backend.get() (height, flags) = self.backend.get()
block_number = height[0] block_number = height[0]
block_hash = [] block_hash = []
o = block_by_number(block_number) o = block_by_number(block_number)
r = conn.do(o) r = conn.do(o)
if r == None:
raise NoBlockForYou()
b = Block(r) b = Block(r)
logg.debug('get {}'.format(b)) logg.debug('get {}'.format(b))
return b return b
def __str__(self):
return '[headsyncer] {}'.format(str(self.backend))
class HistorySyncer(HeadSyncer):
def __init__(self, backend, loop_callback=noop_callback, progress_callback=noop_callback):
super(HeadSyncer, self).__init__(backend, loop_callback, progress_callback)
self.block_target = None
(block_number, flags) = self.backend.target()
if block_number == None:
raise AttributeError('backend has no future target. Use HeadSyner instead')
self.block_target = block_number
def get(self, conn):
(height, flags) = self.backend.get()
if self.block_target < height[0]:
raise SyncDone(self.block_target)
block_number = height[0]
block_hash = []
o = block_by_number(block_number)
r = conn.do(o)
if r == None:
raise NoBlockForYou()
b = Block(r)
logg.debug('get {}'.format(b))
return b
def __str__(self):
return '[historysyncer] {}'.format(str(self.backend))

View File

@ -1,8 +1,11 @@
class LoopDone(Exception): class SyncDone(Exception):
"""Exception raised when a syncing is complete. """Exception raised when a syncing is complete.
""" """
pass pass
class NoBlockForYou(Exception):
pass
class RequestError(Exception): class RequestError(Exception):
pass pass

View File

@ -1,6 +1,6 @@
[metadata] [metadata]
name = chainsyncer name = chainsyncer
version = 0.0.1a15 version = 0.0.1a16
description = Generic blockchain syncer driver description = Generic blockchain syncer driver
author = Louis Holbrook author = Louis Holbrook
author_email = dev@holbrook.no author_email = dev@holbrook.no