`_ems`: tolerate and warn on already popped execs
In the `translate_and_relay_brokerd_events()` loop task that is, such that we never crash on a `status_msg = book._active.pop(oid)` in the 'closed' status handler whenever a double removal happens. Turns out there were unforeseen races here when a benign backend error would cause an order-mode dialog to be cancelled (incorrectly) and then a UI side `.on_cancel()` would trigger too-early removal from the `book._active` table despite the backend sending an actual 'closed' event (much) later, this would crash on the now missing entry.. So instead we now, - obviously use `book._active.pop(oid, None)` - emit a `log.warning()` (not info lol) on a null-read and with a less "one-line-y" message explaining the double removal and maybe *why*.qt_w_graceful_SIGINT
parent
62f27bf509
commit
0462415491
|
@ -388,6 +388,7 @@ async def open_brokerd_dialog(
|
||||||
for ep_name in [
|
for ep_name in [
|
||||||
'open_trade_dialog', # probably final name?
|
'open_trade_dialog', # probably final name?
|
||||||
'trades_dialogue', # legacy
|
'trades_dialogue', # legacy
|
||||||
|
# ^!TODO, rm this since all backends ported no ?!?
|
||||||
]:
|
]:
|
||||||
trades_endpoint = getattr(
|
trades_endpoint = getattr(
|
||||||
brokermod,
|
brokermod,
|
||||||
|
@ -1019,8 +1020,18 @@ async def translate_and_relay_brokerd_events(
|
||||||
)
|
)
|
||||||
|
|
||||||
if status == 'closed':
|
if status == 'closed':
|
||||||
log.info(f'Execution for {oid} is complete!')
|
log.info(
|
||||||
status_msg = book._active.pop(oid)
|
f'Execution is complete!\n'
|
||||||
|
f'oid: {oid!r}\n'
|
||||||
|
)
|
||||||
|
status_msg = book._active.pop(oid, None)
|
||||||
|
if status_msg is None:
|
||||||
|
log.warning(
|
||||||
|
f'Order was already cleared from book ??\n'
|
||||||
|
f'oid: {oid!r}\n'
|
||||||
|
f'\n'
|
||||||
|
f'Maybe the order cancelled before submitted ??\n'
|
||||||
|
)
|
||||||
|
|
||||||
elif status == 'canceled':
|
elif status == 'canceled':
|
||||||
log.cancel(f'Cancellation for {oid} is complete!')
|
log.cancel(f'Cancellation for {oid} is complete!')
|
||||||
|
@ -1544,19 +1555,18 @@ async def maybe_open_trade_relays(
|
||||||
|
|
||||||
@tractor.context
|
@tractor.context
|
||||||
async def _emsd_main(
|
async def _emsd_main(
|
||||||
ctx: tractor.Context,
|
ctx: tractor.Context, # becomes `ems_ctx` below
|
||||||
fqme: str,
|
fqme: str,
|
||||||
exec_mode: str, # ('paper', 'live')
|
exec_mode: str, # ('paper', 'live')
|
||||||
loglevel: str|None = None,
|
loglevel: str|None = None,
|
||||||
|
|
||||||
) -> tuple[
|
) -> tuple[ # `ctx.started()` value!
|
||||||
dict[
|
dict[ # positions
|
||||||
# brokername, acctid
|
tuple[str, str], # brokername, acctid
|
||||||
tuple[str, str],
|
|
||||||
list[BrokerdPosition],
|
list[BrokerdPosition],
|
||||||
],
|
],
|
||||||
list[str],
|
list[str], # accounts
|
||||||
dict[str, Status],
|
dict[str, Status], # dialogs
|
||||||
]:
|
]:
|
||||||
'''
|
'''
|
||||||
EMS (sub)actor entrypoint providing the execution management
|
EMS (sub)actor entrypoint providing the execution management
|
||||||
|
|
Loading…
Reference in New Issue