Allow kill-child-proc-with-root-perms to fail silently in `tractor` reaping
parent
8003878248
commit
3d6d77364b
|
@ -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():
|
||||||
|
|
Loading…
Reference in New Issue