Replace filter execution control with bools instead of exceptions
This commit is contained in:
parent
75a6d2975e
commit
e48b62679d
@ -26,16 +26,10 @@ class SyncSession:
|
||||
def filter(self, conn, block, tx):
|
||||
self.session_store.connect()
|
||||
for fltr in self.filters:
|
||||
try:
|
||||
self.item.advance()
|
||||
except FilterDone:
|
||||
break
|
||||
interrupt = fltr.filter(conn, block, tx)
|
||||
self.item.release(interrupt=interrupt)
|
||||
try:
|
||||
self.item.advance()
|
||||
raise BackendError('filter state inconsitent with filter list')
|
||||
except FilterDone:
|
||||
self.item.reset()
|
||||
interrupt = fltr.filter(conn, block, tx)
|
||||
if not self.item.release(interrupt=interrupt):
|
||||
break
|
||||
self.item.reset()
|
||||
self.next()
|
||||
self.session_store.disconnect()
|
||||
|
@ -19,12 +19,14 @@ class SyncState:
|
||||
self.state_store.add('LOCK')
|
||||
self.state_store.add('INTERRUPT')
|
||||
self.state_store.add('RESET')
|
||||
|
||||
self.state = self.state_store.state
|
||||
self.put = self.state_store.put
|
||||
self.set = self.state_store.set
|
||||
self.next = self.state_store.next
|
||||
self.move = self.state_store.move
|
||||
self.unset = self.state_store.unset
|
||||
self.peek = self.state_store.peek
|
||||
self.from_name = self.state_store.from_name
|
||||
self.state_store.sync()
|
||||
self.all = self.state_store.all
|
||||
|
@ -82,6 +82,10 @@ class SyncFsItem:
|
||||
self.sync_state.replace(self.state_key, v)
|
||||
|
||||
|
||||
def __find_advance(self):
|
||||
v = self.filter_state.state(self.state_key)
|
||||
|
||||
|
||||
def advance(self):
|
||||
if self.skip_filter:
|
||||
raise FilterDone()
|
||||
@ -95,24 +99,30 @@ class SyncFsItem:
|
||||
except StateInvalid:
|
||||
done = True
|
||||
if done:
|
||||
self.filter_state.set(self.state_key, self.filter_state.from_name('DONE'))
|
||||
raise FilterDone()
|
||||
self.filter_state.set(self.state_key, self.filter_state.from_name('LOCK'))
|
||||
|
||||
|
||||
def release(self, interrupt=False):
|
||||
if self.skip_filter:
|
||||
raise FilterDone()
|
||||
return False
|
||||
if interrupt:
|
||||
self.filter_state.unset(self.state_key, self.filter_state.from_name('LOCK'))
|
||||
self.filter_state.set(self.state_key, self.filter_state.from_name('INTERRUPT'))
|
||||
self.filter_state.set(self.state_key, self.filter_state.from_name('DONE'))
|
||||
return
|
||||
return False
|
||||
|
||||
state = self.filter_state.state(self.state_key)
|
||||
if state & self.filter_state.from_name('LOCK') == 0:
|
||||
raise LockError('release attempt on {} when state unlocked'.format(self.state_key))
|
||||
self.filter_state.unset(self.state_key, self.filter_state.from_name('LOCK'))
|
||||
try:
|
||||
c = self.filter_state.peek(self.state_key)
|
||||
logg.debug('peeked {}'.format(c))
|
||||
except StateInvalid:
|
||||
self.filter_state.set(self.state_key, self.filter_state.from_name('DONE'))
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def __str__(self):
|
||||
|
@ -31,7 +31,6 @@ class TestFilter(unittest.TestCase):
|
||||
self.path = tempfile.mkdtemp()
|
||||
self.store = SyncFsStore(self.path)
|
||||
self.session = SyncSession(self.store)
|
||||
self.session.start()
|
||||
self.conn = MockConn()
|
||||
|
||||
|
||||
@ -45,6 +44,8 @@ class TestFilter(unittest.TestCase):
|
||||
fltr_two = MockFilter('bar')
|
||||
self.store.register(fltr_two)
|
||||
|
||||
self.session.start()
|
||||
|
||||
tx_hash = os.urandom(32).hex()
|
||||
tx = MockTx(42, tx_hash)
|
||||
block = MockBlock(13, [tx_hash])
|
||||
@ -61,6 +62,8 @@ class TestFilter(unittest.TestCase):
|
||||
fltr_two = MockFilter('bar')
|
||||
self.store.register(fltr_two)
|
||||
|
||||
self.session.start()
|
||||
|
||||
tx_hash = os.urandom(32).hex()
|
||||
tx = MockTx(42, tx_hash)
|
||||
block = MockBlock(13, [tx_hash])
|
||||
|
Loading…
Reference in New Issue
Block a user