Correct multiple resume
This commit is contained in:
parent
37d0a36303
commit
be405b8376
@ -121,7 +121,7 @@ class SyncerBackend:
|
||||
"""
|
||||
self.connect()
|
||||
target = self.db_object.target()
|
||||
(filter_state, count, digest) = self.db_object_filter.target()
|
||||
(filter_target, count, digest) = self.db_object_filter.target()
|
||||
self.disconnect()
|
||||
return (target, filter_target,)
|
||||
|
||||
@ -190,12 +190,22 @@ class SyncerBackend:
|
||||
|
||||
object_id = None
|
||||
|
||||
highest_unsynced_block = 0
|
||||
highest_unsynced_tx = 0
|
||||
object_id = BlockchainSync.get_last(session=session, live=False)
|
||||
if object_id != None:
|
||||
q = session.query(BlockchainSync)
|
||||
o = q.get(object_id)
|
||||
(highest_unsynced_block, highest_unsynced_index) = o.cursor()
|
||||
|
||||
for object_id in BlockchainSync.get_unsynced(session=session):
|
||||
logg.debug('block syncer resume added previously unsynced sync entry id {}'.format(object_id))
|
||||
syncers.append(SyncerBackend(chain_spec, object_id))
|
||||
s = SyncerBackend(chain_spec, object_id)
|
||||
syncers.append(s)
|
||||
|
||||
last_live_id = BlockchainSync.get_last_live(block_height, session=session)
|
||||
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)
|
||||
@ -204,7 +214,8 @@ class SyncerBackend:
|
||||
(block_resume, tx_resume) = o.cursor()
|
||||
session.flush()
|
||||
|
||||
if block_height != block_resume:
|
||||
#if block_height != block_resume:
|
||||
if highest_unsynced_block < block_resume:
|
||||
|
||||
q = session.query(BlockchainSyncFilter)
|
||||
q = q.filter(BlockchainSyncFilter.chain_sync_id==last_live_id)
|
||||
|
@ -61,11 +61,9 @@ class BlockchainSync(SessionBase):
|
||||
|
||||
|
||||
@staticmethod
|
||||
def get_last_live(current, session=None):
|
||||
def get_last(session=None, live=True):
|
||||
"""Get the most recent open-ended ("live") syncer record.
|
||||
|
||||
:param current: Current block number
|
||||
:type current: number
|
||||
:param session: Session to use. If not specified, a separate session will be created for this method only.
|
||||
:type session: SqlAlchemy Session
|
||||
:returns: Block and transaction number, respectively
|
||||
@ -74,7 +72,10 @@ class BlockchainSync(SessionBase):
|
||||
session = SessionBase.bind_session(session)
|
||||
|
||||
q = session.query(BlockchainSync.id)
|
||||
q = q.filter(BlockchainSync.block_target==None)
|
||||
if live:
|
||||
q = q.filter(BlockchainSync.block_target==None)
|
||||
else:
|
||||
q = q.filter(BlockchainSync.block_target!=None)
|
||||
q = q.order_by(BlockchainSync.date_created.desc())
|
||||
object_id = q.first()
|
||||
|
||||
@ -169,3 +170,20 @@ class BlockchainSync(SessionBase):
|
||||
self.block_target = block_target
|
||||
self.date_created = datetime.datetime.utcnow()
|
||||
self.date_updated = datetime.datetime.utcnow()
|
||||
|
||||
|
||||
def __str__(self):
|
||||
return """object_id: {}
|
||||
start: {}:{}
|
||||
cursor: {}:{}
|
||||
target: {}
|
||||
""".format(
|
||||
self.id,
|
||||
self.block_start,
|
||||
self.tx_start,
|
||||
self.block_cursor,
|
||||
self.tx_cursor,
|
||||
self.block_target,
|
||||
)
|
||||
|
||||
|
||||
|
@ -67,7 +67,6 @@ class TestDatabase(TestBase):
|
||||
|
||||
session.close()
|
||||
|
||||
|
||||
def test_backend_retrieve(self):
|
||||
s = SyncerBackend.live(self.chain_spec, 42)
|
||||
s.register_filter('foo')
|
||||
@ -107,15 +106,46 @@ class TestDatabase(TestBase):
|
||||
self.assertEqual(len(s), 1)
|
||||
resumed_id = s[0].object_id
|
||||
self.assertEqual(resumed_id, original_id + 1)
|
||||
self.assertEqual(s[0].get(), ((42, 0), 0))
|
||||
|
||||
|
||||
def test_backend_resume_when_completed(self):
|
||||
s = SyncerBackend.live(self.chain_spec, 42)
|
||||
|
||||
s = SyncerBackend.resume(self.chain_spec, 666)
|
||||
s[0].set(666, 0)
|
||||
|
||||
s = SyncerBackend.resume(self.chain_spec, 666)
|
||||
self.assertEqual(len(s), 0)
|
||||
|
||||
|
||||
def test_backend_resume_several(self):
|
||||
s = SyncerBackend.live(self.chain_spec, 42)
|
||||
s.set(43, 13)
|
||||
|
||||
s = SyncerBackend.resume(self.chain_spec, 666)
|
||||
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))
|
||||
self.assertEqual(s[0].get(), ((123, 2), 0))
|
||||
self.assertEqual(s[1].target(), (1024, 0))
|
||||
self.assertEqual(s[1].get(), ((666, 0), 0))
|
||||
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
unittest.main()
|
||||
|
Loading…
Reference in New Issue
Block a user