Allow kill-child-proc-with-root-perms to fail silently in `tractor` reaping

marketstore
Tyler Goodlet 2022-03-06 17:05:06 -05:00
parent 981735669c
commit c63eb91f6f
1 changed files with 56 additions and 26 deletions

View File

@ -167,7 +167,7 @@ async def open_docker(
@tractor.context @tractor.context
async def open_marketstore( async def open_marketstored(
ctx: tractor.Context, ctx: tractor.Context,
**kwargs, **kwargs,
@ -272,8 +272,9 @@ async def open_marketstore(
await process_logs_until('exiting...',) await process_logs_until('exiting...',)
except ( except (
trio.Cancelled, BaseException,
KeyboardInterrupt, # trio.Cancelled,
# KeyboardInterrupt,
): ):
cntr.kill('SIGINT') cntr.kill('SIGINT')
with trio.move_on_after(0.5) as cs: with trio.move_on_after(0.5) as cs:
@ -310,34 +311,63 @@ async def start_ahab(
''' '''
cn_ready = trio.Event() cn_ready = trio.Event()
async with tractor.open_nursery( try:
loglevel='runtime', async with tractor.open_nursery(
) as tn: loglevel='runtime',
) as tn:
portal = await tn.start_actor( portal = await tn.start_actor(
service_name, service_name,
enable_modules=[__name__] enable_modules=[__name__]
)
# de-escalate root perms to the original user
# after the docker supervisor actor is spawned.
if config._parent_user:
import pwd
os.setuid(
pwd.getpwnam(
config._parent_user
)[2] # named user's uid
) )
task_status.started(cn_ready) # TODO: we have issues with this on teardown
# where ``tractor`` tries to issue ``os.kill()``
# and hits perms errors since the root process
# doesn't any longer have root perms..
async with portal.open_context( # de-escalate root perms to the original user
open_marketstore, # after the docker supervisor actor is spawned.
) as (ctx, first): if config._parent_user:
import pwd
os.setuid(
pwd.getpwnam(
config._parent_user
)[2] # named user's uid
)
assert str(first) task_status.started(cn_ready)
# run till cancelled
await trio.sleep_forever() async with portal.open_context(
open_marketstored,
) as (ctx, first):
assert str(first)
# run till cancelled
await trio.sleep_forever()
# since we demoted root perms in this parent
# we'll get a perms error on proc cleanup in
# ``tractor`` nursery exit. just make sure
# the child is terminated and don't raise the
# error if so.
# TODO: we could also consider adding
# a ``tractor.ZombieDetected`` or something that we could raise
# if we find the child didn't terminate.
# await tractor.breakpoint()
except PermissionError:
log.warning('Failed to cancel root permsed container')
except (
trio.MultiError,
) as err:
for subexc in err.exceptions:
if isinstance(subexc, PermissionError):
log.warning('Failed to cancel root perms-ed container')
return
else:
raise
async def main(): async def main():