estimate only whats not downloaded
This commit is contained in:
parent
ced368db31
commit
239ee2437c
2 changed files with 15 additions and 2 deletions
|
@ -136,6 +136,9 @@ class Headers:
|
||||||
def estimated_timestamp(self, height):
|
def estimated_timestamp(self, height):
|
||||||
if height <= 0:
|
if height <= 0:
|
||||||
return
|
return
|
||||||
|
if self.has_header(height):
|
||||||
|
offset = height * self.header_size
|
||||||
|
return struct.unpack('<I', self.io.getbuffer()[offset + 100: offset + 104])[0]
|
||||||
return int(self.first_block_timestamp + (height * self.timestamp_average_offset))
|
return int(self.first_block_timestamp + (height * self.timestamp_average_offset))
|
||||||
|
|
||||||
def estimated_julian_day(self, height):
|
def estimated_julian_day(self, height):
|
||||||
|
@ -162,7 +165,7 @@ class Headers:
|
||||||
|
|
||||||
async def ensure_chunk_at(self, height):
|
async def ensure_chunk_at(self, height):
|
||||||
async with self.check_chunk_lock:
|
async with self.check_chunk_lock:
|
||||||
if await self.has_header(height):
|
if self.has_header(height):
|
||||||
log.debug("has header %s", height)
|
log.debug("has header %s", height)
|
||||||
return
|
return
|
||||||
return await self.fetch_chunk(height)
|
return await self.fetch_chunk(height)
|
||||||
|
@ -186,7 +189,7 @@ class Headers:
|
||||||
f"Checkpoint mismatch at height {start}. Expected {self.checkpoints[start]}, but got {chunk_hash} instead."
|
f"Checkpoint mismatch at height {start}. Expected {self.checkpoints[start]}, but got {chunk_hash} instead."
|
||||||
)
|
)
|
||||||
|
|
||||||
async def has_header(self, height):
|
def has_header(self, height):
|
||||||
normalized_height = (height // 1000) * 1000
|
normalized_height = (height // 1000) * 1000
|
||||||
if normalized_height in self.checkpoints:
|
if normalized_height in self.checkpoints:
|
||||||
return normalized_height not in self.known_missing_checkpointed_chunks
|
return normalized_height not in self.known_missing_checkpointed_chunks
|
||||||
|
|
|
@ -153,6 +153,16 @@ class TestHeaders(AsyncioTestCase):
|
||||||
self.assertIsNone(headers.estimated_timestamp(0))
|
self.assertIsNone(headers.estimated_timestamp(0))
|
||||||
self.assertIsNotNone(headers.estimated_timestamp(1))
|
self.assertIsNotNone(headers.estimated_timestamp(1))
|
||||||
|
|
||||||
|
async def test_dont_estimate_whats_there(self):
|
||||||
|
headers = Headers(':memory:')
|
||||||
|
await headers.open()
|
||||||
|
estimated = headers.estimated_timestamp(10)
|
||||||
|
await headers.connect(0, HEADERS)
|
||||||
|
real_time = (await headers.get(10))['timestamp']
|
||||||
|
after_downloading_header_estimated = headers.estimated_timestamp(10)
|
||||||
|
self.assertNotEqual(estimated, after_downloading_header_estimated)
|
||||||
|
self.assertEqual(after_downloading_header_estimated, real_time)
|
||||||
|
|
||||||
async def test_misalignment_triggers_repair_on_open(self):
|
async def test_misalignment_triggers_repair_on_open(self):
|
||||||
headers = Headers(':memory:')
|
headers = Headers(':memory:')
|
||||||
headers.io.seek(0)
|
headers.io.seek(0)
|
||||||
|
|
Loading…
Reference in a new issue