odissey: add extra log details for every io error

This commit is contained in:
Dmitry Simonenko 2017-04-05 15:21:43 +03:00
parent 976f677d7f
commit 7d73f4a1d0
7 changed files with 106 additions and 28 deletions

View File

@ -50,14 +50,20 @@ od_authfe_cleartext(od_client_t *client)
if (rc == -1)
return -1;
rc = od_write(client->io, stream);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, client->io, "C (auth): write error: %s",
machine_error(client->io));
return -1;
}
/* wait for password response */
while (1) {
rc = od_read(client->io, stream, 0);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, client->io, "C (auth): read error: %s",
machine_error(client->io));
return -1;
}
uint8_t type = *stream->s;
od_debug(&pooler->od->log, client->io, "C (auth): %c", *stream->s);
/* PasswordMessage */
@ -111,15 +117,21 @@ od_authfe_md5(od_client_t *client)
if (rc == -1)
return -1;
rc = od_write(client->io, stream);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, client->io, "C (auth): write error: %s",
machine_error(client->io));
return -1;
}
/* wait for password response */
while (1) {
int rc;
rc = od_read(client->io, stream, 0);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, client->io, "C (auth): read error: %s",
machine_error(client->io));
return -1;
}
uint8_t type = *stream->s;
od_debug(&pooler->od->log, client->io, "C (auth): %c",
*stream->s);
@ -224,7 +236,12 @@ int od_authfe(od_client_t *client)
if (rc == -1)
return -1;
rc = od_write(client->io, stream);
return rc;
if (rc == -1) {
od_error(&pooler->od->log, client->io, "C (auth): write error: %s",
machine_error(client->io));
return -1;
}
return 0;
}
static inline int
@ -258,6 +275,8 @@ od_authbe_cleartext(od_server_t *server)
}
rc = od_write(server->io, stream);
if (rc == -1) {
od_error(&pooler->od->log, server->io, "S (auth): write error: %s",
machine_error(server->io));
return -1;
}
return 0;
@ -311,6 +330,8 @@ od_authbe_md5(od_server_t *server, uint8_t salt[4])
}
rc = od_write(server->io, stream);
if (rc == -1) {
od_error(&pooler->od->log, server->io, "S (auth): write error: %s",
machine_error(server->io));
return -1;
}
return 0;
@ -360,8 +381,11 @@ int od_authbe(od_server_t *server)
while (1) {
int rc;
rc = od_read(server->io, &server->stream, 0);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, server->io, "S (auth): read error: %s",
machine_error(server->io));
return -1;
}
char type = *server->stream.s;
od_debug(&pooler->od->log, server->io, "S (auth): %c",
type);

View File

@ -76,6 +76,7 @@ int od_beclose(od_server_t *server)
static int
od_bestartup(od_server_t *server)
{
od_pooler_t *pooler = server->pooler;
od_route_t *route = server->route;
so_stream_t *stream = &server->stream;
so_stream_reset(stream);
@ -88,8 +89,11 @@ od_bestartup(od_server_t *server)
if (rc == -1)
return -1;
rc = od_write(server->io, stream);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, server->io, "S (startup): write error: %s",
machine_error(server->io));
return -1;
}
server->count_request++;
return 0;
}
@ -102,8 +106,11 @@ od_besetup(od_server_t *server)
while (1) {
int rc;
rc = od_read(server->io, &server->stream, 0);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, server->io, "S (setup): write error: %s",
machine_error(server->io));
return -1;
}
char type = *server->stream.s;
od_debug(&pooler->od->log, server->io, "S (setup): %c", type);
switch (type) {
@ -162,14 +169,21 @@ od_beconnect_tls(od_pooler_t *pooler, od_server_t *server,
if (rc == -1)
return -1;
rc = od_write(server->io, stream);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, server->io, "S (tls): write error: %s",
machine_error(server->io));
return -1;
}
/* read server reply */
so_stream_reset(stream);
rc = machine_read(server->io, (char*)stream->p, 1, 0);
if (rc < 0)
if (rc < 0) {
od_error(&pooler->od->log, server->io,
"S (tls): read error: %s",
machine_error(server->io));
return -1;
}
switch (*stream->p) {
case 'S':
/* supported */
@ -436,8 +450,11 @@ od_beready_wait(od_server_t *server, char *procedure, int time_ms)
while (1) {
int rc;
rc = od_read(server->io, stream, time_ms);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, server->io, "S (%s): write error: %s",
procedure, machine_error(server->io));
return -1;
}
uint8_t type = *stream->s;
od_debug(&pooler->od->log, server->io, "S (%s): %c",
procedure, type);
@ -452,6 +469,7 @@ od_beready_wait(od_server_t *server, char *procedure, int time_ms)
static inline int
od_bequery(od_server_t *server, char *procedure, char *query, int len)
{
od_pooler_t *pooler = server->pooler;
int rc;
so_stream_t *stream = &server->stream;
so_stream_reset(stream);
@ -459,8 +477,11 @@ od_bequery(od_server_t *server, char *procedure, char *query, int len)
if (rc == -1)
return -1;
rc = od_write(server->io, stream);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, server->io, "S (%s): write error: %s",
procedure, machine_error(server->io));
return -1;
}
server->count_request++;
rc = od_beready_wait(server, procedure, 0);
if (rc == -1)

View File

@ -98,7 +98,11 @@ int od_cancel_of(od_pooler_t *pooler,
so_stream_free(&stream);
return -1;
}
od_write(io, &stream);
rc = od_write(io, &stream);
if (rc == -1) {
od_error(&pooler->od->log, io, "(cancel): write error: %s",
machine_error(io));
}
machine_close(io);
so_stream_free(&stream);
return 0;

View File

@ -78,6 +78,7 @@ int od_feerror(od_client_t *client, char *fmt, ...)
static int
od_festartup_read(od_client_t *client)
{
od_pooler_t *pooler = client->pooler;
so_stream_t *stream = &client->stream;
so_stream_reset(stream);
for (;;) {
@ -88,14 +89,21 @@ od_festartup_read(od_client_t *client)
to_read = so_read_startup(&len, &pos_data, &pos_size);
if (to_read == 0)
break;
if (to_read == -1)
if (to_read == -1) {
od_error(&pooler->od->log, client->io,
"C (startup): bad startup packet");
return -1;
}
int rc = so_stream_ensure(stream, to_read);
if (rc == -1)
return -1;
rc = machine_read(client->io, (char*)stream->p, to_read, 0);
if (rc < 0)
if (rc < 0) {
od_error(&pooler->od->log, client->io,
"C (startup): read error: %s",
machine_error(client->io));
return -1;
}
so_stream_advance(stream, to_read);
}
return 0;
@ -124,8 +132,11 @@ int od_festartup(od_client_t *client)
/* not supported 'N' */
so_stream_write8(stream, 'N');
rc = od_write(client->io, stream);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, client->io, "C (tls): write error: %s",
machine_error(client->io));
return -1;
}
od_log(&pooler->od->log, client->io,
"C (tls): disabled, closing");
return -1;
@ -133,12 +144,15 @@ int od_festartup(od_client_t *client)
/* supported 'S' */
so_stream_write8(stream, 'S');
rc = od_write(client->io, stream);
if (rc == -1)
if (rc == -1) {
od_error(&pooler->od->log, client->io, "C (tls): write error: %s",
machine_error(client->io));
return -1;
}
rc = machine_set_tls(client->io, pooler->tls);
if (rc == -1) {
od_log(&pooler->od->log, client->io,
"C (tls): error: %s", machine_error(client->io));
od_error(&pooler->od->log, client->io,
"C (tls): error: %s", machine_error(client->io));
return -1;
}
od_debug(&pooler->od->log, client->io, "C (tls): ok");
@ -179,6 +193,7 @@ int od_fekey(od_client_t *client)
int od_fesetup(od_client_t *client)
{
od_pooler_t *pooler = client->pooler;
so_stream_t *stream = &client->stream;
so_stream_reset(stream);
int rc;
@ -190,11 +205,17 @@ int od_fesetup(od_client_t *client)
if (rc == -1)
return -1;
rc = od_write(client->io, stream);
return rc;
if (rc == -1) {
od_error(&pooler->od->log, client->io, "C (setup): write error: %s",
machine_error(client->io));
return -1;
}
return 0;
}
int od_feready(od_client_t *client)
{
od_pooler_t *pooler = client->pooler;
so_stream_t *stream = &client->stream;
so_stream_reset(stream);
int rc;
@ -202,5 +223,10 @@ int od_feready(od_client_t *client)
if (rc == -1)
return -1;
rc = od_write(client->io, stream);
return rc;
if (rc == -1) {
od_error(&pooler->od->log, client->io, "C: write error: %s",
machine_error(client->io));
return -1;
}
return 0;
}

View File

@ -7,8 +7,8 @@
* PostgreSQL connection pooler and request router.
*/
int od_read(machine_io_t, so_stream_t*, int);
int od_write(machine_io_t, so_stream_t*);
int od_read(machine_io_t, so_stream_t*, int);
int od_write(machine_io_t, so_stream_t*);
char *od_getpeername(machine_io_t);

View File

@ -170,10 +170,12 @@ void od_router(void *arg)
case OD_RS_ECLIENT_WRITE:
if (status == OD_RS_OK)
od_log(&pooler->od->log, client->io,
"C: disconnected");
"C: disconnected: %s",
machine_error(client->io));
else
od_log(&pooler->od->log, client->io,
"C: disconnected (read/write error)");
"C: disconnected (read/write error): %s",
machine_error(client->io));
/* close client connection and reuse server
* link in case of client errors and
* graceful shutdown */
@ -183,7 +185,8 @@ void od_router(void *arg)
break;
case OD_RS_ESERVER_CONFIGURE:
od_log(&pooler->od->log, server->io,
"S: disconnected (server configure error)");
"S: disconnected (server configure error): %s",
machine_error(server->io));
od_feclose(client);
if (server)
od_beclose(server);
@ -191,7 +194,8 @@ void od_router(void *arg)
case OD_RS_ESERVER_READ:
case OD_RS_ESERVER_WRITE:
od_log(&pooler->od->log, server->io,
"S: disconnected (read/write error)");
"S: disconnected (read/write error): %s",
machine_error(server->io));
/* close client connection and close server
* connection in case of server errors */
od_feclose(client);

View File

@ -81,7 +81,6 @@ od_router_transaction(od_client_t *client)
rc = od_read(client->io, stream, 0);
if (rc == -1)
return OD_RS_ECLIENT_READ;
type = *stream->s;
od_debug(&pooler->od->log, client->io, "C: %c", *stream->s);