From cc4f45b86b44fe8ac552cfd22b7c16beaf9e4bd8 Mon Sep 17 00:00:00 2001 From: Dmitry Simonenko Date: Thu, 15 Jun 2017 16:16:44 +0300 Subject: [PATCH] odissey: log detailed server error messages --- lib/shapito | 2 +- src/od_auth.c | 5 +++-- src/od_backend.c | 29 +++++++++++++++++++++++++++-- src/od_backend.h | 1 + src/od_frontend.c | 7 +++++++ 5 files changed, 39 insertions(+), 5 deletions(-) diff --git a/lib/shapito b/lib/shapito index 3bcc0a82..16878a14 160000 --- a/lib/shapito +++ b/lib/shapito @@ -1 +1 @@ -Subproject commit 3bcc0a82f93c8814c7f7b0f2eb3afecf48384278 +Subproject commit 16878a14c0b54e8bf98bf1fa20f6a55b1434ce22 diff --git a/src/od_auth.c b/src/od_auth.c index c089bc7b..731338f3 100644 --- a/src/od_auth.c +++ b/src/od_auth.c @@ -43,6 +43,7 @@ #include "od_pooler.h" #include "od_relay.h" #include "od_frontend.h" +#include "od_backend.h" #include "od_auth.h" static inline int @@ -440,8 +441,8 @@ int od_auth_backend(od_server_t *server) } return 0; case 'E': - od_error_server(&instance->log, server->id, "auth", - "authentication error"); + od_backend_error(server, "auth", stream->s, + so_stream_used(stream)); return -1; } } diff --git a/src/od_backend.c b/src/od_backend.c index c0295738..d5b62c0f 100644 --- a/src/od_backend.c +++ b/src/od_backend.c @@ -109,6 +109,24 @@ od_backend_startup(od_server_t *server) return 0; } +void od_backend_error(od_server_t *server, char *state, uint8_t *data, int size) +{ + od_instance_t *instance = server->system->instance; + so_feerror_t error; + int rc; + rc = so_feread_error(&error, data, size); + if (rc == -1) { + od_error_server(&instance->log, server->id, state, + "failed to parse error message from server"); + return; + } + od_error_server(&instance->log, server->id, state, + "%s %s %s", + error.severity, + error.code, + error.message); +} + int od_backend_ready(od_server_t *server, uint8_t *data, int size) { int status; @@ -151,6 +169,11 @@ od_backend_ready_wait(od_server_t *server, char *procedure, int time_ms) uint8_t type = stream->s[rc]; od_debug_server(&instance->log, server->id, procedure, "%c", type); + /* ErrorResponse */ + if (type == 'E') { + od_backend_error(server, procedure, stream->s, + so_stream_used(stream)); + } /* ReadyForQuery */ if (type == 'Z') { od_backend_ready(server, stream->s + rc, @@ -204,11 +227,13 @@ od_backend_setup(od_server_t *server) /* ParameterStatus */ case 'S': break; - /* NoticeResponce */ + /* NoticeResponse */ case 'N': break; - /* ErrorResponce */ + /* ErrorResponse */ case 'E': + od_backend_error(server, "setup", stream->s, + so_stream_used(stream)); return -1; default: od_debug_server(&instance->log, server->id, "setup", diff --git a/src/od_backend.h b/src/od_backend.h index 29fff112..97160c22 100644 --- a/src/od_backend.h +++ b/src/od_backend.h @@ -13,6 +13,7 @@ od_backend_new(od_router_t*, od_route_t*); void od_backend_close(od_server_t*); int od_backend_terminate(od_server_t*); int od_backend_reset(od_server_t*); +void od_backend_error(od_server_t*, char*, uint8_t*, int); int od_backend_ready(od_server_t*, uint8_t*, int); int od_backend_configure(od_server_t*, so_bestartup_t*); int od_backend_discard(od_server_t*); diff --git a/src/od_frontend.c b/src/od_frontend.c index 51d4ce33..0932ef1d 100644 --- a/src/od_frontend.c +++ b/src/od_frontend.c @@ -344,6 +344,13 @@ od_frontend_main(od_client_t *client) od_debug_server(&instance->log, server->id, NULL, "%c", type); + /* ErrorResponse */ + if (type == 'E') { + od_backend_error(server, NULL, + stream->s + rc, + so_stream_used(stream) - rc); + } + /* ReadyForQuery */ if (type == 'Z') { rc = od_backend_ready(server, stream->s + rc,