Commit 6a73562c authored by dieter's avatar dieter

fix #156

parent ca4bdf88
......@@ -4,11 +4,27 @@ Changelog
5.3.1 (unreleased)
------------------
- Add ``ConflictError`` to the list of unlogged server exceptions
(the client/its application should determine whether it wants
them logged).
Prevent ``no current transaction: tpc_abort()`` server log entries.
The storage API allows ``tpc_abort`` to be called with an
invalid transaction (the call should be ignored in this case)
and the server's ``tpc_vote`` relies on this.
Change the server's log message label for request exceptions
from ``Bad request ...`` to ``... raised exception:``,
hinting towards a server rather than client problem.
See `issue 156 <https://github.com/zopefoundation/ZEO/issues/156>`_.
5.3.0 (2022-03-24)
------------------
- Remove tests for the `asyncio/mtacceptor` module, it appears unused
- Remove tests for the ``asyncio/mtacceptor`` module, it appears unused
and presents a maintenance burden. The module will be removed in
ZEO version 6.
......
......@@ -182,6 +182,9 @@ class ZEOStorage(object):
raise ReadOnlyError()
if self.transaction is None:
caller = sys._getframe().f_back.f_code.co_name
# ``tpc_abort`` is allowed to be called with invalid transaction
# ``vote`` relies on this
if caller != "tpc_abort":
self.log("no current transaction: %s()" % caller,
level=logging.WARNING)
if exc is not None:
......@@ -190,6 +193,8 @@ class ZEOStorage(object):
return 0
if self.transaction.id != tid:
caller = sys._getframe().f_back.f_code.co_name
# ``tpc_abort`` is allowed to be called with invalid transaction
if caller != "tpc_abort":
self.log("%s(%s) invalid; current transaction = %s" %
(caller, repr(tid), repr(self.transaction.id)),
logging.WARNING)
......
......@@ -24,6 +24,7 @@ class ServerProtocol(base.Protocol):
unlogged_exception_types = (
ZODB.POSException.POSKeyError,
ZODB.POSException.ConflictError,
)
def __init__(self, loop, addr, zeo_storage, msgpack):
......@@ -104,7 +105,8 @@ class ServerProtocol(base.Protocol):
except Exception as exc:
if not isinstance(exc, self.unlogged_exception_types):
logger.exception(
"Bad %srequest, %r", 'async ' if async_ else '', name)
"%s`%r` raised exception:",
'async ' if async_ else '', name)
if async_:
return self.close() # No way to recover/cry for help
else:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment