[API] Remove deadlock detection code

It triggered for things that were not deadlocks causing more harm than good.
Also the newer algorithms in 4.x onwards should not require it.

Change-Id: I476a17ea5da5b760ab6c681a64af34b70e97c0f9
This commit is contained in:
Andrew Hutchings
2013-11-21 13:55:21 +00:00
committed by David Shrewsbury
parent 7c6254ac54
commit 80ed39a74b

View File

@@ -29,7 +29,6 @@ from libra.api.library.exp import ImmutableEntity
from libra.openstack.common import log from libra.openstack.common import log
from libra.common.exc import DetailError from libra.common.exc import DetailError
from wsme.rest.json import tojson from wsme.rest.json import tojson
from sqlalchemy.exc import OperationalError, ResourceClosedError
LOG = log.getLogger(__name__) LOG = log.getLogger(__name__)
@@ -94,63 +93,45 @@ def wsexpose(*args, **kwargs):
@functools.wraps(f) @functools.wraps(f)
def callfunction(self, *args, **kwargs): def callfunction(self, *args, **kwargs):
for x in xrange(5): try:
old_args = args args, kwargs = wsme.rest.args.get_args(
old_kwargs = kwargs funcdef, args, kwargs, pecan.request.params, None,
try: pecan.request.body, pecan.request.content_type
args, kwargs = wsme.rest.args.get_args(
funcdef, args, kwargs, pecan.request.params, None,
pecan.request.body, pecan.request.content_type
)
if funcdef.pass_request:
kwargs[funcdef.pass_request] = pecan.request
result = f(self, *args, **kwargs)
# NOTE: Support setting of status_code with default 201
pecan.response.status = funcdef.status_code
if isinstance(result, wsme.api.Response):
pecan.response.status = result.status_code
result = result.obj
# ResourceClosedError happens on for_update deadlock
except (OperationalError, ResourceClosedError):
LOG.warning(
"Galera deadlock, retry {0}".format(x + 1)
)
args = old_args
kwargs = old_kwargs
continue
except:
data = wsme.api.format_exception(
sys.exc_info(),
pecan.conf.get('wsme', {}).get('debug', False)
)
e = sys.exc_info()[1]
if isinstance(e, OverLimit):
pecan.response.status = 413
elif isinstance(e, ImmutableEntity):
pecan.response.status = 422
elif isinstance(e, NotFound):
pecan.response.status = 404
elif isinstance(e, NotAuthorized):
pecan.response.status = 401
elif data['message'] == 'Bad Request':
pecan.response.status = 400
else:
pecan.response.status = 500
return data
return dict(
datatype=funcdef.return_type,
result=result
) )
# After 5 retries of transaction, give up! if funcdef.pass_request:
data = wsme.api.format_exception( kwargs[funcdef.pass_request] = pecan.request
sys.exc_info(), result = f(self, *args, **kwargs)
pecan.conf.get('wsme', {}).get('debug', False)
# NOTE: Support setting of status_code with default 201
pecan.response.status = funcdef.status_code
if isinstance(result, wsme.api.Response):
pecan.response.status = result.status_code
result = result.obj
except:
data = wsme.api.format_exception(
sys.exc_info(),
pecan.conf.get('wsme', {}).get('debug', False)
)
e = sys.exc_info()[1]
if isinstance(e, OverLimit):
pecan.response.status = 413
elif isinstance(e, ImmutableEntity):
pecan.response.status = 422
elif isinstance(e, NotFound):
pecan.response.status = 404
elif isinstance(e, NotAuthorized):
pecan.response.status = 401
elif data['message'] == 'Bad Request':
pecan.response.status = 400
else:
pecan.response.status = 500
return data
return dict(
datatype=funcdef.return_type,
result=result
) )
pecan.response.status = 500
return data
pecan_xml_decorate(callfunction) pecan_xml_decorate(callfunction)
pecan_json_decorate(callfunction) pecan_json_decorate(callfunction)