mirror of
https://github.com/LBRYFoundation/LBRY-Vault.git
synced 2025-08-23 17:47:31 +00:00
blockchain.py: fix: chunks in checkpoint region were not getting saved if we were on a fork
This commit is contained in:
parent
531cdeffa9
commit
2a9f5db576
1 changed files with 28 additions and 7 deletions
|
@ -115,10 +115,17 @@ class Blockchain(util.PrintError):
|
||||||
self.forkpoint = forkpoint
|
self.forkpoint = forkpoint
|
||||||
self.checkpoints = constants.net.CHECKPOINTS
|
self.checkpoints = constants.net.CHECKPOINTS
|
||||||
self.parent_id = parent_id
|
self.parent_id = parent_id
|
||||||
self.lock = threading.Lock()
|
assert parent_id != forkpoint
|
||||||
|
self.lock = threading.RLock()
|
||||||
with self.lock:
|
with self.lock:
|
||||||
self.update_size()
|
self.update_size()
|
||||||
|
|
||||||
|
def with_lock(func):
|
||||||
|
def func_wrapper(self, *args, **kwargs):
|
||||||
|
with self.lock:
|
||||||
|
return func(self, *args, **kwargs)
|
||||||
|
return func_wrapper
|
||||||
|
|
||||||
def parent(self):
|
def parent(self):
|
||||||
return blockchains[self.parent_id]
|
return blockchains[self.parent_id]
|
||||||
|
|
||||||
|
@ -186,15 +193,27 @@ class Blockchain(util.PrintError):
|
||||||
filename = 'blockchain_headers' if self.parent_id is None else os.path.join('forks', 'fork_%d_%d'%(self.parent_id, self.forkpoint))
|
filename = 'blockchain_headers' if self.parent_id is None else os.path.join('forks', 'fork_%d_%d'%(self.parent_id, self.forkpoint))
|
||||||
return os.path.join(d, filename)
|
return os.path.join(d, filename)
|
||||||
|
|
||||||
|
@with_lock
|
||||||
def save_chunk(self, index, chunk):
|
def save_chunk(self, index, chunk):
|
||||||
d = (index * 2016 - self.forkpoint) * 80
|
chunk_within_checkpoint_region = index < len(self.checkpoints)
|
||||||
if d < 0:
|
# chunks in checkpoint region are the responsibility of the 'main chain'
|
||||||
chunk = chunk[-d:]
|
if chunk_within_checkpoint_region and self.parent_id is not None:
|
||||||
d = 0
|
main_chain = blockchains[0]
|
||||||
truncate = index >= len(self.checkpoints)
|
main_chain.save_chunk(index, chunk)
|
||||||
self.write(chunk, d, truncate)
|
return
|
||||||
|
|
||||||
|
delta_height = (index * 2016 - self.forkpoint)
|
||||||
|
delta_bytes = delta_height * 80
|
||||||
|
# if this chunk contains our forkpoint, only save the part after forkpoint
|
||||||
|
# (the part before is the responsibility of the parent)
|
||||||
|
if delta_bytes < 0:
|
||||||
|
chunk = chunk[-delta_bytes:]
|
||||||
|
delta_bytes = 0
|
||||||
|
truncate = not chunk_within_checkpoint_region
|
||||||
|
self.write(chunk, delta_bytes, truncate)
|
||||||
self.swap_with_parent()
|
self.swap_with_parent()
|
||||||
|
|
||||||
|
@with_lock
|
||||||
def swap_with_parent(self):
|
def swap_with_parent(self):
|
||||||
if self.parent_id is None:
|
if self.parent_id is None:
|
||||||
return
|
return
|
||||||
|
@ -253,9 +272,11 @@ class Blockchain(util.PrintError):
|
||||||
os.fsync(f.fileno())
|
os.fsync(f.fileno())
|
||||||
self.update_size()
|
self.update_size()
|
||||||
|
|
||||||
|
@with_lock
|
||||||
def save_header(self, header):
|
def save_header(self, header):
|
||||||
delta = header.get('block_height') - self.forkpoint
|
delta = header.get('block_height') - self.forkpoint
|
||||||
data = bfh(serialize_header(header))
|
data = bfh(serialize_header(header))
|
||||||
|
# headers are only _appended_ to the end:
|
||||||
assert delta == self.size()
|
assert delta == self.size()
|
||||||
assert len(data) == 80
|
assert len(data) == 80
|
||||||
self.write(data, delta*80)
|
self.write(data, delta*80)
|
||||||
|
|
Loading…
Add table
Reference in a new issue