Changed run_async to properly relay remote error messages to the user-supplied errback.
This commit is contained in:
parent
056fee5c70
commit
e25ac1e46b
2 changed files with 33 additions and 24 deletions
|
|
@ -121,6 +121,7 @@ class ProcPoolChild(AMPChild):
|
||||||
except Exception:
|
except Exception:
|
||||||
# use exec instead
|
# use exec instead
|
||||||
exec source in available_vars
|
exec source in available_vars
|
||||||
|
|
||||||
return {'response': _return.get_returns()}
|
return {'response': _return.get_returns()}
|
||||||
ExecuteCode.responder(executecode)
|
ExecuteCode.responder(executecode)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ except ImportError:
|
||||||
import pickle
|
import pickle
|
||||||
|
|
||||||
ENCODINGS = settings.ENCODINGS
|
ENCODINGS = settings.ENCODINGS
|
||||||
|
_LOGGER = None
|
||||||
|
|
||||||
def is_iter(iterable):
|
def is_iter(iterable):
|
||||||
"""
|
"""
|
||||||
|
|
@ -556,6 +557,18 @@ def run_async(to_execute, *args, **kwargs):
|
||||||
If a string, this string must be a source snippet.
|
If a string, this string must be a source snippet.
|
||||||
This string will executed using the ProcPool is
|
This string will executed using the ProcPool is
|
||||||
enabled, if not this will raise a RunTimeError.
|
enabled, if not this will raise a RunTimeError.
|
||||||
|
|
||||||
|
reserved kwargs:
|
||||||
|
'at_return' -should point to a callable with one argument.
|
||||||
|
It will be called with the return value from
|
||||||
|
to_execute.
|
||||||
|
'at_return_kwargs' - this dictionary which be used as keyword
|
||||||
|
arguments to the at_return callback.
|
||||||
|
'at_err' - this will be called with a Failure instance if
|
||||||
|
there is an error in to_execute.
|
||||||
|
'at_err_kwargs' - this dictionary will be used as keyword
|
||||||
|
arguments to the at_err errback.
|
||||||
|
|
||||||
*args - if to_execute is a callable, these args will be used
|
*args - if to_execute is a callable, these args will be used
|
||||||
as arguments for that function. If to_execute is a string
|
as arguments for that function. If to_execute is a string
|
||||||
*args are not used.
|
*args are not used.
|
||||||
|
|
@ -564,18 +577,6 @@ def run_async(to_execute, *args, **kwargs):
|
||||||
instead are used to define the executable environment
|
instead are used to define the executable environment
|
||||||
that should be available to execute the code in to_execute.
|
that should be available to execute the code in to_execute.
|
||||||
|
|
||||||
There are two special (optional) kwargs. These are available
|
|
||||||
both if to_execute is a callable or a source string.
|
|
||||||
'at_return' -should point to a callable with one argument.
|
|
||||||
It will be called with the return value from
|
|
||||||
to_execute.
|
|
||||||
'at_return_kwargs' - this dictionary which be used as keyword
|
|
||||||
arguments to the at_return callback.
|
|
||||||
'at_err' - this will be called with a Failure instance if
|
|
||||||
there is an error in to_execute.
|
|
||||||
'at_err_kwargs' - this dictionary will be used as keyword
|
|
||||||
arguments to the at_err errback.
|
|
||||||
|
|
||||||
run_async will either relay the code to a thread or to a processPool
|
run_async will either relay the code to a thread or to a processPool
|
||||||
depending on input and what is available in the system. To activate
|
depending on input and what is available in the system. To activate
|
||||||
Process pooling, settings.PROCPOOL_ENABLE must be set.
|
Process pooling, settings.PROCPOOL_ENABLE must be set.
|
||||||
|
|
@ -615,19 +616,30 @@ def run_async(to_execute, *args, **kwargs):
|
||||||
if not _PCMD:
|
if not _PCMD:
|
||||||
from src.server.procpool import ExecuteCode as _PCMD
|
from src.server.procpool import ExecuteCode as _PCMD
|
||||||
|
|
||||||
# determine callbacks/errbacks
|
# helper converters for callbacks/errbacks
|
||||||
def default_errback(e):
|
|
||||||
from src.utils import logger
|
|
||||||
logger.log_trace(e)
|
|
||||||
def convert_return(f):
|
def convert_return(f):
|
||||||
def func(ret):
|
def func(ret, *args, **kwargs):
|
||||||
rval = ret["response"] and from_pickle(ret["response"])
|
rval = ret["response"] and from_pickle(ret["response"])
|
||||||
if f: return f(rval)
|
if f: return f(rval, *args, **kwargs)
|
||||||
else: return rval
|
else: return rval
|
||||||
return func
|
return func
|
||||||
|
def convert_err(f):
|
||||||
|
def func(err, *args, **kwargs):
|
||||||
|
err.trap(Exception)
|
||||||
|
err = err.getErrorMessage()
|
||||||
|
if f:
|
||||||
|
return f(err, *args, **kwargs)
|
||||||
|
else:
|
||||||
|
global _LOGGER
|
||||||
|
if not _LOGGER:
|
||||||
|
from src.utils import logger as _LOGGER
|
||||||
|
err = "Error reported from subprocess: '%s'" % err
|
||||||
|
_LOGGER.log_errmsg(err)
|
||||||
|
return func
|
||||||
|
|
||||||
|
# handle special reserved input kwargs
|
||||||
callback = convert_return(kwargs.pop("at_return", None))
|
callback = convert_return(kwargs.pop("at_return", None))
|
||||||
errback = kwargs.pop("at_err", None)
|
errback = convert_err(kwargs.pop("at_err", None))
|
||||||
callback_kwargs = kwargs.pop("at_return_kwargs", {})
|
callback_kwargs = kwargs.pop("at_return_kwargs", {})
|
||||||
errback_kwargs = kwargs.pop("at_err_kwargs", {})
|
errback_kwargs = kwargs.pop("at_err_kwargs", {})
|
||||||
|
|
||||||
|
|
@ -647,11 +659,7 @@ def run_async(to_execute, *args, **kwargs):
|
||||||
# attach callbacks
|
# attach callbacks
|
||||||
if callback:
|
if callback:
|
||||||
deferred.addCallback(callback, **callback_kwargs)
|
deferred.addCallback(callback, **callback_kwargs)
|
||||||
if errback:
|
deferred.addErrback(errback, **errback_kwargs)
|
||||||
deferred.addCallback(errback, **errback_kwargs)
|
|
||||||
# always add a logging errback as a last catch
|
|
||||||
deferred.addErrback(default_errback)
|
|
||||||
|
|
||||||
|
|
||||||
def check_evennia_dependencies():
|
def check_evennia_dependencies():
|
||||||
"""
|
"""
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue