odissey: major rework of server/client ids

This commit is contained in:
Dmitry Simonenko 2017-06-20 18:39:52 +03:00
parent cad4a813cf
commit a94acec1c8
25 changed files with 175 additions and 171 deletions

View File

@ -20,13 +20,13 @@
#include "od_version.h" #include "od_version.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_daemon.h" #include "od_daemon.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_msg.h" #include "od_msg.h"
#include "od_system.h" #include "od_system.h"
#include "od_instance.h" #include "od_instance.h"
@ -61,7 +61,7 @@ od_auth_frontend_cleartext(od_client_t *client)
return -1; return -1;
rc = od_write(client->io, stream); rc = od_write(client->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, od_error_client(&instance->log, &client->id,
"auth", "write error: %s", "auth", "write error: %s",
machine_error(client->io)); machine_error(client->io));
return -1; return -1;
@ -72,14 +72,14 @@ od_auth_frontend_cleartext(od_client_t *client)
so_stream_reset(stream); so_stream_reset(stream);
rc = od_read(client->io, stream, UINT32_MAX); rc = od_read(client->io, stream, UINT32_MAX);
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, "auth", od_error_client(&instance->log, &client->id, "auth",
"read error: %s", "read error: %s",
machine_error(client->io)); machine_error(client->io));
return -1; return -1;
} }
uint8_t type = *stream->s; uint8_t type = *stream->s;
od_debug_client(&instance->log, od_debug_client(&instance->log, &client->id, "auth",
client->id, "auth", "%c", *stream->s); "%c", *stream->s);
/* PasswordMessage */ /* PasswordMessage */
if (type == 'p') if (type == 'p')
break; break;
@ -91,7 +91,7 @@ od_auth_frontend_cleartext(od_client_t *client)
rc = so_beread_password(&client_token, stream->s, rc = so_beread_password(&client_token, stream->s,
so_stream_used(stream)); so_stream_used(stream));
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, "auth", od_error_client(&instance->log, &client->id, "auth",
"password read error"); "password read error");
od_frontend_error(client, SO_ERROR_PROTOCOL_VIOLATION, od_frontend_error(client, SO_ERROR_PROTOCOL_VIOLATION,
"bad password message"); "bad password message");
@ -109,7 +109,7 @@ od_auth_frontend_cleartext(od_client_t *client)
int check = so_password_compare(&client_password, &client_token); int check = so_password_compare(&client_password, &client_token);
so_password_free(&client_token); so_password_free(&client_token);
if (! check) { if (! check) {
od_log_client(&instance->log, client->id, "auth", od_log_client(&instance->log, &client->id, "auth",
"user '%s' incorrect password", "user '%s' incorrect password",
client->startup.user); client->startup.user);
od_frontend_error(client, SO_ERROR_INVALID_PASSWORD, od_frontend_error(client, SO_ERROR_INVALID_PASSWORD,
@ -136,7 +136,7 @@ od_auth_frontend_md5(od_client_t *client)
return -1; return -1;
rc = od_write(client->io, stream); rc = od_write(client->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, "auth", od_error_client(&instance->log, &client->id, "auth",
"write error: %s", "write error: %s",
machine_error(client->io)); machine_error(client->io));
return -1; return -1;
@ -148,13 +148,13 @@ od_auth_frontend_md5(od_client_t *client)
so_stream_reset(stream); so_stream_reset(stream);
rc = od_read(client->io, stream, UINT32_MAX); rc = od_read(client->io, stream, UINT32_MAX);
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, "auth", od_error_client(&instance->log, &client->id, "auth",
"read error: %s", "read error: %s",
machine_error(client->io)); machine_error(client->io));
return -1; return -1;
} }
uint8_t type = *stream->s; uint8_t type = *stream->s;
od_debug_client(&instance->log, client->id, "auth", od_debug_client(&instance->log, &client->id, "auth",
"%c", *stream->s); "%c", *stream->s);
/* PasswordMessage */ /* PasswordMessage */
if (type == 'p') if (type == 'p')
@ -166,7 +166,7 @@ od_auth_frontend_md5(od_client_t *client)
so_password_init(&client_token); so_password_init(&client_token);
rc = so_beread_password(&client_token, stream->s, so_stream_used(stream)); rc = so_beread_password(&client_token, stream->s, so_stream_used(stream));
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, "auth", od_error_client(&instance->log, &client->id, "auth",
"password read error"); "password read error");
od_frontend_error(client, SO_ERROR_PROTOCOL_VIOLATION, od_frontend_error(client, SO_ERROR_PROTOCOL_VIOLATION,
"bad password message"); "bad password message");
@ -184,7 +184,7 @@ od_auth_frontend_md5(od_client_t *client)
client->scheme->password_len, client->scheme->password_len,
(uint8_t*)&salt); (uint8_t*)&salt);
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, "auth", od_error_client(&instance->log, &client->id, "auth",
"memory allocation error"); "memory allocation error");
so_password_free(&client_password); so_password_free(&client_password);
so_password_free(&client_token); so_password_free(&client_token);
@ -196,7 +196,7 @@ od_auth_frontend_md5(od_client_t *client)
so_password_free(&client_password); so_password_free(&client_password);
so_password_free(&client_token); so_password_free(&client_token);
if (! check) { if (! check) {
od_log_client(&instance->log, client->id, "auth", od_log_client(&instance->log, &client->id, "auth",
"user '%s' incorrect password", "user '%s' incorrect password",
client->startup.user); client->startup.user);
od_frontend_error(client, SO_ERROR_INVALID_PASSWORD, od_frontend_error(client, SO_ERROR_INVALID_PASSWORD,
@ -218,7 +218,7 @@ int od_auth_frontend(od_client_t *client)
/* try to use default user */ /* try to use default user */
user_scheme = instance->scheme.users_default; user_scheme = instance->scheme.users_default;
if (user_scheme == NULL) { if (user_scheme == NULL) {
od_error_client(&instance->log, client->id, "auth" od_error_client(&instance->log, &client->id, "auth"
"user '%s' not found", "user '%s' not found",
so_parameter_value(client->startup.user)); so_parameter_value(client->startup.user));
od_frontend_error(client, SO_ERROR_INVALID_AUTHORIZATION_SPECIFICATION, od_frontend_error(client, SO_ERROR_INVALID_AUTHORIZATION_SPECIFICATION,
@ -230,7 +230,7 @@ int od_auth_frontend(od_client_t *client)
/* is user access denied */ /* is user access denied */
if (user_scheme->is_deny) { if (user_scheme->is_deny) {
od_log_client(&instance->log, client->id, "auth", od_log_client(&instance->log, &client->id, "auth",
"user '%s' access denied", "user '%s' access denied",
so_parameter_value(client->startup.user)); so_parameter_value(client->startup.user));
od_frontend_error(client, SO_ERROR_INVALID_AUTHORIZATION_SPECIFICATION, od_frontend_error(client, SO_ERROR_INVALID_AUTHORIZATION_SPECIFICATION,
@ -266,7 +266,7 @@ int od_auth_frontend(od_client_t *client)
return -1; return -1;
rc = od_write(client->io, stream); rc = od_write(client->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, "auth", od_error_client(&instance->log, &client->id, "auth",
"write error: %s", "write error: %s",
machine_error(client->io)); machine_error(client->io));
return -1; return -1;
@ -281,12 +281,12 @@ od_auth_backend_cleartext(od_server_t *server)
od_route_t *route = server->route; od_route_t *route = server->route;
assert(route != NULL); assert(route != NULL);
od_debug_server(&instance->log, server->id, "auth", od_debug_server(&instance->log, &server->id, "auth",
"requested clear-text authentication"); "requested clear-text authentication");
/* validate route scheme */ /* validate route scheme */
if (route->scheme->password == NULL) { if (route->scheme->password == NULL) {
od_error_server(&instance->log, server->id, "auth" od_error_server(&instance->log, &server->id, "auth"
"password required for route '%s'", "password required for route '%s'",
route->scheme->target); route->scheme->target);
return -1; return -1;
@ -300,13 +300,13 @@ od_auth_backend_cleartext(od_server_t *server)
route->scheme->password, route->scheme->password,
route->scheme->password_len + 1); route->scheme->password_len + 1);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, "auth", od_error_server(&instance->log, &server->id, "auth",
"memory allocation error"); "memory allocation error");
return -1; return -1;
} }
rc = od_write(server->io, stream); rc = od_write(server->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, "auth", od_error_server(&instance->log, &server->id, "auth",
"write error: %s", "write error: %s",
machine_error(server->io)); machine_error(server->io));
return -1; return -1;
@ -321,13 +321,13 @@ od_auth_backend_md5(od_server_t *server, uint8_t salt[4])
od_route_t *route = server->route; od_route_t *route = server->route;
assert(route != NULL); assert(route != NULL);
od_debug_server(&instance->log, server->id, "auth", od_debug_server(&instance->log, &server->id, "auth",
"requested md5 authentication"); "requested md5 authentication");
/* validate route scheme */ /* validate route scheme */
if (route->scheme->user == NULL || if (route->scheme->user == NULL ||
route->scheme->password == NULL) { route->scheme->password == NULL) {
od_error_server(&instance->log, server->id, "auth", od_error_server(&instance->log, &server->id, "auth",
"user and password required for route '%s'", "user and password required for route '%s'",
route->scheme->target); route->scheme->target);
return -1; return -1;
@ -344,7 +344,7 @@ od_auth_backend_md5(od_server_t *server, uint8_t salt[4])
route->scheme->password_len, route->scheme->password_len,
(uint8_t*)salt); (uint8_t*)salt);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, "auth", od_error_server(&instance->log, &server->id, "auth",
"memory allocation error"); "memory allocation error");
so_password_free(&client_password); so_password_free(&client_password);
return -1; return -1;
@ -358,13 +358,13 @@ od_auth_backend_md5(od_server_t *server, uint8_t salt[4])
client_password.password_len); client_password.password_len);
so_password_free(&client_password); so_password_free(&client_password);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, "auth", od_error_server(&instance->log, &server->id, "auth",
"memory allocation error"); "memory allocation error");
return -1; return -1;
} }
rc = od_write(server->io, stream); rc = od_write(server->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, "auth", od_error_server(&instance->log, &server->id, "auth",
"write error: %s", "write error: %s",
machine_error(server->io)); machine_error(server->io));
return -1; return -1;
@ -385,7 +385,7 @@ int od_auth_backend(od_server_t *server)
rc = so_feread_auth(&auth_type, salt, stream->s, rc = so_feread_auth(&auth_type, salt, stream->s,
so_stream_used(stream)); so_stream_used(stream));
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, "auth", od_error_server(&instance->log, &server->id, "auth",
"failed to parse authentication message"); "failed to parse authentication message");
return -1; return -1;
} }
@ -407,7 +407,7 @@ int od_auth_backend(od_server_t *server)
break; break;
/* unsupported */ /* unsupported */
default: default:
od_error_server(&instance->log, server->id, "auth", od_error_server(&instance->log, &server->id, "auth",
"unsupported authentication method"); "unsupported authentication method");
return -1; return -1;
} }
@ -418,25 +418,25 @@ int od_auth_backend(od_server_t *server)
so_stream_reset(stream); so_stream_reset(stream);
rc = od_read(server->io, &server->stream, UINT32_MAX); rc = od_read(server->io, &server->stream, UINT32_MAX);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, "auth", od_error_server(&instance->log, &server->id, "auth",
"read error: %s", "read error: %s",
machine_error(server->io)); machine_error(server->io));
return -1; return -1;
} }
char type = *server->stream.s; char type = *server->stream.s;
od_debug_server(&instance->log, server->id, "auth", od_debug_server(&instance->log, &server->id, "auth",
"%c", type); "%c", type);
switch (type) { switch (type) {
case 'R': case 'R':
rc = so_feread_auth(&auth_type, salt, stream->s, rc = so_feread_auth(&auth_type, salt, stream->s,
so_stream_used(stream)); so_stream_used(stream));
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, "auth", od_error_server(&instance->log, &server->id, "auth",
"failed to parse authentication message"); "failed to parse authentication message");
return -1; return -1;
} }
if (auth_type != 0) { if (auth_type != 0) {
od_error_server(&instance->log, server->id, "auth", od_error_server(&instance->log, &server->id, "auth",
"incorrect authentication flow"); "incorrect authentication flow");
return 0; return 0;
} }

View File

@ -20,13 +20,13 @@
#include "od_version.h" #include "od_version.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_daemon.h" #include "od_daemon.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_msg.h" #include "od_msg.h"
#include "od_system.h" #include "od_system.h"
#include "od_instance.h" #include "od_instance.h"
@ -90,11 +90,11 @@ void od_backend_error(od_server_t *server, char *state, uint8_t *data, int size)
int rc; int rc;
rc = so_feread_error(&error, data, size); rc = so_feread_error(&error, data, size);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, state, od_error_server(&instance->log, &server->id, state,
"failed to parse error message from server"); "failed to parse error message from server");
return; return;
} }
od_error_server(&instance->log, server->id, state, od_error_server(&instance->log, &server->id, state,
"%s %s %s", "%s %s %s",
error.severity, error.severity,
error.code, error.code,
@ -134,14 +134,14 @@ od_backend_ready_wait(od_server_t *server, char *context, int time_ms)
rc = od_read(server->io, stream, time_ms); rc = od_read(server->io, stream, time_ms);
if (rc == -1) { if (rc == -1) {
if (! machine_timedout()) { if (! machine_timedout()) {
od_error_server(&instance->log, server->id, context, od_error_server(&instance->log, &server->id, context,
"read error: %s", "read error: %s",
machine_error(server->io)); machine_error(server->io));
} }
return -1; return -1;
} }
uint8_t type = stream->s[rc]; uint8_t type = stream->s[rc];
od_debug_server(&instance->log, server->id, context, od_debug_server(&instance->log, &server->id, context,
"%c", type); "%c", type);
/* ErrorResponse */ /* ErrorResponse */
if (type == 'E') { if (type == 'E') {
@ -176,7 +176,7 @@ od_backend_startup(od_server_t *server)
return -1; return -1;
rc = od_write(server->io, stream); rc = od_write(server->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, "startup", od_error_server(&instance->log, &server->id, "startup",
"write error: %s", "write error: %s",
machine_error(server->io)); machine_error(server->io));
return -1; return -1;
@ -188,13 +188,13 @@ od_backend_startup(od_server_t *server)
int rc; int rc;
rc = od_read(server->io, &server->stream, UINT32_MAX); rc = od_read(server->io, &server->stream, UINT32_MAX);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, "startup", od_error_server(&instance->log, &server->id, "startup",
"read error: %s", "read error: %s",
machine_error(server->io)); machine_error(server->io));
return -1; return -1;
} }
uint8_t type = *server->stream.s; uint8_t type = *server->stream.s;
od_debug_server(&instance->log, server->id, "startup", od_debug_server(&instance->log, &server->id, "startup",
"%c", type); "%c", type);
switch (type) { switch (type) {
@ -213,7 +213,7 @@ od_backend_startup(od_server_t *server)
rc = so_feread_key(&server->key, rc = so_feread_key(&server->key,
stream->s, so_stream_used(stream)); stream->s, so_stream_used(stream));
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, "startup", od_error_server(&instance->log, &server->id, "startup",
"failed to parse BackendKeyData message"); "failed to parse BackendKeyData message");
return -1; return -1;
} }
@ -230,7 +230,7 @@ od_backend_startup(od_server_t *server)
so_stream_used(stream)); so_stream_used(stream));
return -1; return -1;
default: default:
od_debug_server(&instance->log, server->id, "startup", od_debug_server(&instance->log, &server->id, "startup",
"unknown packet: %c", type); "unknown packet: %c", type);
return -1; return -1;
} }
@ -258,7 +258,7 @@ od_backend_connect_to(od_server_t *server,
int rc; int rc;
rc = machine_set_readahead(server->io, instance->scheme.readahead); rc = machine_set_readahead(server->io, instance->scheme.readahead);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, context, od_error_server(&instance->log, &server->id, context,
"failed to set readahead"); "failed to set readahead");
return -1; return -1;
} }
@ -276,7 +276,7 @@ od_backend_connect_to(od_server_t *server,
struct addrinfo *ai = NULL; struct addrinfo *ai = NULL;
rc = machine_getaddrinfo(server_scheme->host, port, NULL, &ai, 0); rc = machine_getaddrinfo(server_scheme->host, port, NULL, &ai, 0);
if (rc != 0) { if (rc != 0) {
od_error_server(&instance->log, server->id, context, od_error_server(&instance->log, &server->id, context,
"failed to resolve %s:%d", "failed to resolve %s:%d",
server_scheme->host, server_scheme->host,
server_scheme->port); server_scheme->port);
@ -288,7 +288,7 @@ od_backend_connect_to(od_server_t *server,
rc = machine_connect(server->io, ai->ai_addr, UINT32_MAX); rc = machine_connect(server->io, ai->ai_addr, UINT32_MAX);
freeaddrinfo(ai); freeaddrinfo(ai);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, context, od_error_server(&instance->log, &server->id, context,
"failed to connect to %s:%d", "failed to connect to %s:%d",
server_scheme->host, server_scheme->host,
server_scheme->port); server_scheme->port);
@ -320,7 +320,7 @@ int od_backend_connect(od_server_t *server)
if (rc == -1) if (rc == -1)
return -1; return -1;
od_log_server(&instance->log, server->id, NULL, od_log_server(&instance->log, &server->id, NULL,
"new server connection %s:%d", "new server connection %s:%d",
server_scheme->host, server_scheme->host,
server_scheme->port); server_scheme->port);
@ -367,7 +367,7 @@ od_backend_query(od_server_t *server, char *context, char *query, int len)
return -1; return -1;
rc = od_write(server->io, stream); rc = od_write(server->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_server(&instance->log, server->id, context, od_error_server(&instance->log, &server->id, context,
"write error: %s", "write error: %s",
machine_error(server->io)); machine_error(server->io));
return -1; return -1;
@ -401,7 +401,7 @@ int od_backend_configure(od_server_t *server, so_bestartup_t *startup)
} }
if (size == 0) if (size == 0)
return 0; return 0;
od_debug_server(&instance->log, server->id, "configure", od_debug_server(&instance->log, &server->id, "configure",
"%s", query_configure); "%s", query_configure);
int rc; int rc;
rc = od_backend_query(server, "configure", query_configure, rc = od_backend_query(server, "configure", query_configure,
@ -416,7 +416,7 @@ int od_backend_reset(od_server_t *server)
/* server left in copy mode */ /* server left in copy mode */
if (server->is_copy) { if (server->is_copy) {
od_debug_server(&instance->log, server->id, "reset", od_debug_server(&instance->log, &server->id, "reset",
"in copy, closing"); "in copy, closing");
goto drop; goto drop;
} }
@ -424,7 +424,7 @@ int od_backend_reset(od_server_t *server)
/* support route rollback off */ /* support route rollback off */
if (! route->scheme->rollback) { if (! route->scheme->rollback) {
if (server->is_transaction) { if (server->is_transaction) {
od_debug_server(&instance->log, server->id, "reset", od_debug_server(&instance->log, &server->id, "reset",
"in active transaction, closing"); "in active transaction, closing");
goto drop; goto drop;
} }
@ -433,7 +433,7 @@ int od_backend_reset(od_server_t *server)
/* support route cancel off */ /* support route cancel off */
if (! route->scheme->cancel) { if (! route->scheme->cancel) {
if (! od_server_is_sync(server)) { if (! od_server_is_sync(server)) {
od_debug_server(&instance->log, server->id, "reset", od_debug_server(&instance->log, &server->id, "reset",
"not synchronized, closing"); "not synchronized, closing");
goto drop; goto drop;
} }
@ -464,7 +464,7 @@ int od_backend_reset(od_server_t *server)
int rc = 0; int rc = 0;
for (;;) { for (;;) {
while (! od_server_is_sync(server)) { while (! od_server_is_sync(server)) {
od_debug_server(&instance->log, server->id, "reset", od_debug_server(&instance->log, &server->id, "reset",
"not synchronized, wait for %d msec (#%d)", "not synchronized, wait for %d msec (#%d)",
wait_timeout, wait_timeout,
wait_try); wait_try);
@ -477,17 +477,17 @@ int od_backend_reset(od_server_t *server)
if (! machine_timedout()) if (! machine_timedout())
goto error; goto error;
if (wait_try_cancel == wait_cancel_limit) { if (wait_try_cancel == wait_cancel_limit) {
od_debug_server(&instance->log, server->id, "reset", od_debug_server(&instance->log, &server->id, "reset",
"server cancel limit reached, closing"); "server cancel limit reached, closing");
goto error; goto error;
} }
od_debug_server(&instance->log, server->id, "reset", od_debug_server(&instance->log, &server->id, "reset",
"not responded, cancel (#%d)", "not responded, cancel (#%d)",
wait_try_cancel); wait_try_cancel);
wait_try_cancel++; wait_try_cancel++;
rc = od_cancel(server->system, rc = od_cancel(server->system,
route->scheme->server, &server->key, route->scheme->server, &server->key,
server->id); &server->id);
if (rc == -1) if (rc == -1)
goto error; goto error;
continue; continue;
@ -495,7 +495,7 @@ int od_backend_reset(od_server_t *server)
assert(od_server_is_sync(server)); assert(od_server_is_sync(server));
break; break;
} }
od_debug_server(&instance->log, server->id, "reset", od_debug_server(&instance->log, &server->id, "reset",
"synchronized"); "synchronized");
/* send rollback in case server has an active /* send rollback in case server has an active
@ -523,7 +523,7 @@ int od_backend_discard(od_server_t *server)
{ {
od_instance_t *instance = server->system->instance; od_instance_t *instance = server->system->instance;
char query_discard[] = "DISCARD ALL"; char query_discard[] = "DISCARD ALL";
od_debug_server(&instance->log, server->id, "discard", od_debug_server(&instance->log, &server->id, "discard",
"%s", query_discard); "%s", query_discard);
return od_backend_query(server, "reset", query_discard, return od_backend_query(server, "reset", query_discard,
sizeof(query_discard)); sizeof(query_discard));

View File

@ -20,13 +20,13 @@
#include "od_version.h" #include "od_version.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_daemon.h" #include "od_daemon.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_msg.h" #include "od_msg.h"
#include "od_system.h" #include "od_system.h"
#include "od_instance.h" #include "od_instance.h"
@ -52,11 +52,12 @@
int od_cancel(od_system_t *system, int od_cancel(od_system_t *system,
od_schemeserver_t *server_scheme, od_schemeserver_t *server_scheme,
so_key_t *key, so_key_t *key,
uint64_t server_id) od_id_t *server_id)
{ {
od_instance_t *instance = system->instance; od_instance_t *instance = system->instance;
od_log_server(&instance->log, 0, "cancel", od_log_server(&instance->log, 0, "cancel",
"new cancel for S%" PRIu64, server_id); "new cancel for s%.*s", sizeof(server_id->id),
server_id->id);
od_server_t server; od_server_t server;
od_server_init(&server); od_server_init(&server);
server.system = system; server.system = system;
@ -84,5 +85,5 @@ int od_cancel_match(od_system_t *system,
od_route_t *route = server->route; od_route_t *route = server->route;
od_schemeserver_t *server_scheme = route->scheme->server; od_schemeserver_t *server_scheme = route->scheme->server;
so_key_t cancel_key = server->key; so_key_t cancel_key = server->key;
return od_cancel(system, server_scheme, &cancel_key, server->id); return od_cancel(system, server_scheme, &cancel_key, &server->id);
} }

View File

@ -7,7 +7,7 @@
* PostgreSQL connection pooler and request router. * PostgreSQL connection pooler and request router.
*/ */
int od_cancel(od_system_t*, od_schemeserver_t*, so_key_t*, uint64_t); int od_cancel(od_system_t*, od_schemeserver_t*, so_key_t*, od_id_t*);
int od_cancel_match(od_system_t*, od_routepool_t*, so_key_t*); int od_cancel_match(od_system_t*, od_routepool_t*, so_key_t*);
#endif #endif

View File

@ -20,7 +20,7 @@ typedef enum
struct od_client struct od_client
{ {
od_clientstate_t state; od_clientstate_t state;
uint64_t id; od_id_t id;
uint64_t coroutine_id; uint64_t coroutine_id;
uint64_t coroutine_attacher_id; uint64_t coroutine_attacher_id;
machine_io_t *io; machine_io_t *io;
@ -39,7 +39,6 @@ static inline void
od_client_init(od_client_t *client) od_client_init(od_client_t *client)
{ {
client->state = OD_CUNDEF; client->state = OD_CUNDEF;
client->id = 0;
client->coroutine_id = 0; client->coroutine_id = 0;
client->coroutine_attacher_id = 0; client->coroutine_attacher_id = 0;
client->io = NULL; client->io = NULL;

View File

@ -19,12 +19,12 @@
#include "od_macro.h" #include "od_macro.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_system.h" #include "od_system.h"
#include "od_server.h" #include "od_server.h"
#include "od_server_pool.h" #include "od_server_pool.h"

View File

@ -22,6 +22,7 @@
#include "od_macro.h" #include "od_macro.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_scheme.h" #include "od_scheme.h"

View File

@ -20,13 +20,13 @@
#include "od_version.h" #include "od_version.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_daemon.h" #include "od_daemon.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_msg.h" #include "od_msg.h"
#include "od_system.h" #include "od_system.h"
#include "od_instance.h" #include "od_instance.h"
@ -95,7 +95,7 @@ od_frontend_startup_read(od_client_t *client)
if (to_read == 0) if (to_read == 0)
break; break;
if (to_read == -1) { if (to_read == -1) {
od_error_client(&instance->log, client->id, "startup", od_error_client(&instance->log, &client->id, "startup",
"failed to read startup packet, closing"); "failed to read startup packet, closing");
return -1; return -1;
} }
@ -104,7 +104,7 @@ od_frontend_startup_read(od_client_t *client)
return -1; return -1;
rc = machine_read(client->io, (char*)stream->p, to_read, UINT32_MAX); rc = machine_read(client->io, (char*)stream->p, to_read, UINT32_MAX);
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, "startup", od_error_client(&instance->log, &client->id, "startup",
"read error: %s", "read error: %s",
machine_error(client->io)); machine_error(client->io));
return -1; return -1;
@ -155,7 +155,7 @@ od_frontend_startup(od_client_t *client)
return 0; return 0;
error: error:
od_error_client(&instance->log, client->id, "startup", od_error_client(&instance->log, &client->id, "startup",
"incorrect startup packet"); "incorrect startup packet");
od_frontend_error(client, SO_ERROR_PROTOCOL_VIOLATION, od_frontend_error(client, SO_ERROR_PROTOCOL_VIOLATION,
"bad startup packet"); "bad startup packet");
@ -165,7 +165,7 @@ error:
static inline void static inline void
od_frontend_key(od_client_t *client) od_frontend_key(od_client_t *client)
{ {
client->key.key_pid = client->id; client->key.key_pid = *(uint32_t*)client->id.id;
client->key.key = 1 + rand(); client->key.key = 1 + rand();
} }
@ -186,7 +186,7 @@ od_frontend_setup(od_client_t *client)
return -1; return -1;
rc = od_write(client->io, stream); rc = od_write(client->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, "setup", od_error_client(&instance->log, &client->id, "setup",
"write error: %s", "write error: %s",
machine_error(client->io)); machine_error(client->io));
return -1; return -1;
@ -207,7 +207,7 @@ od_frontend_ready(od_client_t *client)
return -1; return -1;
rc = od_write(client->io, stream); rc = od_write(client->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, od_error_client(&instance->log, &client->id,
"write error: %s", "write error: %s",
machine_error(client->io)); machine_error(client->io));
return -1; return -1;
@ -244,7 +244,7 @@ od_frontend_copy_in(od_client_t *client)
if (rc == -1) if (rc == -1)
return OD_RS_ECLIENT_READ; return OD_RS_ECLIENT_READ;
type = *stream->s; type = *stream->s;
od_debug_client(&instance->log, client->id, "copy", od_debug_client(&instance->log, &client->id, "copy",
"%c", *stream->s); "%c", *stream->s);
rc = od_write(server->io, stream); rc = od_write(server->io, stream);
if (rc == -1) if (rc == -1)
@ -275,7 +275,7 @@ od_frontend_main(od_client_t *client)
if (rc == -1) if (rc == -1)
return OD_RS_ECLIENT_READ; return OD_RS_ECLIENT_READ;
int type = stream->s[rc]; int type = stream->s[rc];
od_debug_client(&instance->log, client->id, NULL, od_debug_client(&instance->log, &client->id, NULL,
"%c", type); "%c", type);
/* Terminate (client graceful shutdown) */ /* Terminate (client graceful shutdown) */
@ -290,17 +290,19 @@ od_frontend_main(od_client_t *client)
if (status != OD_ROK) if (status != OD_ROK)
return OD_RS_EATTACH; return OD_RS_EATTACH;
server = client->server; server = client->server;
od_debug_client(&instance->log, client->id, NULL, od_debug_client(&instance->log, &client->id, NULL,
"attached to S%" PRIu64, "attached to s%.*s",
server->id); sizeof(server->id.id),
server->id.id);
/* configure server using client startup parameters, /* configure server using client startup parameters,
* if it has not been configured before. */ * if it has not been configured before. */
if (server->last_client_id == client->id) { if (od_idmgr_cmp(&server->last_client_id, &client->id)) {
assert(server->io != NULL); assert(server->io != NULL);
od_debug_client(&instance->log, client->id, NULL, od_debug_client(&instance->log, &client->id, NULL,
"previously owned, no need to reconfigure S%" PRIu64, "previously owned, no need to reconfigure s%.*s",
server->id); sizeof(server->id.id),
server->id.id);
} else { } else {
od_route_t *route = client->route; od_route_t *route = client->route;
@ -310,8 +312,6 @@ od_frontend_main(od_client_t *client)
if (rc == -1) if (rc == -1)
return OD_RS_ESERVER_CONNECT; return OD_RS_ESERVER_CONNECT;
} else { } else {
assert(server->last_client_id != UINT64_MAX);
/* discard last server configuration */ /* discard last server configuration */
if (route->scheme->discard) { if (route->scheme->discard) {
rc = od_backend_discard(client->server); rc = od_backend_discard(client->server);
@ -348,12 +348,12 @@ od_frontend_main(od_client_t *client)
return OD_RS_ESERVER_READ; return OD_RS_ESERVER_READ;
if (machine_connected(client->io)) if (machine_connected(client->io))
continue; continue;
od_debug_server(&instance->log, server->id, "watchdog", od_debug_server(&instance->log, &server->id, "watchdog",
"client disconnected"); "client disconnected");
return OD_RS_ECLIENT_READ; return OD_RS_ECLIENT_READ;
} }
type = stream->s[rc]; type = stream->s[rc];
od_debug_server(&instance->log, server->id, NULL, od_debug_server(&instance->log, &server->id, NULL,
"%c", type); "%c", type);
/* ErrorResponse */ /* ErrorResponse */
@ -432,7 +432,7 @@ void od_frontend(void *arg)
char peer[128]; char peer[128];
od_getpeername(client->io, peer, sizeof(peer)); od_getpeername(client->io, peer, sizeof(peer));
od_log_client(&instance->log, client->id, NULL, od_log_client(&instance->log, &client->id, NULL,
"new client connection %s", "new client connection %s",
peer); peer);
@ -440,7 +440,7 @@ void od_frontend(void *arg)
int rc; int rc;
rc = machine_io_attach(client->io); rc = machine_io_attach(client->io);
if (rc == -1) { if (rc == -1) {
od_error_client(&instance->log, client->id, NULL, od_error_client(&instance->log, &client->id, NULL,
"failed to transfer client io"); "failed to transfer client io");
machine_close(client->io); machine_close(client->io);
od_client_free(client); od_client_free(client);
@ -456,7 +456,7 @@ void od_frontend(void *arg)
/* client cancel request */ /* client cancel request */
if (client->startup.is_cancel) { if (client->startup.is_cancel) {
od_debug_client(&instance->log, client->id, NULL, od_debug_client(&instance->log, &client->id, NULL,
"cancel request"); "cancel request");
od_router_cancel(client); od_router_cancel(client);
od_frontend_close(client); od_frontend_close(client);
@ -499,14 +499,14 @@ void od_frontend(void *arg)
status = od_route(client); status = od_route(client);
switch (status) { switch (status) {
case OD_RERROR: case OD_RERROR:
od_error_client(&instance->log, client->id, NULL, od_error_client(&instance->log, &client->id, NULL,
"routing failed, closing"); "routing failed, closing");
od_frontend_error(client, SO_ERROR_SYSTEM_ERROR, od_frontend_error(client, SO_ERROR_SYSTEM_ERROR,
"client routing failed"); "client routing failed");
od_frontend_close(client); od_frontend_close(client);
return; return;
case OD_RERROR_NOT_FOUND: case OD_RERROR_NOT_FOUND:
od_error_client(&instance->log, client->id, NULL, od_error_client(&instance->log, &client->id, NULL,
"database route '%s' is not declared, closing", "database route '%s' is not declared, closing",
so_parameter_value(client->startup.database)); so_parameter_value(client->startup.database));
od_frontend_error(client, SO_ERROR_UNDEFINED_DATABASE, od_frontend_error(client, SO_ERROR_UNDEFINED_DATABASE,
@ -514,14 +514,14 @@ void od_frontend(void *arg)
od_frontend_close(client); od_frontend_close(client);
return; return;
case OD_RERROR_TIMEDOUT: case OD_RERROR_TIMEDOUT:
od_error_client(&instance->log, client->id, NULL, od_error_client(&instance->log, &client->id, NULL,
"route connection timedout, closing"); "route connection timedout, closing");
od_frontend_error(client, SO_ERROR_TOO_MANY_CONNECTIONS, od_frontend_error(client, SO_ERROR_TOO_MANY_CONNECTIONS,
"connection timedout"); "connection timedout");
od_frontend_close(client); od_frontend_close(client);
return; return;
case OD_RERROR_LIMIT: case OD_RERROR_LIMIT:
od_error_client(&instance->log, client->id, NULL, od_error_client(&instance->log, &client->id, NULL,
"route connection limit reached, closing"); "route connection limit reached, closing");
od_frontend_error(client, SO_ERROR_TOO_MANY_CONNECTIONS, od_frontend_error(client, SO_ERROR_TOO_MANY_CONNECTIONS,
"too many connections"); "too many connections");
@ -529,7 +529,7 @@ void od_frontend(void *arg)
return; return;
case OD_ROK:; case OD_ROK:;
od_route_t *route = client->route; od_route_t *route = client->route;
od_debug_client(&instance->log, client->id, NULL, od_debug_client(&instance->log, &client->id, NULL,
"route to '%s' (using '%s' server)", "route to '%s' (using '%s' server)",
route->scheme->target, route->scheme->target,
route->scheme->server->name); route->scheme->server->name);
@ -546,15 +546,16 @@ void od_frontend(void *arg)
assert(server == NULL); assert(server == NULL);
assert(client->route != NULL); assert(client->route != NULL);
od_frontend_error(client, SO_ERROR_CONNECTION_FAILURE, od_frontend_error(client, SO_ERROR_CONNECTION_FAILURE,
"C%d: failed to get remote server connection", "c%.*s: failed to get remote server connection",
client->id); sizeof(client->id.id),
client->id.id);
/* detach client from route */ /* detach client from route */
od_unroute(client); od_unroute(client);
break; break;
case OD_RS_OK: case OD_RS_OK:
/* graceful disconnect */ /* graceful disconnect */
od_log_client(&instance->log, client->id, NULL, od_log_client(&instance->log, &client->id, NULL,
"disconnected"); "disconnected");
if (! client->server) { if (! client->server) {
od_unroute(client); od_unroute(client);
@ -574,7 +575,7 @@ void od_frontend(void *arg)
case OD_RS_ECLIENT_WRITE: case OD_RS_ECLIENT_WRITE:
/* close client connection and reuse server /* close client connection and reuse server
* link in case of client errors */ * link in case of client errors */
od_log_client(&instance->log, client->id, NULL, od_log_client(&instance->log, &client->id, NULL,
"disconnected (read/write error): %s", "disconnected (read/write error): %s",
machine_error(client->io)); machine_error(client->io));
if (! client->server) { if (! client->server) {
@ -594,18 +595,20 @@ void od_frontend(void *arg)
case OD_RS_ESERVER_CONNECT: case OD_RS_ESERVER_CONNECT:
/* server attached to client and connection failed */ /* server attached to client and connection failed */
od_frontend_error(client, SO_ERROR_CONNECTION_FAILURE, od_frontend_error(client, SO_ERROR_CONNECTION_FAILURE,
"S%d: failed to connect to remote server", "s%.*s: failed to connect to remote server",
server->id); sizeof(server->id.id),
server->id.id);
/* close backend connection */ /* close backend connection */
od_router_close_and_unroute(client); od_router_close_and_unroute(client);
break; break;
case OD_RS_ESERVER_CONFIGURE: case OD_RS_ESERVER_CONFIGURE:
od_log_server(&instance->log, server->id, NULL, od_log_server(&instance->log, &server->id, NULL,
"disconnected (server configure error)"); "disconnected (server configure error)");
od_frontend_error(client, SO_ERROR_CONNECTION_FAILURE, od_frontend_error(client, SO_ERROR_CONNECTION_FAILURE,
"S%d: failed to configure remote server", "s%.*s: failed to configure remote server",
server->id); sizeof(server->id.id),
server->id.id);
/* close backend connection */ /* close backend connection */
od_router_close_and_unroute(client); od_router_close_and_unroute(client);
break; break;
@ -614,12 +617,13 @@ void od_frontend(void *arg)
case OD_RS_ESERVER_WRITE: case OD_RS_ESERVER_WRITE:
/* close client connection and close server /* close client connection and close server
* connection in case of server errors */ * connection in case of server errors */
od_log_server(&instance->log, server->id, NULL, od_log_server(&instance->log, &server->id, NULL,
"disconnected (read/write error): %s", "disconnected (read/write error): %s",
machine_error(server->io)); machine_error(server->io));
od_frontend_error(client, SO_ERROR_CONNECTION_FAILURE, od_frontend_error(client, SO_ERROR_CONNECTION_FAILURE,
"S%d: remote server read/write error", "s%.*s: remote server read/write error",
server->id); sizeof(server->id.id),
server->id.id);
/* close backend connection */ /* close backend connection */
od_router_close_and_unroute(client); od_router_close_and_unroute(client);
break; break;

View File

@ -20,13 +20,13 @@
#include "od_version.h" #include "od_version.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_daemon.h" #include "od_daemon.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_msg.h" #include "od_msg.h"
#include "od_system.h" #include "od_system.h"
#include "od_instance.h" #include "od_instance.h"
@ -120,7 +120,7 @@ int od_instance_main(od_instance_t *instance, int argc, char **argv)
if (instance->scheme.log_file) { if (instance->scheme.log_file) {
rc = od_log_open(&instance->log, instance->scheme.log_file); rc = od_log_open(&instance->log, instance->scheme.log_file);
if (rc == -1) { if (rc == -1) {
od_error(&instance->log, "failed to open log file '%s'", od_error(&instance->log, NULL, "failed to open log file '%s'",
instance->scheme.log_file); instance->scheme.log_file);
return 1; return 1;
} }
@ -148,7 +148,10 @@ int od_instance_main(od_instance_t *instance, int argc, char **argv)
if (instance->scheme.pid_file) if (instance->scheme.pid_file)
od_pid_create(&instance->pid, instance->scheme.pid_file); od_pid_create(&instance->pid, instance->scheme.pid_file);
/* seed id manager */ /* seed id manager */
od_idmgr_seed(&instance->id_mgr, &instance->log); rc = od_idmgr_seed(&instance->id_mgr);
if (rc == -1)
od_error(&instance->log, NULL, "failed to open random source device");
/* run system services */ /* run system services */
od_router_t router; od_router_t router;
od_periodic_t periodic; od_periodic_t periodic;
@ -167,7 +170,6 @@ int od_instance_main(od_instance_t *instance, int argc, char **argv)
rc = od_relaypool_init(&relay_pool, &system, instance->scheme.workers); rc = od_relaypool_init(&relay_pool, &system, instance->scheme.workers);
if (rc == -1) if (rc == -1)
return 1; return 1;
/* start pooler machine thread */ /* start pooler machine thread */
rc = od_pooler_start(&pooler); rc = od_pooler_start(&pooler);
if (rc == -1) if (rc == -1)

View File

@ -20,6 +20,7 @@
#include "od_macro.h" #include "od_macro.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_io.h" #include "od_io.h"

View File

@ -24,6 +24,7 @@
#include "od_macro.h" #include "od_macro.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
@ -57,7 +58,7 @@ int od_log_close(od_log_t *log)
int od_logv(od_log_t *log, od_syslogprio_t prio, int od_logv(od_log_t *log, od_syslogprio_t prio,
char *ident, char *ident,
char *object, char *object,
uint64_t object_id, od_id_t *id,
char *context, char *context,
char *fmt, va_list args) char *fmt, va_list args)
{ {
@ -79,8 +80,8 @@ int od_logv(od_log_t *log, od_syslogprio_t prio,
/* object and id */ /* object and id */
if (object) { if (object) {
len += snprintf(buffer + len, sizeof(buffer) - len, "%s%" PRIu64": ", len += snprintf(buffer + len, sizeof(buffer) - len, "%s%.*s: ",
object, object_id); object, (int)sizeof(id->id), id->id);
} }
/* context */ /* context */

View File

@ -21,7 +21,7 @@ int od_log_init(od_log_t*, od_pid_t*, od_syslog_t*);
int od_log_open(od_log_t*, char*); int od_log_open(od_log_t*, char*);
int od_log_close(od_log_t*); int od_log_close(od_log_t*);
int od_logv(od_log_t*, od_syslogprio_t, char*, int od_logv(od_log_t*, od_syslogprio_t, char*,
char*, uint64_t, char*, char*, od_id_t*, char*,
char*, va_list); char*, va_list);
static inline void static inline void
@ -53,33 +53,33 @@ od_error(od_log_t *log, char *context, char *fmt, ...)
/* client */ /* client */
static inline int static inline int
od_log_client(od_log_t *log, uint64_t id, char *context, char *fmt, ...) od_log_client(od_log_t *log, od_id_t *id, char *context, char *fmt, ...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
int rc = od_logv(log, OD_SYSLOG_INFO, NULL, "C", id, context, fmt, args); int rc = od_logv(log, OD_SYSLOG_INFO, NULL, "c", id, context, fmt, args);
va_end(args); va_end(args);
return rc; return rc;
} }
static inline int static inline int
od_debug_client(od_log_t *log, uint64_t id, char *context, char *fmt, ...) od_debug_client(od_log_t *log, od_id_t *id, char *context, char *fmt, ...)
{ {
if (! log->debug) if (! log->debug)
return 0; return 0;
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
int rc = od_logv(log, OD_SYSLOG_INFO, "debug:", "C", id, context, fmt, args); int rc = od_logv(log, OD_SYSLOG_INFO, "debug:", "c", id, context, fmt, args);
va_end(args); va_end(args);
return rc; return rc;
} }
static inline int static inline int
od_error_client(od_log_t *log, uint64_t id, char *context, char *fmt, ...) od_error_client(od_log_t *log, od_id_t *id, char *context, char *fmt, ...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
int rc = od_logv(log, OD_SYSLOG_ERROR, "error:", "C", id, context, fmt, args); int rc = od_logv(log, OD_SYSLOG_ERROR, "error:", "c", id, context, fmt, args);
va_end(args); va_end(args);
return rc; return rc;
} }
@ -87,33 +87,33 @@ od_error_client(od_log_t *log, uint64_t id, char *context, char *fmt, ...)
/* server */ /* server */
static inline int static inline int
od_log_server(od_log_t *log, uint64_t id, char *context, char *fmt, ...) od_log_server(od_log_t *log, od_id_t *id, char *context, char *fmt, ...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
int rc = od_logv(log, OD_SYSLOG_INFO, NULL, "S", id, context, fmt, args); int rc = od_logv(log, OD_SYSLOG_INFO, NULL, "s", id, context, fmt, args);
va_end(args); va_end(args);
return rc; return rc;
} }
static inline int static inline int
od_debug_server(od_log_t *log, uint64_t id, char *context, char *fmt, ...) od_debug_server(od_log_t *log, od_id_t *id, char *context, char *fmt, ...)
{ {
if (! log->debug) if (! log->debug)
return 0; return 0;
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
int rc = od_logv(log, OD_SYSLOG_INFO, "debug:", "S", id, context, fmt, args); int rc = od_logv(log, OD_SYSLOG_INFO, "debug:", "s", id, context, fmt, args);
va_end(args); va_end(args);
return rc; return rc;
} }
static inline int static inline int
od_error_server(od_log_t *log, uint64_t id, char *context, char *fmt, ...) od_error_server(od_log_t *log, od_id_t *id, char *context, char *fmt, ...)
{ {
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
int rc = od_logv(log, OD_SYSLOG_ERROR, "error:", "S", id, context, fmt, args); int rc = od_logv(log, OD_SYSLOG_ERROR, "error:", "s", id, context, fmt, args);
va_end(args); va_end(args);
return rc; return rc;
} }

View File

@ -20,13 +20,13 @@
#include "od_version.h" #include "od_version.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_daemon.h" #include "od_daemon.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_msg.h" #include "od_msg.h"
#include "od_system.h" #include "od_system.h"
#include "od_instance.h" #include "od_instance.h"
@ -88,7 +88,7 @@ od_expire_mark(od_server_t *server, void *arg)
*/ */
if (! route->scheme->ttl) if (! route->scheme->ttl)
return 0; return 0;
od_debug_server(&instance->log, server->id, "expire", od_debug_server(&instance->log, &server->id, "expire",
"idle time: %d", "idle time: %d",
server->idle_time); server->idle_time);
if (server->idle_time < route->scheme->ttl) { if (server->idle_time < route->scheme->ttl) {
@ -149,7 +149,7 @@ od_periodic(void *arg)
server = od_routepool_next(&router->route_pool, OD_SEXPIRE); server = od_routepool_next(&router->route_pool, OD_SEXPIRE);
if (server == NULL) if (server == NULL)
break; break;
od_debug_server(&instance->log, server->id, "expire", od_debug_server(&instance->log, &server->id, "expire",
"closing idle connection (%d secs)", "closing idle connection (%d secs)",
server->idle_time); server->idle_time);
server->idle_time = 0; server->idle_time = 0;

View File

@ -22,13 +22,13 @@
#include "od_version.h" #include "od_version.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_daemon.h" #include "od_daemon.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_msg.h" #include "od_msg.h"
#include "od_system.h" #include "od_system.h"
#include "od_instance.h" #include "od_instance.h"
@ -52,7 +52,6 @@ static inline void
od_pooler_server(void *arg) od_pooler_server(void *arg)
{ {
od_poolerserver_t *server = arg; od_poolerserver_t *server = arg;
od_pooler_t *pooler = server->system->pooler;
od_instance_t *instance = server->system->instance; od_instance_t *instance = server->system->instance;
od_relaypool_t *relay_pool = server->system->relay_pool; od_relaypool_t *relay_pool = server->system->relay_pool;
@ -127,7 +126,7 @@ od_pooler_server(void *arg)
machine_io_free(client_io); machine_io_free(client_io);
continue; continue;
} }
client->id = pooler->client_seq++; od_idmgr_generate(&instance->id_mgr, &client->id);
client->io = client_io; client->io = client_io;
/* create new client event and pass it to worker pool */ /* create new client event and pass it to worker pool */
@ -273,7 +272,6 @@ int od_pooler_init(od_pooler_t *pooler, od_system_t *system)
od_instance_t *instance = system->instance; od_instance_t *instance = system->instance;
pooler->machine = -1; pooler->machine = -1;
pooler->client_seq = 0;
pooler->system = system; pooler->system = system;
pooler->addr = NULL; pooler->addr = NULL;
pooler->tls = NULL; pooler->tls = NULL;

View File

@ -20,7 +20,6 @@ struct od_pooler
{ {
int64_t machine; int64_t machine;
machine_tls_t *tls; machine_tls_t *tls;
uint64_t client_seq;
struct addrinfo *addr; struct addrinfo *addr;
od_system_t *system; od_system_t *system;
}; };

View File

@ -20,13 +20,13 @@
#include "od_version.h" #include "od_version.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_daemon.h" #include "od_daemon.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_msg.h" #include "od_msg.h"
#include "od_system.h" #include "od_system.h"
#include "od_instance.h" #include "od_instance.h"
@ -68,7 +68,7 @@ od_relay(void *arg)
int64_t coroutine_id; int64_t coroutine_id;
coroutine_id = machine_coroutine_create(od_frontend, client); coroutine_id = machine_coroutine_create(od_frontend, client);
if (coroutine_id == -1) { if (coroutine_id == -1) {
od_error_client(&instance->log, client->id, "relay", od_error_client(&instance->log, &client->id, "relay",
"failed to create coroutine"); "failed to create coroutine");
machine_close(client->io); machine_close(client->io);
od_client_free(client); od_client_free(client);

View File

@ -20,13 +20,13 @@
#include "od_version.h" #include "od_version.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_daemon.h" #include "od_daemon.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_msg.h" #include "od_msg.h"
#include "od_system.h" #include "od_system.h"
#include "od_instance.h" #include "od_instance.h"

View File

@ -19,12 +19,12 @@
#include "od_macro.h" #include "od_macro.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_system.h" #include "od_system.h"
#include "od_server.h" #include "od_server.h"
#include "od_server_pool.h" #include "od_server_pool.h"

View File

@ -20,13 +20,13 @@
#include "od_version.h" #include "od_version.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_daemon.h" #include "od_daemon.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_msg.h" #include "od_msg.h"
#include "od_system.h" #include "od_system.h"
#include "od_instance.h" #include "od_instance.h"
@ -145,7 +145,7 @@ od_router_attacher(void *arg)
* The condition triggered when a server connection * The condition triggered when a server connection
* put into idle state by DETACH events. * put into idle state by DETACH events.
*/ */
od_debug_client(&instance->log, client->id, "router", od_debug_client(&instance->log, &client->id, "router",
"route '%s' pool limit reached (%d), waiting", "route '%s' pool limit reached (%d), waiting",
route->scheme->target, route->scheme->target,
route->scheme->pool_size); route->scheme->pool_size);
@ -157,7 +157,7 @@ od_router_attacher(void *arg)
rc = machine_condition(route->scheme->pool_timeout); rc = machine_condition(route->scheme->pool_timeout);
if (rc == -1) { if (rc == -1) {
od_clientpool_set(&route->client_pool, client, OD_CPENDING); od_clientpool_set(&route->client_pool, client, OD_CPENDING);
od_debug_client(&instance->log, client->id, "router", od_debug_client(&instance->log, &client->id, "router",
"server pool wait timedout, closing"); "server pool wait timedout, closing");
msg_attach->status = OD_RERROR_TIMEDOUT; msg_attach->status = OD_RERROR_TIMEDOUT;
machine_queue_put(msg_attach->response, msg); machine_queue_put(msg_attach->response, msg);
@ -166,20 +166,19 @@ od_router_attacher(void *arg)
assert(client->state == OD_CPENDING); assert(client->state == OD_CPENDING);
/* retry */ /* retry */
od_debug_client(&instance->log, client->id, "router", od_debug_client(&instance->log, &client->id, "router",
"server pool attach retry"); "server pool attach retry");
continue; continue;
} }
/* create new server object */ /* create new server object */
uint64_t id = router->server_seq++;
server = od_server_allocate(); server = od_server_allocate();
if (server == NULL) { if (server == NULL) {
msg_attach->status = OD_RERROR; msg_attach->status = OD_RERROR;
machine_queue_put(msg_attach->response, msg); machine_queue_put(msg_attach->response, msg);
return; return;
} }
server->id = id; od_idmgr_generate(&instance->id_mgr, &server->id);
server->system = router->system; server->system = router->system;
server->route = route; server->route = route;
@ -209,7 +208,7 @@ od_router_wakeup(od_router_t *router, od_route_t *route)
assert(rc == 0); assert(rc == 0);
(void)rc; (void)rc;
od_clientpool_set(&route->client_pool, waiter, OD_CPENDING); od_clientpool_set(&route->client_pool, waiter, OD_CPENDING);
od_debug_client(&instance->log, waiter->id, "router", od_debug_client(&instance->log, &waiter->id, "router",
"server released, waking up"); "server released, waking up");
} }
} }
@ -428,7 +427,6 @@ int od_router_init(od_router_t *router, od_system_t *system)
od_instance_t *instance = system->instance; od_instance_t *instance = system->instance;
od_routepool_init(&router->route_pool); od_routepool_init(&router->route_pool);
router->system = system; router->system = system;
router->server_seq = 0;
router->clients = 0; router->clients = 0;
router->queue = machine_queue_create(); router->queue = machine_queue_create();
if (router->queue == NULL) { if (router->queue == NULL) {

View File

@ -20,11 +20,10 @@ typedef enum
struct od_router struct od_router
{ {
od_routepool_t route_pool; od_routepool_t route_pool;
machine_queue_t *queue; machine_queue_t *queue;
uint64_t server_seq; int clients;
int clients; od_system_t *system;
od_system_t *system;
}; };
int od_router_init(od_router_t*, od_system_t*); int od_router_init(od_router_t*, od_system_t*);

View File

@ -16,6 +16,7 @@
#include "od_macro.h" #include "od_macro.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_scheme.h" #include "od_scheme.h"

View File

@ -20,7 +20,7 @@ typedef enum
struct od_server struct od_server
{ {
od_serverstate_t state; od_serverstate_t state;
uint64_t id; od_id_t id;
so_stream_t stream; so_stream_t stream;
machine_io_t *io; machine_io_t *io;
machine_tls_t *tls; machine_tls_t *tls;
@ -32,7 +32,7 @@ struct od_server
int idle_time; int idle_time;
so_key_t key; so_key_t key;
so_key_t key_client; so_key_t key_client;
uint64_t last_client_id; od_id_t last_client_id;
void *route; void *route;
od_system_t *system; od_system_t *system;
od_list_t link; od_list_t link;
@ -47,7 +47,6 @@ static inline void
od_server_init(od_server_t *server) od_server_init(od_server_t *server)
{ {
server->state = OD_SUNDEF; server->state = OD_SUNDEF;
server->id = 0;
server->route = NULL; server->route = NULL;
server->system = NULL; server->system = NULL;
server->io = NULL; server->io = NULL;
@ -56,13 +55,14 @@ od_server_init(od_server_t *server)
server->is_allocated = 0; server->is_allocated = 0;
server->is_transaction = 0; server->is_transaction = 0;
server->is_copy = 0; server->is_copy = 0;
server->last_client_id = UINT64_MAX;
server->count_request = 0; server->count_request = 0;
server->count_reply = 0; server->count_reply = 0;
so_keyinit(&server->key); so_keyinit(&server->key);
so_keyinit(&server->key_client); so_keyinit(&server->key_client);
so_stream_init(&server->stream); so_stream_init(&server->stream);
od_list_init(&server->link); od_list_init(&server->link);
memset(&server->id, 0, sizeof(server->id));
memset(&server->last_client_id, 0, sizeof(server->last_client_id));
} }
static inline od_server_t* static inline od_server_t*

View File

@ -19,12 +19,12 @@
#include "od_macro.h" #include "od_macro.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_system.h" #include "od_system.h"
#include "od_server.h" #include "od_server.h"
#include "od_server_pool.h" #include "od_server_pool.h"

View File

@ -20,13 +20,13 @@
#include "od_version.h" #include "od_version.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_daemon.h" #include "od_daemon.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_msg.h" #include "od_msg.h"
#include "od_system.h" #include "od_system.h"
#include "od_instance.h" #include "od_instance.h"
@ -95,7 +95,7 @@ od_tls_frontend_accept(od_client_t *client,
if (client->startup.is_ssl_request) if (client->startup.is_ssl_request)
{ {
od_debug_client(log, client->id, "tls", "ssl request"); od_debug_client(log, &client->id, "tls", "ssl request");
so_stream_reset(stream); so_stream_reset(stream);
int rc; int rc;
if (scheme->tls_verify == OD_TDISABLE) { if (scheme->tls_verify == OD_TDISABLE) {
@ -103,11 +103,11 @@ od_tls_frontend_accept(od_client_t *client,
so_stream_write8(stream, 'N'); so_stream_write8(stream, 'N');
rc = od_write(client->io, stream); rc = od_write(client->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_client(log, client->id, "tls", "write error: %s", od_error_client(log, &client->id, "tls", "write error: %s",
machine_error(client->io)); machine_error(client->io));
return -1; return -1;
} }
od_log_client(log, client->id, "tls", "disabled, closing"); od_log_client(log, &client->id, "tls", "disabled, closing");
od_frontend_error(client, SO_ERROR_FEATURE_NOT_SUPPORTED, od_frontend_error(client, SO_ERROR_FEATURE_NOT_SUPPORTED,
"SSL is not supported"); "SSL is not supported");
return -1; return -1;
@ -116,17 +116,17 @@ od_tls_frontend_accept(od_client_t *client,
so_stream_write8(stream, 'S'); so_stream_write8(stream, 'S');
rc = od_write(client->io, stream); rc = od_write(client->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_client(log, client->id, "tls", "write error: %s", od_error_client(log, &client->id, "tls", "write error: %s",
machine_error(client->io)); machine_error(client->io));
return -1; return -1;
} }
rc = machine_set_tls(client->io, tls); rc = machine_set_tls(client->io, tls);
if (rc == -1) { if (rc == -1) {
od_error_client(log, client->id, "tls", "error: %s", od_error_client(log, &client->id, "tls", "error: %s",
machine_error(client->io)); machine_error(client->io));
return -1; return -1;
} }
od_debug_client(log, client->id, "tls", "ok"); od_debug_client(log, &client->id, "tls", "ok");
return 0; return 0;
} }
switch (scheme->tls_verify) { switch (scheme->tls_verify) {
@ -134,7 +134,7 @@ od_tls_frontend_accept(od_client_t *client,
case OD_TALLOW: case OD_TALLOW:
break; break;
default: default:
od_log_client(log, client->id, "tls", "required, closing"); od_log_client(log, &client->id, "tls", "required, closing");
od_frontend_error(client, SO_ERROR_PROTOCOL_VIOLATION, od_frontend_error(client, SO_ERROR_PROTOCOL_VIOLATION,
"SSL is required"); "SSL is required");
return -1; return -1;
@ -188,7 +188,7 @@ od_tls_backend_connect(od_server_t *server,
{ {
so_stream_t *stream = &server->stream; so_stream_t *stream = &server->stream;
od_debug_server(log, server->id, "tls", "init"); od_debug_server(log, &server->id, "tls", "init");
/* SSL Request */ /* SSL Request */
so_stream_reset(stream); so_stream_reset(stream);
@ -198,7 +198,7 @@ od_tls_backend_connect(od_server_t *server,
return -1; return -1;
rc = od_write(server->io, stream); rc = od_write(server->io, stream);
if (rc == -1) { if (rc == -1) {
od_error_server(log, server->id, "tls", "write error: %s", od_error_server(log, &server->id, "tls", "write error: %s",
machine_error(server->io)); machine_error(server->io));
return -1; return -1;
} }
@ -207,33 +207,33 @@ od_tls_backend_connect(od_server_t *server,
so_stream_reset(stream); so_stream_reset(stream);
rc = machine_read(server->io, (char*)stream->p, 1, UINT32_MAX); rc = machine_read(server->io, (char*)stream->p, 1, UINT32_MAX);
if (rc == -1) { if (rc == -1) {
od_error_server(log, server->id, "tls", "read error: %s", od_error_server(log, &server->id, "tls", "read error: %s",
machine_error(server->io)); machine_error(server->io));
return -1; return -1;
} }
switch (*stream->p) { switch (*stream->p) {
case 'S': case 'S':
/* supported */ /* supported */
od_debug_server(log, server->id, "tls", "supported"); od_debug_server(log, &server->id, "tls", "supported");
rc = machine_set_tls(server->io, server->tls); rc = machine_set_tls(server->io, server->tls);
if (rc == -1) { if (rc == -1) {
od_error_server(log, server->id, "tls", "error: %s", od_error_server(log, &server->id, "tls", "error: %s",
machine_error(server->io)); machine_error(server->io));
return -1; return -1;
} }
od_debug_server(log, server->id, "tls", "ok"); od_debug_server(log, &server->id, "tls", "ok");
break; break;
case 'N': case 'N':
/* not supported */ /* not supported */
if (scheme->tls_verify == OD_TALLOW) { if (scheme->tls_verify == OD_TALLOW) {
od_debug_server(log, server->id, "tls", "not supported, continue (allow)"); od_debug_server(log, &server->id, "tls", "not supported, continue (allow)");
} else { } else {
od_error_server(log, server->id, "tls", "not supported, closing"); od_error_server(log, &server->id, "tls", "not supported, closing");
return -1; return -1;
} }
break; break;
default: default:
od_error_server(log, server->id, "tls", "unexpected status reply"); od_error_server(log, &server->id, "tls", "unexpected status reply");
return -1; return -1;
} }
return 0; return 0;

View File

@ -15,12 +15,12 @@
#include "od_macro.h" #include "od_macro.h"
#include "od_list.h" #include "od_list.h"
#include "od_pid.h" #include "od_pid.h"
#include "od_id.h"
#include "od_syslog.h" #include "od_syslog.h"
#include "od_log.h" #include "od_log.h"
#include "od_scheme.h" #include "od_scheme.h"
#include "od_lex.h" #include "od_lex.h"
#include "od_config.h" #include "od_config.h"
#include "od_id.h"
#include "od_instance.h" #include "od_instance.h"
int main(int argc, char *argv[]) int main(int argc, char *argv[])