Skip to content

Commit

Permalink
Merge pull request #326 from lidofinance/fix/oracle-beta-2-hotfix
Browse files Browse the repository at this point in the history
hotfixes
  • Loading branch information
F4ever committed Apr 1, 2023
2 parents 20908b7 + cb6d454 commit 9fd3a5d
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 19 deletions.
9 changes: 5 additions & 4 deletions src/modules/submodules/oracle_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
from dataclasses import asdict
from enum import Enum

from timeout_decorator import timeout
from requests.exceptions import ConnectionError as RequestsConnectionError
from timeout_decorator import timeout, TimeoutError as DecoratorTimeoutError

from src.metrics.prometheus.basic import ORACLE_BLOCK_NUMBER, ORACLE_SLOT_NUMBER
from src.modules.submodules.exceptions import IsNotMemberException, IncompatibleContractVersion
Expand Down Expand Up @@ -87,12 +88,12 @@ def run_cycle(self, blockstamp: BlockStamp) -> ModuleExecuteDelay:
except IncompatibleContractVersion as exception:
logger.error({'msg': 'Incompatible Contract version. Please update Oracle Daemon.'})
raise exception
except TimeoutError as exception:
except DecoratorTimeoutError as exception:
logger.error({'msg': 'Oracle module do not respond.', 'error': str(exception)})
except NoActiveProviderError as exception:
logger.error({'msg': 'No active node available.', 'error': str(exception)})
except ConnectionError as error:
logger.error({'msg': error.args, 'error': str(error)})
except RequestsConnectionError as error:
logger.error({'msg': 'Connection error.', 'error': str(error)})
except NotOkResponse as error:
logger.error({'msg': 'Received non-ok response.', 'error': str(error)})
except (NoSlotsAvailable, SlotNotFinalized, InconsistentData) as error:
Expand Down
22 changes: 11 additions & 11 deletions src/providers/http_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@
from urllib.parse import urljoin, urlparse

from prometheus_client import Histogram
from requests import Session, JSONDecodeError, Timeout
from requests import Session, JSONDecodeError
from requests.adapters import HTTPAdapter
from requests.exceptions import ConnectionError as RequestsConnectionError
from urllib3 import Retry

from src.variables import HTTP_REQUEST_RETRY_COUNT, HTTP_REQUEST_SLEEP_BEFORE_RETRY_IN_SECONDS, HTTP_REQUEST_TIMEOUT
Expand Down Expand Up @@ -114,15 +115,20 @@ def _get_without_fallbacks(
params=query_params,
timeout=HTTP_REQUEST_TIMEOUT,
)
except Timeout as error:
msg = f'Timeout error from {complete_endpoint}.'
logger.debug({'msg': msg})
except RequestsConnectionError as error:
logger.debug({'msg': str(error)})
t.labels(
endpoint=endpoint,
code=0,
domain=urlparse(host).netloc,
)
raise TimeoutError(msg) from error
raise error

t.labels(
endpoint=endpoint,
code=response.status_code,
domain=urlparse(host).netloc,
)

response_fail_msg = f'Response from {complete_endpoint} [{response.status_code}] with text: "{str(response.text)}" returned.'

Expand All @@ -135,12 +141,6 @@ def _get_without_fallbacks(
except JSONDecodeError as error:
logger.debug({'msg': response_fail_msg})
raise error
finally:
t.labels(
endpoint=endpoint,
code=response.status_code,
domain=urlparse(host).netloc,
)

if 'data' in json_response:
data = json_response['data']
Expand Down
2 changes: 1 addition & 1 deletion src/utils/slot.py
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ def get_first_non_missed_slot(
# 2nd tick - 20 slot is missed. Check next slot.
# 3rd tick - 21 slot is missed. Check next slot.
# 4th tick - 22 slot is missed. Check next slot.
# 5th tick - 23 slot is existed!
# 5th tick - 23 slot exists!
# Get `parent_root` of 23 slot and get its parent slot by this root
# In our case it is 18 slot because it's first non-missed slot before 23 slot.
#
Expand Down
4 changes: 3 additions & 1 deletion src/utils/web3converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,9 @@ def get_frame_last_slot(self, frame: FrameNumber) -> SlotNumber:
return SlotNumber(self.get_frame_first_slot(FrameNumber(frame + 1)) - 1)

def get_frame_first_slot(self, frame: FrameNumber) -> SlotNumber:
return SlotNumber(frame * self.frame_config.epochs_per_frame * self.chain_config.slots_per_epoch)
return SlotNumber(
(self.frame_config.initial_epoch + frame * self.frame_config.epochs_per_frame) * self.chain_config.slots_per_epoch
)

def get_epoch_by_slot(self, ref_slot: SlotNumber) -> EpochNumber:
return EpochNumber(ref_slot // self.chain_config.slots_per_epoch)
Expand Down
7 changes: 5 additions & 2 deletions tests/modules/submodules/test_oracle_module.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@
from typing import Type

import pytest
from requests.exceptions import ConnectionError as RequestsConnectionError
from timeout_decorator import TimeoutError as DecoratorTimeoutError

from web3_multi_provider.multi_http_provider import NoActiveProviderError

from src.modules.submodules.exceptions import IsNotMemberException, IncompatibleContractVersion
Expand Down Expand Up @@ -92,9 +95,9 @@ def _throw_on_third_call():
@pytest.mark.parametrize(
"ex",
[
TimeoutError,
DecoratorTimeoutError,
NoActiveProviderError,
ConnectionError,
RequestsConnectionError,
NotOkResponse,
NoSlotsAvailable,
SlotNotFinalized,
Expand Down

0 comments on commit 9fd3a5d

Please sign in to comment.