Browse Source

Fix bug recently introduced in reorgs

Fixes #532
patch-2
Neil Booth 7 years ago
parent
commit
d008707330
  1. 2
      electrumx/__init__.py
  2. 15
      electrumx/server/block_processor.py

2
electrumx/__init__.py

@ -1,4 +1,4 @@
version = 'ElectrumX 1.6b' version = 'ElectrumX 1.6d'
version_short = version.split()[-1] version_short = version.split()[-1]
from electrumx.server.controller import Controller from electrumx.server.controller import Controller

15
electrumx/server/block_processor.py

@ -261,10 +261,9 @@ class BlockProcessor(electrumx.server.db.DB):
except Exception: except Exception:
return await self.daemon.raw_blocks(hex_hashes) return await self.daemon.raw_blocks(hex_hashes)
start, hashes = await self.reorg_hashes(count) start, last, hashes = await self.reorg_hashes(count)
# Reverse and convert to hex strings. # Reverse and convert to hex strings.
hashes = [hash_to_hex_str(hash) for hash in reversed(hashes)] hashes = [hash_to_hex_str(hash) for hash in reversed(hashes)]
last = start + count - 1
for hex_hashes in chunks(hashes, 50): for hex_hashes in chunks(hashes, 50):
raw_blocks = await get_raw_blocks(last, hex_hashes) raw_blocks = await get_raw_blocks(last, hex_hashes)
async with self.state_lock: async with self.state_lock:
@ -275,11 +274,11 @@ class BlockProcessor(electrumx.server.db.DB):
await self.prefetcher.reset_height(self.height) await self.prefetcher.reset_height(self.height)
async def reorg_hashes(self, count): async def reorg_hashes(self, count):
'''Return a pair (start, hashes) of blocks to back up during a '''Return a pair (start, last, hashes) of blocks to back up during a
reorg. reorg.
The hashes are returned in order of increasing height. Start The hashes are returned in order of increasing height. Start
is the height of the first hash. is the height of the first hash, last of the last.
''' '''
def diff_pos(hashes1, hashes2): def diff_pos(hashes1, hashes2):
@ -309,12 +308,12 @@ class BlockProcessor(electrumx.server.db.DB):
else: else:
start = (self.height - count) + 1 start = (self.height - count) + 1
last = start + count - 1
s = '' if count == 1 else 's' s = '' if count == 1 else 's'
self.logger.info('chain was reorganised replacing {:,d} block{} at ' self.logger.info(f'chain was reorganised replacing {count:,d} '
'heights {:,d}-{:,d}' f'block{s} at heights {start:,d}-{last:,d}')
.format(count, s, start, start + count - 1))
return start, self.fs_block_hashes(start, count) return start, last, self.fs_block_hashes(start, count)
def flush_state(self, batch): def flush_state(self, batch):
'''Flush chain state to the batch.''' '''Flush chain state to the batch.'''

Loading…
Cancel
Save