Skip to content
Snippets Groups Projects
user avatar
Konstantin Osipov authored
Send error messages to the client.

Before this patch, Tarantool would only send an error
code to the client, but record all the details in its error log.

This patch extends the client/server protocol and adds
error text to it. This text can now contain not only
a staple message that corresponds to the error, but
problem-related additional information, such as namespace id,
field number, etc.

All errors still can be logged in the error log, but
not all of them need to be. For errors, which are only
sent to the client, this patch uses ClientError exception
class. Errors which also need to be logged in the error log
must use LoggedError exception class.

To choose between the two, the following rule of thumb is applied:
- client application errors, which, generally, can be non-errors at all,
  such as access to a non-existing namespace, index or field, or
  access to a locked tuple are not logged
- execution and protocol errors, such as an error writing to disk,
an message that doesn't follow the protocol format, is logged.

For the most common error, ER_TUPLE_IS_RO, we do not use
string template to reduce CPU cycles necessary to produce this error
(on my machine one can raise ~200 000 exceptions per second, which is not
too much).

An addition to the above, this patch renames error codes, to
make them shorter (ERR_CODE_* -> ER_*) and rewrites the iproto.m
client connection loop to make it a trifle more efficient.

This patch also fixes a couple of bugs:
- in exception.m, [tnt_Exception alloc]
when we reused the old exception class, we did
not reset its 'isa' pointer, which could lead to a crash
when a message with a different signature was sent to
it.

- in box_dispatch (renamed from box_dispach),
when logging for slow commands was done, txn->op could
already be overwritten by txn_commit()/txn_abort().

A comment on the naming scheme: prefixing every Tarantool
piece of method/data structure with tnt_ would lead
to very bloated code. So in this patch
I decided to reduce the use this
prefix to the client library code and some very
generic names only.
9b3d0a76
History