forked from M-Labs/artiq
worker: make parent errors readable in log.
This commit is contained in:
parent
67d2e7a828
commit
6bf48e60ba
|
@ -180,9 +180,11 @@ class Worker:
|
||||||
try:
|
try:
|
||||||
data = func(*obj["args"], **obj["kwargs"])
|
data = func(*obj["args"], **obj["kwargs"])
|
||||||
reply = {"status": "ok", "data": data}
|
reply = {"status": "ok", "data": data}
|
||||||
except:
|
except Exception as e:
|
||||||
reply = {"status": "failed",
|
reply = {"status": "failed",
|
||||||
"message": traceback.format_exc()}
|
"exception": traceback.format_exception_only(type(e), e)[0][:-1],
|
||||||
|
"message": str(e),
|
||||||
|
"traceback": traceback.format_tb(e.__traceback__)}
|
||||||
await self.io_lock.acquire()
|
await self.io_lock.acquire()
|
||||||
try:
|
try:
|
||||||
await self._send(reply)
|
await self._send(reply)
|
||||||
|
|
|
@ -2,6 +2,7 @@ import sys
|
||||||
import time
|
import time
|
||||||
import os
|
import os
|
||||||
import logging
|
import logging
|
||||||
|
import traceback
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
|
|
||||||
import artiq
|
import artiq
|
||||||
|
@ -30,7 +31,7 @@ class ParentActionError(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def make_parent_action(action, exception=ParentActionError):
|
def make_parent_action(action, exception=None):
|
||||||
def parent_action(*args, **kwargs):
|
def parent_action(*args, **kwargs):
|
||||||
request = {"action": action, "args": args, "kwargs": kwargs}
|
request = {"action": action, "args": args, "kwargs": kwargs}
|
||||||
put_object(request)
|
put_object(request)
|
||||||
|
@ -43,7 +44,12 @@ def make_parent_action(action, exception=ParentActionError):
|
||||||
if reply["status"] == "ok":
|
if reply["status"] == "ok":
|
||||||
return reply["data"]
|
return reply["data"]
|
||||||
else:
|
else:
|
||||||
raise exception(reply["message"])
|
if exception is None:
|
||||||
|
exn = ParentActionError(reply["exception"])
|
||||||
|
else:
|
||||||
|
exn = exception(reply["message"])
|
||||||
|
exn.parent_traceback = reply["traceback"]
|
||||||
|
raise exn
|
||||||
return parent_action
|
return parent_action
|
||||||
|
|
||||||
|
|
||||||
|
@ -172,10 +178,14 @@ def string_to_hdf5(f, key, value):
|
||||||
|
|
||||||
def setup_diagnostics(experiment_file, repository_path):
|
def setup_diagnostics(experiment_file, repository_path):
|
||||||
def render_diagnostic(self, diagnostic):
|
def render_diagnostic(self, diagnostic):
|
||||||
message = "Cannot compile {}\n".format(experiment_file) + \
|
message = "While compiling {}\n".format(experiment_file) + \
|
||||||
_render_diagnostic(diagnostic, colored=False)
|
_render_diagnostic(diagnostic, colored=False)
|
||||||
if repository_path is not None:
|
if repository_path is not None:
|
||||||
message = message.replace(repository_path, "<repository>")
|
message = message.replace(repository_path, "<repository>")
|
||||||
|
|
||||||
|
if diagnostic.level == 'warning':
|
||||||
|
logging.warn(message)
|
||||||
|
else:
|
||||||
logging.error(message)
|
logging.error(message)
|
||||||
|
|
||||||
# This is kind of gross, but 1) we do not have any explicit connection
|
# This is kind of gross, but 1) we do not have any explicit connection
|
||||||
|
@ -256,12 +266,12 @@ def main():
|
||||||
except CompileError:
|
except CompileError:
|
||||||
pass
|
pass
|
||||||
except Exception as exc:
|
except Exception as exc:
|
||||||
short_exc_info = type(exc).__name__
|
lines = ["Terminating with exception\n"]
|
||||||
exc_str = str(exc)
|
lines += traceback.format_exception_only(type(exc), exc)
|
||||||
if exc_str:
|
if hasattr(exc, 'parent_traceback'):
|
||||||
short_exc_info += ": " + exc_str
|
lines += exc.parent_traceback
|
||||||
logging.error("Terminating with exception (%s)",
|
logging.error("".join(lines).rstrip(),
|
||||||
short_exc_info, exc_info=True)
|
exc_info=not hasattr(exc, 'parent_traceback'))
|
||||||
finally:
|
finally:
|
||||||
device_mgr.close_devices()
|
device_mgr.close_devices()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue