Skip to content

Commit eb01a52

Browse files
authored
Merge pull request #71 from SubstraFoundation/fix-mvcc-retry
Fix MVCC Read Conflict retry
2 parents ae31b50 + abffcfd commit eb01a52

File tree

3 files changed

+10
-5
lines changed

3 files changed

+10
-5
lines changed

backend/backend/settings/dev.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
'CACHE_DOCKER_IMAGES': to_bool(os.environ.get('TASK_CACHE_DOCKER_IMAGES', False)),
1414
}
1515

16-
LEDGER_CALL_RETRY = False # Overwrite the ledger setting value
16+
# LEDGER_CALL_RETRY = False # uncomment to overwrite the ledger setting value
1717

1818
# Database
1919
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

backend/backend/settings/test.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,5 @@
44

55
import logging
66
logging.disable(logging.CRITICAL)
7+
8+
LEDGER_CALL_RETRY = False

backend/substrapp/ledger_utils.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ def retry_on_error(delay=1, nbtries=5, backoff=2):
8686
def _retry(fn):
8787
@functools.wraps(fn)
8888
def _wrapper(*args, **kwargs):
89-
if not getattr(settings, 'LEDGER_CALL_RETRY', False):
89+
if not getattr(settings, 'LEDGER_CALL_RETRY', True):
9090
return fn(*args, **kwargs)
9191

9292
_delay = delay
@@ -162,6 +162,11 @@ def call_ledger(call_type, fcn, args=None, kwargs=None):
162162
if hasattr(e, 'details') and 'access denied' in e.details():
163163
raise LedgerForbidden(f'Access denied for {(fcn, args)}')
164164

165+
for arg in e.args:
166+
if 'MVCC_READ_CONFLICT' in arg:
167+
logger.error(f'MVCC read conflict for {(fcn, args)}')
168+
raise LedgerMVCCError(arg) from e
169+
165170
try: # get first failed response from list of protobuf ProposalResponse
166171
response = [r for r in e.args[0] if r.response.status != 200][0].response.message
167172
except Exception:
@@ -171,9 +176,7 @@ def call_ledger(call_type, fcn, args=None, kwargs=None):
171176
try:
172177
response = json.loads(response)
173178
except json.decoder.JSONDecodeError:
174-
if response == 'MVCC_READ_CONFLICT':
175-
raise LedgerMVCCError(response)
176-
elif 'cannot change status' in response:
179+
if 'cannot change status' in response:
177180
raise LedgerStatusError(response)
178181
else:
179182
raise LedgerBadResponse(response)

0 commit comments

Comments
 (0)