fix download_progress in blockchain_headers status

-use a 0-100 range for percentage regardless of how much we have to download (if we're resuming or starting fresh)
-prevent negative blocks or blocks_behind counts
This commit is contained in:
Jack Robison 2018-08-13 14:03:15 -04:00
parent 36df9e8283
commit ea481e6c5a
No known key found for this signature in database
GPG key ID: DF25C68FE0239BB2
2 changed files with 15 additions and 16 deletions

View file

@ -13,8 +13,8 @@ at anytime.
* *
### Fixed ### Fixed
* * `download_progress` field in `blockchain_headers` section of `status` not initializing correctly when resuming a download (https://github.com/lbryio/lbry/issues/1355)
* * `wallet_send` not accepting decimal amounts (https://github.com/lbryio/lbry/issues/1356 commit https://github.com/lbryio/lbry/commit/1098ca0494ece420c70fc57f69d6d388715a99b8)
### Deprecated ### Deprecated
* *
@ -25,7 +25,7 @@ at anytime.
* *
### Added ### Added
* `is_locked` to `wallet` in `status` response * `is_locked` to `wallet` in `status` response (https://github.com/lbryio/lbry/issues/1354, commit https://github.com/lbryio/lbry/commit/153022a1a7122ab6d31d3db433dccbe469bbcb3c)
* *
### Removed ### Removed

View file

@ -190,33 +190,32 @@ class HeadersComponent(Component):
@defer.inlineCallbacks @defer.inlineCallbacks
def fetch_headers_from_s3(self): def fetch_headers_from_s3(self):
def collector(data, h_file):
h_file.write(data)
local_size = float(h_file.tell())
final_size = float(final_size_after_download)
self._headers_progress_percent = math.ceil(local_size / final_size * 100)
local_header_size = self.local_header_file_size() local_header_size = self.local_header_file_size()
self._headers_progress_percent = 0.0 self._headers_progress_percent = 0.0
resume_header = {"Range": "bytes={}-".format(local_header_size)} resume_header = {"Range": "bytes={}-".format(local_header_size)}
response = yield treq.get(HEADERS_URL, headers=resume_header) response = yield treq.get(HEADERS_URL, headers=resume_header)
got_406 = response.code == 406 # our file is bigger
final_size_after_download = response.length + local_header_size final_size_after_download = response.length + local_header_size
if got_406:
def collector(data, h_file, start_size):
h_file.write(data)
local_size = float(h_file.tell())
final_size = float(final_size_after_download)
self._headers_progress_percent = math.ceil((local_size - start_size) / (final_size - start_size) * 100)
if response.code == 406: # our file is bigger
log.warning("s3 is more out of date than we are") log.warning("s3 is more out of date than we are")
# should have something to download and a final length divisible by the header size # should have something to download and a final length divisible by the header size
elif final_size_after_download and not final_size_after_download % HEADER_SIZE: elif final_size_after_download and not final_size_after_download % HEADER_SIZE:
s3_height = (final_size_after_download / HEADER_SIZE) - 1 s3_height = (final_size_after_download / HEADER_SIZE) - 1
local_height = self.local_header_file_height() local_height = self.local_header_file_height()
self._headers_progress_percent = math.ceil(float(local_height) / float(s3_height) * 100.0)
if s3_height > local_height: if s3_height > local_height:
if local_header_size: if local_header_size:
log.info("Resuming download of %i bytes from s3", response.length) log.info("Resuming download of %i bytes from s3", response.length)
with open(os.path.join(self.config.path, "blockchain_headers"), "a+b") as headers_file: with open(os.path.join(self.config.path, "blockchain_headers"), "a+b") as headers_file:
yield treq.collect(response, lambda d: collector(d, headers_file)) yield treq.collect(response, lambda d: collector(d, headers_file, local_header_size))
else: else:
with open(os.path.join(self.config.path, "blockchain_headers"), "wb") as headers_file: with open(os.path.join(self.config.path, "blockchain_headers"), "wb") as headers_file:
yield treq.collect(response, lambda d: collector(d, headers_file)) yield treq.collect(response, lambda d: collector(d, headers_file, 0))
log.info("fetched headers from s3 (s3 height: %i), now verifying integrity after download.", s3_height) log.info("fetched headers from s3 (s3 height: %i), now verifying integrity after download.", s3_height)
self._check_header_file_integrity() self._check_header_file_integrity()
else: else:
@ -321,8 +320,8 @@ class WalletComponent(Component):
remote_height = self.wallet.network.get_server_height() remote_height = self.wallet.network.get_server_height()
best_hash = yield self.wallet.get_best_blockhash() best_hash = yield self.wallet.get_best_blockhash()
defer.returnValue({ defer.returnValue({
'blocks': local_height, 'blocks': max(local_height, 0),
'blocks_behind': remote_height - local_height, 'blocks_behind': max(remote_height - local_height, 0),
'best_blockhash': best_hash, 'best_blockhash': best_hash,
'is_encrypted': self.wallet.wallet.use_encryption, 'is_encrypted': self.wallet.wallet.use_encryption,
'is_locked': not self.wallet.is_wallet_unlocked, 'is_locked': not self.wallet.is_wallet_unlocked,