odissey: major scheme rework, rename it to config

This commit is contained in:
Dmitry Simonenko 2018-03-06 18:23:52 +03:00
parent a096d258b7
commit bb826db7e8
37 changed files with 631 additions and 631 deletions

View File

@ -4,7 +4,7 @@ set(od_src
pid.c
daemon.c
logger.c
scheme.c
config.c
config_reader.c
id.c
instance.c

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -104,10 +104,10 @@ od_auth_frontend_cleartext(od_client_t *client)
shapito_password_t client_password;
shapito_password_init(&client_password);
if (client->scheme->auth_query) {
if (client->config->auth_query) {
rc = od_auth_query(client->system,
stream,
client->scheme,
client->config,
client->startup.user,
&client_password);
if (rc == -1) {
@ -120,14 +120,14 @@ od_auth_frontend_cleartext(od_client_t *client)
return -1;
}
} else {
client_password.password_len = client->scheme->password_len + 1;
client_password.password = client->scheme->password;
client_password.password_len = client->config->password_len + 1;
client_password.password = client->config->password;
}
/* authenticate */
int check = shapito_password_compare(&client_password, &client_token);
shapito_password_free(&client_token);
if (client->scheme->auth_query)
if (client->config->auth_query)
shapito_password_free(&client_password);
if (! check) {
od_log(&instance->logger, "auth", client, NULL,
@ -203,10 +203,10 @@ od_auth_frontend_md5(od_client_t *client)
shapito_password_t query_password;
shapito_password_init(&query_password);
if (client->scheme->auth_query) {
if (client->config->auth_query) {
rc = od_auth_query(client->system,
stream,
client->scheme,
client->config,
client->startup.user,
&query_password);
if (rc == -1) {
@ -220,8 +220,8 @@ od_auth_frontend_md5(od_client_t *client)
}
query_password.password_len--;
} else {
query_password.password_len = client->scheme->password_len;
query_password.password = client->scheme->password;
query_password.password_len = client->config->password_len;
query_password.password = client->config->password;
}
/* prepare password hash */
@ -236,7 +236,7 @@ od_auth_frontend_md5(od_client_t *client)
"memory allocation error");
shapito_password_free(&client_password);
shapito_password_free(&client_token);
if (client->scheme->auth_query)
if (client->config->auth_query)
shapito_password_free(&query_password);
return -1;
}
@ -245,7 +245,7 @@ od_auth_frontend_md5(od_client_t *client)
int check = shapito_password_compare(&client_password, &client_token);
shapito_password_free(&client_password);
shapito_password_free(&client_token);
if (client->scheme->auth_query)
if (client->config->auth_query)
shapito_password_free(&query_password);
if (! check) {
od_log(&instance->logger, "auth", client, NULL,
@ -278,7 +278,7 @@ int od_auth_frontend(od_client_t *client)
/* authentication mode */
int rc;
switch (client->scheme->auth_mode) {
switch (client->config->auth_mode) {
case OD_AUTH_CLEAR_TEXT:
rc = od_auth_frontend_cleartext(client);
if (rc == -1)
@ -328,18 +328,18 @@ od_auth_backend_cleartext(od_server_t *server, shapito_stream_t *stream)
/* use storage or user password */
char *password;
int password_len;
if (route->scheme->storage_password) {
password = route->scheme->storage_password;
password_len = route->scheme->storage_password_len;
if (route->config->storage_password) {
password = route->config->storage_password;
password_len = route->config->storage_password_len;
} else
if (route->scheme->password) {
password = route->scheme->password;
password_len = route->scheme->password_len;
if (route->config->password) {
password = route->config->password;
password_len = route->config->password_len;
} else {
od_error(&instance->logger, "auth", NULL, server,
"password required for route '%s.%s'",
route->scheme->db_name,
route->scheme->user_name);
route->config->db_name,
route->config->user_name);
return -1;
}
@ -376,29 +376,29 @@ od_auth_backend_md5(od_server_t *server, shapito_stream_t *stream,
/* use storage user or route user */
char *user;
int user_len;
if (route->scheme->storage_user) {
user = route->scheme->storage_user;
user_len = route->scheme->storage_user_len;
if (route->config->storage_user) {
user = route->config->storage_user;
user_len = route->config->storage_user_len;
} else {
user = route->scheme->user_name;
user_len = route->scheme->user_name_len;
user = route->config->user_name;
user_len = route->config->user_name_len;
}
/* use storage or user password */
char *password;
int password_len;
if (route->scheme->storage_password) {
password = route->scheme->storage_password;
password_len = route->scheme->storage_password_len;
if (route->config->storage_password) {
password = route->config->storage_password;
password_len = route->config->storage_password_len;
} else
if (route->scheme->password) {
password = route->scheme->password;
password_len = route->scheme->password_len;
if (route->config->password) {
password = route->config->password;
password_len = route->config->password_len;
} else {
od_error(&instance->logger, "auth", NULL, server,
"password required for route '%s.%s'",
route->scheme->db_name,
route->scheme->user_name);
route->config->db_name,
route->config->user_name);
return -1;
}

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -172,13 +172,13 @@ od_auth_query_do(od_server_t *server, shapito_stream_t *stream,
}
__attribute__((hot)) static inline int
od_auth_query_format(od_schemeroute_t *scheme, shapito_parameter_t *user,
od_auth_query_format(od_configroute_t *config, shapito_parameter_t *user,
char *output, int output_len)
{
char *dst_pos = output;
char *dst_end = output + output_len;
char *format_pos = scheme->auth_query;
char *format_end = scheme->auth_query + strlen(scheme->auth_query);
char *format_pos = config->auth_query;
char *format_end = config->auth_query + strlen(config->auth_query);
while (format_pos < format_end)
{
if (*format_pos == '%') {
@ -214,7 +214,7 @@ od_auth_query_format(od_schemeroute_t *scheme, shapito_parameter_t *user,
int od_auth_query(od_system_t *system,
shapito_stream_t *stream,
od_schemeroute_t *scheme,
od_configroute_t *config,
shapito_parameter_t *user,
shapito_password_t *password)
{
@ -231,12 +231,12 @@ int od_auth_query(od_system_t *system,
/* set auth query route db and user */
shapito_parameters_add(&auth_client->startup.params, "database", 9,
scheme->auth_query_db,
strlen(scheme->auth_query_db) + 1);
config->auth_query_db,
strlen(config->auth_query_db) + 1);
shapito_parameters_add(&auth_client->startup.params, "user", 5,
scheme->auth_query_user,
strlen(scheme->auth_query_user) + 1);
config->auth_query_user,
strlen(config->auth_query_user) + 1);
shapito_parameter_t *param;
param = (shapito_parameter_t*)auth_client->startup.params.buf.start;
@ -282,7 +282,7 @@ int od_auth_query(od_system_t *system,
/* preformat and execute query */
char query[512];
int query_len;
query_len = od_auth_query_format(scheme, user, query, sizeof(query));
query_len = od_auth_query_format(config, user, query, sizeof(query));
rc = od_auth_query_do(server, stream, query, query_len, password);
if (rc == -1) {

View File

@ -7,7 +7,7 @@
* Advanced PostgreSQL connection pooler.
*/
int od_auth_query(od_system_t*, shapito_stream_t*, od_schemeroute_t*,
int od_auth_query(od_system_t*, shapito_stream_t*, od_configroute_t*,
shapito_parameter_t*, shapito_password_t*);
#endif /* OD_AUTH_QUERY_H */

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -256,7 +256,7 @@ od_backend_startup(od_server_t *server, shapito_stream_t *stream)
static inline int
od_backend_connect_to(od_server_t *server,
shapito_stream_t *stream,
od_schemestorage_t *server_scheme,
od_configstorage_t *server_config,
char *context)
{
od_instance_t *instance = server->system->instance;
@ -268,11 +268,11 @@ od_backend_connect_to(od_server_t *server,
return -1;
/* set network options */
machine_set_nodelay(server->io, instance->scheme.nodelay);
if (instance->scheme.keepalive > 0)
machine_set_keepalive(server->io, 1, instance->scheme.keepalive);
machine_set_nodelay(server->io, instance->config.nodelay);
if (instance->config.keepalive > 0)
machine_set_keepalive(server->io, 1, instance->config.keepalive);
int rc;
rc = machine_set_readahead(server->io, instance->scheme.readahead);
rc = machine_set_readahead(server->io, instance->config.readahead);
if (rc == -1) {
od_error(&instance->logger, context, NULL, server,
"failed to set readahead");
@ -280,22 +280,22 @@ od_backend_connect_to(od_server_t *server,
}
/* set tls options */
if (server_scheme->tls_mode != OD_TLS_DISABLE) {
server->tls = od_tls_backend(server_scheme);
if (server_config->tls_mode != OD_TLS_DISABLE) {
server->tls = od_tls_backend(server_config);
if (server->tls == NULL)
return -1;
}
/* resolve server address */
char port[16];
od_snprintf(port, sizeof(port), "%d", server_scheme->port);
od_snprintf(port, sizeof(port), "%d", server_config->port);
struct addrinfo *ai = NULL;
rc = machine_getaddrinfo(server_scheme->host, port, NULL, &ai, 0);
rc = machine_getaddrinfo(server_config->host, port, NULL, &ai, 0);
if (rc != 0) {
od_error(&instance->logger, context, NULL, server,
"failed to resolve %s:%d",
server_scheme->host,
server_scheme->port);
server_config->host,
server_config->port);
return -1;
}
assert(ai != NULL);
@ -306,14 +306,14 @@ od_backend_connect_to(od_server_t *server,
if (rc == -1) {
od_error(&instance->logger, context, server->client, server,
"failed to connect to %s:%d",
server_scheme->host,
server_scheme->port);
server_config->host,
server_config->port);
return -1;
}
/* do tls handshake */
if (server_scheme->tls_mode != OD_TLS_DISABLE) {
rc = od_tls_backend_connect(server, &instance->logger, stream, server_scheme);
if (server_config->tls_mode != OD_TLS_DISABLE) {
rc = od_tls_backend_connect(server, &instance->logger, stream, server_config);
if (rc == -1)
return -1;
}
@ -328,21 +328,21 @@ int od_backend_connect(od_server_t *server, shapito_stream_t *stream,
od_route_t *route = server->route;
assert(route != NULL);
od_schemestorage_t *server_scheme;
server_scheme = route->scheme->storage;
od_configstorage_t *server_config;
server_config = route->config->storage;
/* connect to server */
int rc;
rc = od_backend_connect_to(server, stream, server_scheme, context);
rc = od_backend_connect_to(server, stream, server_config, context);
if (rc == -1)
return -1;
/* log server connection */
if (instance->scheme.log_session) {
if (instance->config.log_session) {
od_log(&instance->logger, context, server->client, server,
"new server connection %s:%d",
server_scheme->host,
server_scheme->port);
server_config->host,
server_config->port);
}
/* send startup and do initial configuration */
@ -352,13 +352,13 @@ int od_backend_connect(od_server_t *server, shapito_stream_t *stream,
int od_backend_connect_cancel(od_server_t *server,
shapito_stream_t *stream,
od_schemestorage_t *server_scheme,
od_configstorage_t *server_config,
shapito_key_t *key)
{
od_instance_t *instance = server->system->instance;
/* connect to server */
int rc;
rc = od_backend_connect_to(server, stream, server_scheme, "cancel");
rc = od_backend_connect_to(server, stream, server_config, "cancel");
if (rc == -1)
return -1;
/* send cancel request */

View File

@ -8,7 +8,7 @@
*/
int od_backend_connect(od_server_t*, shapito_stream_t*, char*);
int od_backend_connect_cancel(od_server_t*, shapito_stream_t*, od_schemestorage_t*,
int od_backend_connect_cancel(od_server_t*, shapito_stream_t*, od_configstorage_t*,
shapito_key_t*);
void od_backend_close_connection(od_server_t*);
void od_backend_close(od_server_t*);

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -52,7 +52,7 @@
int od_cancel(od_system_t *system,
shapito_stream_t *stream,
od_schemestorage_t *server_scheme,
od_configstorage_t *server_config,
shapito_key_t *key,
od_id_t *server_id)
{
@ -64,7 +64,7 @@ int od_cancel(od_system_t *system,
od_server_t server;
od_server_init(&server);
server.system = system;
od_backend_connect_cancel(&server, stream, server_scheme, key);
od_backend_connect_cancel(&server, stream, server_config, key);
od_backend_close_connection(&server);
od_backend_close(&server);
return 0;
@ -89,8 +89,8 @@ int od_cancel_find(od_routepool_t *route_pool, shapito_key_t *key,
return -1;
od_route_t *route = server->route;
cancel->id = server->id;
cancel->scheme = od_schemestorage_copy(route->scheme->storage);
if (cancel->scheme == NULL)
cancel->config = od_configstorage_copy(route->config->storage);
if (cancel->config == NULL)
return -1;
cancel->key = server->key;
return 0;

View File

@ -7,7 +7,7 @@
* Advanced PostgreSQL connection pooler.
*/
int od_cancel(od_system_t*, shapito_stream_t*, od_schemestorage_t*, shapito_key_t*, od_id_t*);
int od_cancel(od_system_t*, shapito_stream_t*, od_configstorage_t*, shapito_key_t*, od_id_t*);
int od_cancel_find(od_routepool_t*, shapito_key_t*, od_routercancel_t*);
#endif

View File

@ -25,8 +25,8 @@ struct od_client
uint64_t coroutine_attacher_id;
machine_io_t *io;
machine_tls_t *tls;
od_schemeroute_t *scheme;
od_schemelisten_t *scheme_listen;
od_configroute_t *config;
od_configlisten_t *config_listen;
uint64_t time_accept;
uint64_t time_setup;
shapito_be_startup_t startup;
@ -48,8 +48,8 @@ od_client_init(od_client_t *client)
client->coroutine_attacher_id = 0;
client->io = NULL;
client->tls = NULL;
client->scheme = NULL;
client->scheme_listen = NULL;
client->config = NULL;
client->config_listen = NULL;
client->server = NULL;
client->route = NULL;
client->system = NULL;

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"

View File

@ -21,107 +21,107 @@
#include "sources/pid.h"
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
void od_scheme_init(od_scheme_t *scheme)
void od_config_init(od_config_t *config)
{
scheme->daemonize = 0;
scheme->log_debug = 0;
scheme->log_to_stdout = 1;
scheme->log_config = 0;
scheme->log_session = 1;
scheme->log_query = 0;
scheme->log_file = NULL;
scheme->log_stats = 1;
scheme->stats_interval = 3;
scheme->log_format = NULL;
scheme->pid_file = NULL;
scheme->log_syslog = 0;
scheme->log_syslog_ident = NULL;
scheme->log_syslog_facility = NULL;
scheme->readahead = 8192;
scheme->nodelay = 1;
scheme->keepalive = 7200;
scheme->workers = 1;
scheme->resolvers = 1;
scheme->client_max_set = 0;
scheme->client_max = 0;
scheme->cache = 100;
scheme->cache_chunk = 32 * 1024;
scheme->cache_coroutine = 0;
scheme->pipeline = 30 * 1024;
od_list_init(&scheme->storages);
od_list_init(&scheme->routes);
od_list_init(&scheme->listen);
config->daemonize = 0;
config->log_debug = 0;
config->log_to_stdout = 1;
config->log_config = 0;
config->log_session = 1;
config->log_query = 0;
config->log_file = NULL;
config->log_stats = 1;
config->stats_interval = 3;
config->log_format = NULL;
config->pid_file = NULL;
config->log_syslog = 0;
config->log_syslog_ident = NULL;
config->log_syslog_facility = NULL;
config->readahead = 8192;
config->nodelay = 1;
config->keepalive = 7200;
config->workers = 1;
config->resolvers = 1;
config->client_max_set = 0;
config->client_max = 0;
config->cache = 100;
config->cache_chunk = 32 * 1024;
config->cache_coroutine = 0;
config->pipeline = 30 * 1024;
od_list_init(&config->storages);
od_list_init(&config->routes);
od_list_init(&config->listen);
}
static void
od_schemelisten_free(od_schemelisten_t*);
od_configlisten_free(od_configlisten_t*);
void od_scheme_free(od_scheme_t *scheme)
void od_config_free(od_config_t *config)
{
od_list_t *i, *n;
od_list_foreach_safe(&scheme->routes, i, n) {
od_schemeroute_t *route;
route = od_container_of(i, od_schemeroute_t, link);
od_schemeroute_free(route);
od_list_foreach_safe(&config->routes, i, n) {
od_configroute_t *route;
route = od_container_of(i, od_configroute_t, link);
od_configroute_free(route);
}
od_list_foreach_safe(&scheme->listen, i, n) {
od_schemelisten_t *listen;
listen = od_container_of(i, od_schemelisten_t, link);
od_schemelisten_free(listen);
od_list_foreach_safe(&config->listen, i, n) {
od_configlisten_t *listen;
listen = od_container_of(i, od_configlisten_t, link);
od_configlisten_free(listen);
}
if (scheme->log_file)
free(scheme->log_file);
if (scheme->log_format)
free(scheme->log_format);
if (scheme->pid_file)
free(scheme->pid_file);
if (scheme->log_syslog_ident)
free(scheme->log_syslog_ident);
if (scheme->log_syslog_facility)
free(scheme->log_syslog_facility);
if (config->log_file)
free(config->log_file);
if (config->log_format)
free(config->log_format);
if (config->pid_file)
free(config->pid_file);
if (config->log_syslog_ident)
free(config->log_syslog_ident);
if (config->log_syslog_facility)
free(config->log_syslog_facility);
}
od_schemelisten_t*
od_schemelisten_add(od_scheme_t *scheme)
od_configlisten_t*
od_configlisten_add(od_config_t *config)
{
od_schemelisten_t *listen;
listen = (od_schemelisten_t*)malloc(sizeof(*scheme));
od_configlisten_t *listen;
listen = (od_configlisten_t*)malloc(sizeof(*config));
if (listen == NULL)
return NULL;
memset(listen, 0, sizeof(*listen));
listen->port = 6432;
listen->backlog = 128;
od_list_init(&listen->link);
od_list_append(&scheme->listen, &listen->link);
od_list_append(&config->listen, &listen->link);
return listen;
}
static void
od_schemelisten_free(od_schemelisten_t *scheme)
od_configlisten_free(od_configlisten_t *config)
{
if (scheme->host)
free(scheme->host);
if (scheme->tls)
free(scheme->tls);
if (scheme->tls_ca_file)
free(scheme->tls_ca_file);
if (scheme->tls_key_file)
free(scheme->tls_key_file);
if (scheme->tls_cert_file)
free(scheme->tls_cert_file);
if (scheme->tls_protocols)
free(scheme->tls_protocols);
free(scheme);
if (config->host)
free(config->host);
if (config->tls)
free(config->tls);
if (config->tls_ca_file)
free(config->tls_ca_file);
if (config->tls_key_file)
free(config->tls_key_file);
if (config->tls_cert_file)
free(config->tls_cert_file);
if (config->tls_protocols)
free(config->tls_protocols);
free(config);
}
static inline od_schemestorage_t*
od_schemestorage_allocate(void)
static inline od_configstorage_t*
od_configstorage_allocate(void)
{
od_schemestorage_t *storage;
storage = (od_schemestorage_t*)malloc(sizeof(*storage));
od_configstorage_t *storage;
storage = (od_configstorage_t*)malloc(sizeof(*storage));
if (storage == NULL)
return NULL;
memset(storage, 0, sizeof(*storage));
@ -130,7 +130,7 @@ od_schemestorage_allocate(void)
}
void
od_schemestorage_free(od_schemestorage_t *storage)
od_configstorage_free(od_configstorage_t *storage)
{
if (storage->name)
free(storage->name);
@ -152,48 +152,48 @@ od_schemestorage_free(od_schemestorage_t *storage)
free(storage);
}
od_schemestorage_t*
od_schemestorage_add(od_scheme_t *scheme)
od_configstorage_t*
od_configstorage_add(od_config_t *config)
{
od_schemestorage_t *storage;
storage = od_schemestorage_allocate();
od_configstorage_t *storage;
storage = od_configstorage_allocate();
if (storage == NULL)
return NULL;
od_list_append(&scheme->storages, &storage->link);
od_list_append(&config->storages, &storage->link);
return storage;
}
od_schemestorage_t*
od_schemestorage_match(od_scheme_t *scheme, char *name)
od_configstorage_t*
od_configstorage_match(od_config_t *config, char *name)
{
od_list_t *i;
od_list_foreach(&scheme->storages, i) {
od_schemestorage_t *storage;
storage = od_container_of(i, od_schemestorage_t, link);
od_list_foreach(&config->storages, i) {
od_configstorage_t *storage;
storage = od_container_of(i, od_configstorage_t, link);
if (strcmp(storage->name, name) == 0)
return storage;
}
return NULL;
}
od_schemestorage_t*
od_schemestorage_match_latest(od_scheme_t *scheme, char *name)
od_configstorage_t*
od_configstorage_match_latest(od_config_t *config, char *name)
{
od_list_t *i;
od_list_foreach(&scheme->storages, i) {
od_schemestorage_t *storage;
storage = od_container_of(i, od_schemestorage_t, link);
od_list_foreach(&config->storages, i) {
od_configstorage_t *storage;
storage = od_container_of(i, od_configstorage_t, link);
if (strcmp(storage->name, name) == 0)
return storage;
}
return NULL;
}
od_schemestorage_t*
od_schemestorage_copy(od_schemestorage_t *storage)
od_configstorage_t*
od_configstorage_copy(od_configstorage_t *storage)
{
od_schemestorage_t *copy;
copy = od_schemestorage_allocate();
od_configstorage_t *copy;
copy = od_configstorage_allocate();
if (copy == NULL)
return NULL;
copy->storage_type = storage->storage_type;
@ -237,12 +237,12 @@ od_schemestorage_copy(od_schemestorage_t *storage)
}
return copy;
error:
od_schemestorage_free(copy);
od_configstorage_free(copy);
return NULL;
}
static inline int
od_schemestorage_compare(od_schemestorage_t *a, od_schemestorage_t *b)
od_configstorage_compare(od_configstorage_t *a, od_configstorage_t *b)
{
/* type */
if (a->storage_type != b->storage_type)
@ -304,11 +304,11 @@ od_schemestorage_compare(od_schemestorage_t *a, od_schemestorage_t *b)
return 1;
}
od_schemeroute_t*
od_schemeroute_add(od_scheme_t *scheme, uint64_t version)
od_configroute_t*
od_configroute_add(od_config_t *config, uint64_t version)
{
od_schemeroute_t *route;
route = (od_schemeroute_t*)malloc(sizeof(*route));
od_configroute_t *route;
route = (od_configroute_t*)malloc(sizeof(*route));
if (route == NULL)
return NULL;
memset(route, 0, sizeof(*route));
@ -318,11 +318,11 @@ od_schemeroute_add(od_scheme_t *scheme, uint64_t version)
route->pool_cancel = 1;
route->pool_rollback = 1;
od_list_init(&route->link);
od_list_append(&scheme->routes, &route->link);
od_list_append(&config->routes, &route->link);
return route;
}
void od_schemeroute_free(od_schemeroute_t *route)
void od_configroute_free(od_configroute_t *route)
{
assert(route->refs == 0);
if (route->db_name)
@ -340,7 +340,7 @@ void od_schemeroute_free(od_schemeroute_t *route)
if (route->auth_query_user)
free(route->auth_query_user);
if (route->storage)
od_schemestorage_free(route->storage);
od_configstorage_free(route->storage);
if (route->storage_name)
free(route->storage_name);
if (route->storage_db)
@ -356,11 +356,11 @@ void od_schemeroute_free(od_schemeroute_t *route)
}
static inline void
od_schemeroute_cmpswap(od_schemeroute_t **dest, od_schemeroute_t *next)
od_configroute_cmpswap(od_configroute_t **dest, od_configroute_t *next)
{
/* update dest if (a) it is not set or (b) previous version is lower
* then new version */
od_schemeroute_t *prev = *dest;
od_configroute_t *prev = *dest;
if (prev == NULL) {
*dest = next;
return;
@ -370,31 +370,31 @@ od_schemeroute_cmpswap(od_schemeroute_t **dest, od_schemeroute_t *next)
*dest = next;
}
od_schemeroute_t*
od_schemeroute_forward(od_scheme_t *scheme, char *db_name, char *user_name)
od_configroute_t*
od_configroute_forward(od_config_t *config, char *db_name, char *user_name)
{
od_schemeroute_t *route_db_user = NULL;
od_schemeroute_t *route_db_default = NULL;
od_schemeroute_t *route_default_user = NULL;
od_schemeroute_t *route_default_default = NULL;
od_configroute_t *route_db_user = NULL;
od_configroute_t *route_db_default = NULL;
od_configroute_t *route_default_user = NULL;
od_configroute_t *route_default_default = NULL;
od_list_t *i;
od_list_foreach(&scheme->routes, i) {
od_schemeroute_t *route;
route = od_container_of(i, od_schemeroute_t, link);
od_list_foreach(&config->routes, i) {
od_configroute_t *route;
route = od_container_of(i, od_configroute_t, link);
if (route->db_is_default) {
if (route->user_is_default)
od_schemeroute_cmpswap(&route_default_default, route);
od_configroute_cmpswap(&route_default_default, route);
else
if (strcmp(route->user_name, user_name) == 0)
od_schemeroute_cmpswap(&route_default_user, route);
od_configroute_cmpswap(&route_default_user, route);
} else
if (strcmp(route->db_name, db_name) == 0) {
if (route->user_is_default)
od_schemeroute_cmpswap(&route_db_default, route);
od_configroute_cmpswap(&route_db_default, route);
else
if (strcmp(route->user_name, user_name) == 0)
od_schemeroute_cmpswap(&route_db_user, route);
od_configroute_cmpswap(&route_db_user, route);
}
}
@ -410,13 +410,13 @@ od_schemeroute_forward(od_scheme_t *scheme, char *db_name, char *user_name)
return route_default_default;
}
od_schemeroute_t*
od_schemeroute_match(od_scheme_t *scheme, char *db_name, char *user_name)
od_configroute_t*
od_configroute_match(od_config_t *config, char *db_name, char *user_name)
{
od_list_t *i;
od_list_foreach(&scheme->routes, i) {
od_schemeroute_t *route;
route = od_container_of(i, od_schemeroute_t, link);
od_list_foreach(&config->routes, i) {
od_configroute_t *route;
route = od_container_of(i, od_configroute_t, link);
if (strcmp(route->db_name, db_name) == 0 &&
strcmp(route->user_name, user_name) == 0)
return route;
@ -424,15 +424,15 @@ od_schemeroute_match(od_scheme_t *scheme, char *db_name, char *user_name)
return NULL;
}
od_schemeroute_t*
od_schemeroute_match_latest(od_scheme_t *scheme, char *db_name, char *user_name)
od_configroute_t*
od_configroute_match_latest(od_config_t *config, char *db_name, char *user_name)
{
/* match latest route scheme version */
od_schemeroute_t *match = NULL;
/* match latest route config version */
od_configroute_t *match = NULL;
od_list_t *i;
od_list_foreach(&scheme->routes, i) {
od_schemeroute_t *route;
route = od_container_of(i, od_schemeroute_t, link);
od_list_foreach(&config->routes, i) {
od_configroute_t *route;
route = od_container_of(i, od_configroute_t, link);
if (strcmp(route->db_name, db_name) != 0 ||
strcmp(route->user_name, user_name) != 0)
continue;
@ -446,7 +446,7 @@ od_schemeroute_match_latest(od_scheme_t *scheme, char *db_name, char *user_name)
return match;
}
int od_schemeroute_compare(od_schemeroute_t *a, od_schemeroute_t *b)
int od_configroute_compare(od_configroute_t *a, od_configroute_t *b)
{
/* db default */
if (a->db_is_default != b->db_is_default)
@ -500,7 +500,7 @@ int od_schemeroute_compare(od_schemeroute_t *a, od_schemeroute_t *b)
if (strcmp(a->storage_name, b->storage_name) != 0)
return 0;
if (! od_schemestorage_compare(a->storage, b->storage))
if (! od_configstorage_compare(a->storage, b->storage))
return 0;
/* storage_db */
@ -569,35 +569,35 @@ int od_schemeroute_compare(od_schemeroute_t *a, od_schemeroute_t *b)
return 1;
}
int od_scheme_validate(od_scheme_t *scheme, od_logger_t *logger)
int od_config_validate(od_config_t *config, od_logger_t *logger)
{
/* workers */
if (scheme->workers == 0) {
if (config->workers == 0) {
od_error(logger, "config", NULL, NULL, "bad workers number");
return -1;
}
/* resolvers */
if (scheme->resolvers == 0) {
if (config->resolvers == 0) {
od_error(logger, "config", NULL, NULL, "bad resolvers number");
return -1;
}
/* log format */
if (scheme->log_format == NULL) {
if (config->log_format == NULL) {
od_error(logger, "config", NULL, NULL, "log is not defined");
return -1;
}
/* listen */
if (od_list_empty(&scheme->listen)) {
if (od_list_empty(&config->listen)) {
od_error(logger, "config", NULL, NULL, "no listen servers defined");
return -1;
}
od_list_t *i;
od_list_foreach(&scheme->listen, i) {
od_schemelisten_t *listen;
listen = od_container_of(i, od_schemelisten_t, link);
od_list_foreach(&config->listen, i) {
od_configlisten_t *listen;
listen = od_container_of(i, od_configlisten_t, link);
if (listen->host == NULL) {
od_error(logger, "config", NULL, NULL, "listen host is not defined");
return -1;
@ -626,13 +626,13 @@ int od_scheme_validate(od_scheme_t *scheme, od_logger_t *logger)
}
/* storages */
if (od_list_empty(&scheme->storages)) {
if (od_list_empty(&config->storages)) {
od_error(logger, "config", NULL, NULL, "no storages defined");
return -1;
}
od_list_foreach(&scheme->storages, i) {
od_schemestorage_t *storage;
storage = od_container_of(i, od_schemestorage_t, link);
od_list_foreach(&config->storages, i) {
od_configstorage_t *storage;
storage = od_container_of(i, od_configstorage_t, link);
if (storage->type == NULL) {
od_error(logger, "config", NULL, NULL,
"storage '%s': no type is specified",
@ -678,14 +678,14 @@ int od_scheme_validate(od_scheme_t *scheme, od_logger_t *logger)
}
/* routes */
if (od_list_empty(&scheme->routes)) {
if (od_list_empty(&config->routes)) {
od_error(logger, "config", NULL, NULL, "no routes defined");
return -1;
}
od_schemeroute_t *route_default_default = NULL;
od_list_foreach(&scheme->routes, i) {
od_schemeroute_t *route;
route = od_container_of(i, od_schemeroute_t, link);
od_configroute_t *route_default_default = NULL;
od_list_foreach(&config->routes, i) {
od_configroute_t *route;
route = od_container_of(i, od_configroute_t, link);
/* ensure route default.default exists */
if (route->db_is_default && route->user_is_default) {
@ -693,22 +693,22 @@ int od_scheme_validate(od_scheme_t *scheme, od_logger_t *logger)
route_default_default = route;
}
/* match storage and make a copy of in the user scheme */
/* match storage and make a copy of in the user config */
if (route->storage_name == NULL) {
od_error(logger, "config", NULL, NULL,
"route '%s.%s': no route storage is specified",
route->db_name, route->user_name);
return -1;
}
od_schemestorage_t *storage;
storage = od_schemestorage_match(scheme, route->storage_name);
od_configstorage_t *storage;
storage = od_configstorage_match(config, route->storage_name);
if (storage == NULL) {
od_error(logger, "config", NULL, NULL,
"route '%s.%s': no route storage '%s' found",
route->db_name, route->user_name);
return -1;
}
route->storage = od_schemestorage_copy(storage);
route->storage = od_configstorage_copy(storage);
if (route->storage == NULL)
return -1;
@ -792,95 +792,95 @@ int od_scheme_validate(od_scheme_t *scheme, od_logger_t *logger)
return -1;
}
/* cleanup declarative storages scheme data */
/* cleanup declarative storages config data */
od_list_t *n;
od_list_foreach_safe(&scheme->storages, i, n) {
od_schemestorage_t *storage;
storage = od_container_of(i, od_schemestorage_t, link);
od_schemestorage_free(storage);
od_list_foreach_safe(&config->storages, i, n) {
od_configstorage_t *storage;
storage = od_container_of(i, od_configstorage_t, link);
od_configstorage_free(storage);
}
od_list_init(&scheme->storages);
od_list_init(&config->storages);
return 0;
}
static inline char*
od_scheme_yes_no(int value) {
od_config_yes_no(int value) {
return value ? "yes" : "no";
}
void od_scheme_print(od_scheme_t *scheme, od_logger_t *logger, int routes_only)
void od_config_print(od_config_t *config, od_logger_t *logger, int routes_only)
{
od_log(logger, "config", NULL, NULL,
"daemonize %s",
od_scheme_yes_no(scheme->daemonize));
if (scheme->pid_file)
od_config_yes_no(config->daemonize));
if (config->pid_file)
od_log(logger, "config", NULL, NULL,
"pid_file %s", scheme->pid_file);
"pid_file %s", config->pid_file);
if (routes_only)
goto log_routes;
if (scheme->log_format)
if (config->log_format)
od_log(logger, "config", NULL, NULL,
"log_format %s", scheme->log_format);
if (scheme->log_file)
"log_format %s", config->log_format);
if (config->log_file)
od_log(logger, "config", NULL, NULL,
"log_file %s", scheme->log_file);
"log_file %s", config->log_file);
od_log(logger, "config", NULL, NULL,
"log_to_stdout %s",
od_scheme_yes_no(scheme->log_to_stdout));
od_config_yes_no(config->log_to_stdout));
od_log(logger, "config", NULL, NULL,
"log_syslog %s",
od_scheme_yes_no(scheme->log_syslog));
if (scheme->log_syslog_ident)
od_config_yes_no(config->log_syslog));
if (config->log_syslog_ident)
od_log(logger, "config", NULL, NULL,
"log_syslog_ident %s", scheme->log_syslog_ident);
if (scheme->log_syslog_facility)
"log_syslog_ident %s", config->log_syslog_ident);
if (config->log_syslog_facility)
od_log(logger, "config", NULL, NULL,
"log_syslog_facility %s", scheme->log_syslog_facility);
"log_syslog_facility %s", config->log_syslog_facility);
od_log(logger, "config", NULL, NULL,
"log_debug %s",
od_scheme_yes_no(scheme->log_debug));
od_config_yes_no(config->log_debug));
od_log(logger, "config", NULL, NULL,
"log_config %s",
od_scheme_yes_no(scheme->log_config));
od_config_yes_no(config->log_config));
od_log(logger, "config", NULL, NULL,
"log_session %s",
od_scheme_yes_no(scheme->log_session));
od_config_yes_no(config->log_session));
od_log(logger, "config", NULL, NULL,
"log_query %s",
od_scheme_yes_no(scheme->log_query));
od_config_yes_no(config->log_query));
od_log(logger, "config", NULL, NULL,
"log_stats %s",
od_scheme_yes_no(scheme->log_stats));
od_config_yes_no(config->log_stats));
od_log(logger, "config", NULL, NULL,
"stats_interval %d", scheme->stats_interval);
"stats_interval %d", config->stats_interval);
od_log(logger, "config", NULL, NULL,
"readahead %d", scheme->readahead);
"readahead %d", config->readahead);
od_log(logger, "config", NULL, NULL,
"nodelay %s",
od_scheme_yes_no(scheme->nodelay));
od_config_yes_no(config->nodelay));
od_log(logger, "config", NULL, NULL,
"keepalive %d", scheme->keepalive);
if (scheme->client_max_set)
"keepalive %d", config->keepalive);
if (config->client_max_set)
od_log(logger, "config", NULL, NULL,
"client_max %d", scheme->client_max);
"client_max %d", config->client_max);
od_log(logger, "config", NULL, NULL,
"pipeline %d", scheme->pipeline);
"pipeline %d", config->pipeline);
od_log(logger, "config", NULL, NULL,
"cache %d", scheme->cache);
"cache %d", config->cache);
od_log(logger, "config", NULL, NULL,
"cache_chunk %d", scheme->cache_chunk);
"cache_chunk %d", config->cache_chunk);
od_log(logger, "config", NULL, NULL,
"cache_coroutine %d", scheme->cache_coroutine);
"cache_coroutine %d", config->cache_coroutine);
od_log(logger, "config", NULL, NULL,
"workers %d", scheme->workers);
"workers %d", config->workers);
od_log(logger, "config", NULL, NULL,
"resolvers %d", scheme->resolvers);
"resolvers %d", config->resolvers);
od_log(logger, "config", NULL, NULL, "");
od_list_t *i;
od_list_foreach(&scheme->listen, i)
od_list_foreach(&config->listen, i)
{
od_schemelisten_t *listen;
listen = od_container_of(i, od_schemelisten_t, link);
od_configlisten_t *listen;
listen = od_container_of(i, od_configlisten_t, link);
od_log(logger, "config", NULL, NULL, "listen");
od_log(logger, "config", NULL, NULL,
" host %s", listen->host);
@ -906,9 +906,9 @@ void od_scheme_print(od_scheme_t *scheme, od_logger_t *logger, int routes_only)
od_log(logger, "config", NULL, NULL, "");
}
log_routes:;
od_list_foreach(&scheme->routes, i) {
od_schemeroute_t *route;
route = od_container_of(i, od_schemeroute_t, link);
od_list_foreach(&config->routes, i) {
od_configroute_t *route;
route = od_container_of(i, od_configroute_t, link);
od_log(logger, "config", NULL, NULL, "route %s.%s.%d %s",
route->db_name,
route->user_name, route->version,
@ -943,7 +943,7 @@ log_routes:;
" client_max %d", route->client_max);
od_log(logger, "config", NULL, NULL,
" client_fwd_error %s",
od_scheme_yes_no(route->client_fwd_error));
od_config_yes_no(route->client_fwd_error));
od_log(logger, "config", NULL, NULL,
" storage %s", route->storage_name);
od_log(logger, "config", NULL, NULL,
@ -977,12 +977,12 @@ log_routes:;
" storage_user %s", route->storage_user);
od_log(logger, "config", NULL, NULL,
" log_debug %s",
od_scheme_yes_no(route->log_debug));
od_config_yes_no(route->log_debug));
od_log(logger, "config", NULL, NULL, "");
}
}
int od_scheme_merge(od_scheme_t *scheme, od_logger_t *logger, od_scheme_t *src)
int od_config_merge(od_config_t *config, od_logger_t *logger, od_config_t *src)
{
int count_obsolete = 0;
int count_deleted = 0;
@ -990,9 +990,9 @@ int od_scheme_merge(od_scheme_t *scheme, od_logger_t *logger, od_scheme_t *src)
/* mark all routes obsolete */
od_list_t *i;
od_list_foreach(&scheme->routes, i) {
od_schemeroute_t *route;
route = od_container_of(i, od_schemeroute_t, link);
od_list_foreach(&config->routes, i) {
od_configroute_t *route;
route = od_container_of(i, od_configroute_t, link);
route->is_obsolete = 1;
count_obsolete++;
}
@ -1000,14 +1000,14 @@ int od_scheme_merge(od_scheme_t *scheme, od_logger_t *logger, od_scheme_t *src)
/* select new routes */
od_list_t *n;
od_list_foreach_safe(&src->routes, i, n) {
od_schemeroute_t *route;
route = od_container_of(i, od_schemeroute_t, link);
od_configroute_t *route;
route = od_container_of(i, od_configroute_t, link);
/* find and compare origin route */
od_schemeroute_t *origin;
origin = od_schemeroute_match_latest(scheme, route->db_name, route->user_name);
od_configroute_t *origin;
origin = od_configroute_match_latest(config, route->db_name, route->user_name);
if (origin) {
if (od_schemeroute_compare(origin, route)) {
if (od_configroute_compare(origin, route)) {
origin->is_obsolete = 0;
count_obsolete--;
continue;
@ -1030,19 +1030,19 @@ int od_scheme_merge(od_scheme_t *scheme, od_logger_t *logger, od_scheme_t *src)
od_list_unlink(&route->link);
od_list_init(&route->link);
od_list_append(&scheme->routes, &route->link);
od_list_append(&config->routes, &route->link);
count_new++;
}
/* try to free obsolete schemes, which are unused by any
/* try to free obsolete configs, which are unused by any
* route at the moment */
if (count_obsolete) {
od_list_foreach_safe(&scheme->routes, i, n) {
od_schemeroute_t *route;
route = od_container_of(i, od_schemeroute_t, link);
od_list_foreach_safe(&config->routes, i, n) {
od_configroute_t *route;
route = od_container_of(i, od_configroute_t, link);
if (route->is_obsolete && route->refs == 0) {
od_schemeroute_free(route);
od_configroute_free(route);
count_deleted++;
count_obsolete--;
}

View File

@ -1,5 +1,5 @@
#ifndef OD_SCHEME_H
#define OD_SCHEME_H
#ifndef OD_CONFIG_H
#define OD_CONFIG_H
/*
* Odissey.
@ -7,10 +7,10 @@
* Advanced PostgreSQL connection pooler.
*/
typedef struct od_schemestorage od_schemestorage_t;
typedef struct od_schemeroute od_schemeroute_t;
typedef struct od_schemelisten od_schemelisten_t;
typedef struct od_scheme od_scheme_t;
typedef struct od_configstorage od_configstorage_t;
typedef struct od_configroute od_configroute_t;
typedef struct od_configlisten od_configlisten_t;
typedef struct od_config od_config_t;
typedef enum
{
@ -42,7 +42,7 @@ typedef enum
OD_TLS_VERIFY_FULL
} od_tls_t;
struct od_schemestorage
struct od_configstorage
{
char *name;
char *type;
@ -58,7 +58,7 @@ struct od_schemestorage
od_list_t link;
};
struct od_schemeroute
struct od_configroute
{
/* id */
char *db_name;
@ -80,7 +80,7 @@ struct od_schemeroute
char *password;
int password_len;
/* storage */
od_schemestorage_t *storage;
od_configstorage_t *storage;
char *storage_name;
char *storage_db;
char *storage_user;
@ -103,7 +103,7 @@ struct od_schemeroute
od_list_t link;
};
struct od_schemelisten
struct od_configlisten
{
char *host;
int port;
@ -117,7 +117,7 @@ struct od_schemelisten
od_list_t link;
};
struct od_scheme
struct od_config
{
/* main */
int daemonize;
@ -153,53 +153,53 @@ struct od_scheme
od_list_t listen;
};
void od_scheme_init(od_scheme_t*);
void od_scheme_free(od_scheme_t*);
int od_scheme_validate(od_scheme_t*, od_logger_t*);
void od_scheme_print(od_scheme_t*, od_logger_t*, int);
int od_scheme_merge(od_scheme_t*, od_logger_t*, od_scheme_t*);
void od_config_init(od_config_t*);
void od_config_free(od_config_t*);
int od_config_validate(od_config_t*, od_logger_t*);
void od_config_print(od_config_t*, od_logger_t*, int);
int od_config_merge(od_config_t*, od_logger_t*, od_config_t*);
od_schemelisten_t*
od_schemelisten_add(od_scheme_t*);
od_configlisten_t*
od_configlisten_add(od_config_t*);
od_schemestorage_t*
od_schemestorage_add(od_scheme_t*);
od_configstorage_t*
od_configstorage_add(od_config_t*);
od_schemestorage_t*
od_schemestorage_copy(od_schemestorage_t*);
od_configstorage_t*
od_configstorage_copy(od_configstorage_t*);
od_schemestorage_t*
od_schemestorage_match(od_scheme_t*, char*);
od_configstorage_t*
od_configstorage_match(od_config_t*, char*);
void od_schemestorage_free(od_schemestorage_t*);
void od_configstorage_free(od_configstorage_t*);
static inline void
od_schemeroute_ref(od_schemeroute_t *route)
od_configroute_ref(od_configroute_t *route)
{
route->refs++;
}
static inline void
od_schemeroute_unref(od_schemeroute_t *route)
od_configroute_unref(od_configroute_t *route)
{
assert(route->refs > 0);
route->refs--;
}
od_schemeroute_t*
od_schemeroute_add(od_scheme_t*, uint64_t);
od_configroute_t*
od_configroute_add(od_config_t*, uint64_t);
void od_schemeroute_free(od_schemeroute_t*);
void od_configroute_free(od_configroute_t*);
od_schemeroute_t*
od_schemeroute_forward(od_scheme_t*, char*, char*);
od_configroute_t*
od_configroute_forward(od_config_t*, char*, char*);
od_schemeroute_t*
od_schemeroute_match(od_scheme_t*, char*, char*);
od_configroute_t*
od_configroute_match(od_config_t*, char*, char*);
od_schemeroute_t*
od_schemeroute_match_latest(od_scheme_t*, char*, char*);
od_configroute_t*
od_configroute_match_latest(od_config_t*, char*, char*);
int od_schemeroute_compare(od_schemeroute_t*, od_schemeroute_t*);
int od_configroute_compare(od_configroute_t*, od_configroute_t*);
#endif /* OD_SCHEME_H */
#endif /* OD_CONFIG_H */

35
sources/config_mgr.h Normal file
View File

@ -0,0 +1,35 @@
#ifndef OD_CONFIG_MGR_H
#define OD_CONFIG_MGR_H
/*
* Odissey.
*
* Advanced PostgreSQL connection pooler.
*/
typedef struct od_configmgr od_configmgr_t;
struct od_configmgr
{
uint64_t version;
};
static inline void
od_configmgr_init(od_configmgr_t *mgr)
{
mgr->version = 0;
}
static inline uint64_t
od_configmgr_version(od_configmgr_t *mgr)
{
return mgr->version;
}
static inline uint64_t
od_configmgr_version_next(od_configmgr_t *mgr)
{
return ++mgr->version;
}
#endif /* OD_CONFIG_MGR_H */

View File

@ -31,8 +31,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/parser.h"
#include "sources/config_reader.h"
@ -99,7 +99,7 @@ enum
typedef struct
{
od_parser_t parser;
od_scheme_t *scheme;
od_config_t *config;
od_error_t *error;
char *config_file;
char *data;
@ -349,10 +349,10 @@ error:
static int
od_configreader_listen(od_configreader_t *reader)
{
od_scheme_t *scheme = reader->scheme;
od_config_t *config = reader->config;
od_schemelisten_t *listen;
listen = od_schemelisten_add(scheme);
od_configlisten_t *listen;
listen = od_configlisten_add(config);
if (listen == NULL) {
return -1;
}
@ -440,8 +440,8 @@ od_configreader_listen(od_configreader_t *reader)
static int
od_configreader_storage(od_configreader_t *reader)
{
od_schemestorage_t *storage;
storage = od_schemestorage_add(reader->scheme);
od_configstorage_t *storage;
storage = od_configstorage_add(reader->config);
if (storage == NULL)
return -1;
/* name */
@ -550,15 +550,15 @@ od_configreader_route(od_configreader_t *reader, char *db_name, int db_name_len,
user_name_len = strlen(user_name);
/* ensure route does not exists and add new route */
od_schemeroute_t *route;
route = od_schemeroute_match(reader->scheme, db_name, user_name);
od_configroute_t *route;
route = od_configroute_match(reader->config, db_name, user_name);
if (route) {
od_errorf(reader->error, "route '%s.%s': is redefined",
db_name, user_name);
free(user_name);
return -1;
}
route = od_schemeroute_add(reader->scheme, reader->version);
route = od_configroute_add(reader->config, reader->version);
if (route == NULL) {
free(user_name);
return -1;
@ -750,8 +750,8 @@ od_configreader_database(od_configreader_t *reader)
/* } */
if (token.value.num == '}') {
/* make sure that db.default is defined */
od_schemeroute_t *route;
route = od_schemeroute_match(reader->scheme, db_name, "default");
od_configroute_t *route;
route = od_configroute_match(reader->config, db_name, "default");
if (! route) {
od_errorf(reader->error, "route '%s.default': is not defined",
db_name);
@ -794,7 +794,7 @@ error:
static int
od_configreader_parse(od_configreader_t *reader)
{
od_scheme_t *scheme = reader->scheme;
od_config_t *config = reader->config;
for (;;)
{
od_token_t token;
@ -822,7 +822,7 @@ od_configreader_parse(od_configreader_t *reader)
char *config_file;
if (! od_configreader_string(reader, &config_file))
return -1;
rc = od_configreader_import(reader->scheme, reader->error, config_file,
rc = od_configreader_import(reader->config, reader->error, config_file,
reader->version);
free(config_file);
if (rc == -1)
@ -831,123 +831,123 @@ od_configreader_parse(od_configreader_t *reader)
}
/* daemonize */
case OD_LDAEMONIZE:
if (! od_configreader_yes_no(reader, &scheme->daemonize))
if (! od_configreader_yes_no(reader, &config->daemonize))
return -1;
continue;
/* pid_file */
case OD_LPID_FILE:
if (! od_configreader_string(reader, &scheme->pid_file))
if (! od_configreader_string(reader, &config->pid_file))
return -1;
continue;
/* log_debug */
case OD_LLOG_DEBUG:
if (! od_configreader_yes_no(reader, &scheme->log_debug))
if (! od_configreader_yes_no(reader, &config->log_debug))
return -1;
continue;
/* log_stdout */
case OD_LLOG_TO_STDOUT:
if (! od_configreader_yes_no(reader, &scheme->log_to_stdout))
if (! od_configreader_yes_no(reader, &config->log_to_stdout))
return -1;
continue;
/* log_config */
case OD_LLOG_CONFIG:
if (! od_configreader_yes_no(reader, &scheme->log_config))
if (! od_configreader_yes_no(reader, &config->log_config))
return -1;
continue;
/* log_session */
case OD_LLOG_SESSION:
if (! od_configreader_yes_no(reader, &scheme->log_session))
if (! od_configreader_yes_no(reader, &config->log_session))
return -1;
continue;
/* log_query */
case OD_LLOG_QUERY:
if (! od_configreader_yes_no(reader, &scheme->log_query))
if (! od_configreader_yes_no(reader, &config->log_query))
return -1;
continue;
/* log_stats */
case OD_LLOG_STATS:
if (! od_configreader_yes_no(reader, &scheme->log_stats))
if (! od_configreader_yes_no(reader, &config->log_stats))
return -1;
continue;
/* log_format */
case OD_LLOG_FORMAT:
if (! od_configreader_string(reader, &scheme->log_format))
if (! od_configreader_string(reader, &config->log_format))
return -1;
continue;
/* log_file */
case OD_LLOG_FILE:
if (! od_configreader_string(reader, &scheme->log_file))
if (! od_configreader_string(reader, &config->log_file))
return -1;
continue;
/* log_syslog */
case OD_LLOG_SYSLOG:
if (! od_configreader_yes_no(reader, &scheme->log_syslog))
if (! od_configreader_yes_no(reader, &config->log_syslog))
return -1;
continue;
/* log_syslog_ident */
case OD_LLOG_SYSLOG_IDENT:
if (! od_configreader_string(reader, &scheme->log_syslog_ident))
if (! od_configreader_string(reader, &config->log_syslog_ident))
return -1;
continue;
/* log_syslog_facility */
case OD_LLOG_SYSLOG_FACILITY:
if (! od_configreader_string(reader, &scheme->log_syslog_facility))
if (! od_configreader_string(reader, &config->log_syslog_facility))
return -1;
continue;
/* stats_interval */
case OD_LSTATS_INTERVAL:
if (! od_configreader_number(reader, &scheme->stats_interval))
if (! od_configreader_number(reader, &config->stats_interval))
return -1;
continue;
/* client_max */
case OD_LCLIENT_MAX:
if (! od_configreader_number(reader, &scheme->client_max))
if (! od_configreader_number(reader, &config->client_max))
return -1;
scheme->client_max_set = 1;
config->client_max_set = 1;
continue;
/* readahead */
case OD_LREADAHEAD:
if (! od_configreader_number(reader, &scheme->readahead))
if (! od_configreader_number(reader, &config->readahead))
return -1;
continue;
/* nodelay */
case OD_LNODELAY:
if (! od_configreader_yes_no(reader, &scheme->nodelay))
if (! od_configreader_yes_no(reader, &config->nodelay))
return -1;
continue;
/* keepalive */
case OD_LKEEPALIVE:
if (! od_configreader_number(reader, &scheme->keepalive))
if (! od_configreader_number(reader, &config->keepalive))
return -1;
continue;
/* workers */
case OD_LWORKERS:
if (! od_configreader_number(reader, &scheme->workers))
if (! od_configreader_number(reader, &config->workers))
return -1;
continue;
/* resolvers */
case OD_LRESOLVERS:
if (! od_configreader_number(reader, &scheme->resolvers))
if (! od_configreader_number(reader, &config->resolvers))
return -1;
continue;
/* pipeline */
case OD_LPIPELINE:
if (! od_configreader_number(reader, &scheme->pipeline))
if (! od_configreader_number(reader, &config->pipeline))
return -1;
continue;
/* cache */
case OD_LCACHE:
if (! od_configreader_number(reader, &scheme->cache))
if (! od_configreader_number(reader, &config->cache))
return -1;
continue;
/* cache_chunk */
case OD_LCACHE_CHUNK:
if (! od_configreader_number(reader, &scheme->cache_chunk))
if (! od_configreader_number(reader, &config->cache_chunk))
return -1;
continue;
/* cache_coroutine */
case OD_LCACHE_COROUTINE:
if (! od_configreader_number(reader, &scheme->cache_coroutine))
if (! od_configreader_number(reader, &config->cache_coroutine))
return -1;
continue;
/* listen */
@ -977,14 +977,14 @@ od_configreader_parse(od_configreader_t *reader)
return -1;
}
int od_configreader_import(od_scheme_t *scheme, od_error_t *error,
int od_configreader_import(od_config_t *config, od_error_t *error,
char *config_file,
uint64_t version)
{
od_configreader_t reader;
memset(&reader, 0, sizeof(reader));
reader.error = error;
reader.scheme = scheme;
reader.config = config;
reader.version = version;
int rc;
rc = od_configreader_open(&reader, config_file);

View File

@ -7,6 +7,6 @@
* Advanced PostgreSQL connection pooler.
*/
int od_configreader_import(od_scheme_t*, od_error_t*, char*, uint64_t);
int od_configreader_import(od_config_t*, od_error_t*, char*, uint64_t);
#endif /* OD_CONFIG_READER_H */

View File

@ -27,8 +27,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -642,7 +642,7 @@ od_console_query(od_console_t *console, od_msgconsole_t *msg_console)
if (rc == -1)
goto bad_command;
if (instance->scheme.log_query) {
if (instance->config.log_query) {
od_debug(&instance->logger, "console", client, NULL,
"%.*s", query_len, query);
}

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -67,7 +67,7 @@ od_cron_stats(od_router_t *router)
if (router->route_pool.count == 0)
return;
if (instance->scheme.log_stats)
if (instance->config.log_stats)
{
int stream_count = 0;
int stream_count_allocated = 0;
@ -127,40 +127,40 @@ od_cron_stats(od_router_t *router)
/* request count */
uint64_t reqs_prev = 0;
reqs_prev = route->cron_stats.count_request /
instance->scheme.stats_interval;
instance->config.stats_interval;
uint64_t reqs_current = 0;
reqs_current = stats.count_request /
instance->scheme.stats_interval;
instance->config.stats_interval;
int64_t reqs_diff;
reqs_diff = reqs_current - reqs_prev;
reqs = reqs_diff / instance->scheme.stats_interval;
reqs = reqs_diff / instance->config.stats_interval;
/* recv client */
uint64_t recv_client_prev = 0;
recv_client_prev = route->cron_stats.recv_client /
instance->scheme.stats_interval;
instance->config.stats_interval;
uint64_t recv_client_current = 0;
recv_client_current = stats.recv_client /
instance->scheme.stats_interval;
instance->config.stats_interval;
recv_client = (recv_client_current - recv_client_prev) /
instance->scheme.stats_interval;
instance->config.stats_interval;
/* recv server */
uint64_t recv_server_prev = 0;
recv_server_prev = route->cron_stats.recv_server /
instance->scheme.stats_interval;
instance->config.stats_interval;
uint64_t recv_server_current = 0;
recv_server_current = stats.recv_server /
instance->scheme.stats_interval;
instance->config.stats_interval;
recv_server = (recv_server_current - recv_server_prev) /
instance->scheme.stats_interval;
instance->config.stats_interval;
/* query time */
if (reqs_diff > 0)
@ -176,7 +176,7 @@ od_cron_stats(od_router_t *router)
route->cron_stats_avg.recv_server = recv_server;
route->cron_stats_avg.query_time = query_time;
if (instance->scheme.log_stats) {
if (instance->config.log_stats) {
od_log(&instance->logger, "stats", NULL, NULL,
"[%.*s.%.*s.%" PRIu64 "] %sclients %d, "
"pool_active %d, "
@ -189,8 +189,8 @@ od_cron_stats(od_router_t *router)
route->id.database,
route->id.user_len,
route->id.user,
route->scheme->version,
route->scheme->is_obsolete ? "(obsolete) " : "",
route->config->version,
route->config->is_obsolete ? "(obsolete) " : "",
od_clientpool_total(&route->client_pool),
route->server_pool.count_active,
route->server_pool.count_idle,
@ -209,24 +209,24 @@ od_cron_expire_mark(od_server_t *server, void *arg)
od_instance_t *instance = router->system->instance;
od_route_t *route = server->route;
/* expire by server scheme obsoletion */
if (route->scheme->is_obsolete &&
/* expire by server config obsoletion */
if (route->config->is_obsolete &&
od_clientpool_total(&route->client_pool) == 0) {
od_debug(&instance->logger, "expire", NULL, server,
"scheme marked as obsolete, schedule closing");
"config marked as obsolete, schedule closing");
od_serverpool_set(&route->server_pool, server,
OD_SEXPIRE);
return 0;
}
/* expire by time-to-live */
if (! route->scheme->pool_ttl)
if (! route->config->pool_ttl)
return 0;
od_debug(&instance->logger, "expire", NULL, server,
"idle time: %d",
server->idle_time);
if (server->idle_time < route->scheme->pool_ttl) {
if (server->idle_time < route->config->pool_ttl) {
server->idle_time++;
return 0;
}
@ -251,7 +251,7 @@ od_cron_expire(od_cron_t *cron)
* - If a server idle time is equal to ttl, then move
* it to the EXPIRE queue.
*
* - If a server scheme marked as obsolete and route has
* - If a server config marked as obsolete and route has
* no remaining clients, then move it to the EXPIRE queue.
*
* - Add plus one idle second on each traversal.
@ -290,7 +290,7 @@ od_cron_expire(od_cron_t *cron)
}
/* cleanup unused dynamic routes and obsolete
* db schemes */
* db configs */
od_routepool_gc(&router->route_pool);
}
@ -308,7 +308,7 @@ od_cron(void *arg)
od_cron_expire(cron);
/* update stats */
if (++stats_tick >= instance->scheme.stats_interval) {
if (++stats_tick >= instance->config.stats_interval) {
od_cron_stats(router);
stats_tick = 0;
}

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -220,7 +220,7 @@ od_frontend_startup(od_client_t *client)
/* client ssl request */
rc = od_tls_frontend_accept(client, &instance->logger,
client->scheme_listen,
client->config_listen,
client->tls);
if (rc == -1)
return -1;
@ -364,7 +364,7 @@ od_frontend_setup(od_client_t *client)
/* configure console client */
int rc;
if (route->scheme->storage->storage_type == OD_STORAGETYPE_LOCAL) {
if (route->config->storage->storage_type == OD_STORAGETYPE_LOCAL) {
rc = od_frontend_setup_console(stream);
if (rc == -1)
return OD_FE_EATTACH;
@ -445,7 +445,7 @@ od_frontend_setup(od_client_t *client)
client->time_setup = machine_time();
if (instance->scheme.log_session) {
if (instance->config.log_session) {
od_log(&instance->logger, "setup", client, NULL,
"login time: %d microseconds",
(client->time_setup - client->time_accept));
@ -460,7 +460,7 @@ static inline int
od_frontend_stream_hit_limit(od_client_t *client)
{
od_instance_t *instance = client->system->instance;
return shapito_stream_used(client->stream) >= instance->scheme.pipeline;
return shapito_stream_used(client->stream) >= instance->config.pipeline;
}
static od_frontend_rc_t
@ -571,7 +571,7 @@ od_frontend_remote_client(od_client_t *client)
server->is_copy = 0;
break;
case SHAPITO_FE_QUERY:
if (instance->scheme.log_query) {
if (instance->config.log_query) {
uint32_t query_len;
char *query;
rc = shapito_be_read_query(&query, &query_len, request, request_size);
@ -663,7 +663,7 @@ od_frontend_remote_server(od_client_t *client)
return OD_FE_ECLIENT_READ;
/* handle transaction pooling */
if (route->scheme->pool == OD_POOLING_TRANSACTION) {
if (route->config->pool == OD_POOLING_TRANSACTION) {
if (! server->is_transaction) {
/* cleanup server */
rc = od_reset(server, client->stream);
@ -814,7 +814,7 @@ od_frontend_cleanup(od_client_t *client, char *context,
case OD_FE_TERMINATE:
case OD_FE_OK:
/* graceful disconnect */
if (instance->scheme.log_session) {
if (instance->config.log_session) {
od_log(&instance->logger, context, client, server,
"client disconnected");
}
@ -875,7 +875,7 @@ od_frontend_cleanup(od_client_t *client, char *context,
{
/* server attached to client and connection failed */
od_route_t *route = client->route;
if (route->scheme->client_fwd_error && server->stats.count_error) {
if (route->config->client_fwd_error && server->stats.count_error) {
/* forward server error to client */
od_frontend_error_fwd(client);
} else {
@ -927,7 +927,7 @@ void od_frontend(void *arg)
od_instance_t *instance = client->system->instance;
/* log client connection */
if (instance->scheme.log_session) {
if (instance->config.log_session) {
char peer[128];
od_getpeername(client->io, peer, sizeof(peer), 1, 1);
od_log(&instance->logger, "startup", client, NULL,
@ -964,7 +964,7 @@ void od_frontend(void *arg)
od_routercancel_init(&cancel);
rc = od_router_cancel(client, &cancel);
if (rc == 0) {
od_cancel(client->system, client->stream, cancel.scheme,
od_cancel(client->system, client->stream, cancel.config,
&cancel.key, &cancel.id);
od_routercancel_free(&cancel);
}
@ -1005,13 +1005,13 @@ void od_frontend(void *arg)
case OD_ROK:
{
od_route_t *route = client->route;
if (instance->scheme.log_session) {
if (instance->config.log_session) {
od_log(&instance->logger, "startup", client, NULL,
"route '%s.%s' to '%s.%s'",
shapito_parameter_value(client->startup.database),
shapito_parameter_value(client->startup.user),
route->scheme->db_name,
route->scheme->user_name);
route->config->db_name,
route->config->user_name);
}
break;
}
@ -1039,7 +1039,7 @@ void od_frontend(void *arg)
/* main */
od_route_t *route = client->route;
switch (route->scheme->storage->storage_type) {
switch (route->config->storage->storage_type) {
case OD_STORAGETYPE_REMOTE:
frontend_rc = od_frontend_remote(client);
break;

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -53,8 +53,8 @@ void od_instance_init(od_instance_t *instance)
{
od_pid_init(&instance->pid);
od_logger_init(&instance->logger, &instance->pid);
od_scheme_init(&instance->scheme);
od_schememgr_init(&instance->scheme_mgr);
od_config_init(&instance->config);
od_configmgr_init(&instance->config_mgr);
od_idmgr_init(&instance->id_mgr);
shapito_cache_init(&instance->stream_cache);
instance->config_file = NULL;
@ -71,9 +71,9 @@ void od_instance_init(od_instance_t *instance)
void od_instance_free(od_instance_t *instance)
{
if (instance->scheme.pid_file)
od_pid_unlink(&instance->pid, instance->scheme.pid_file);
od_scheme_free(&instance->scheme);
if (instance->config.pid_file)
od_pid_unlink(&instance->pid, instance->config.pid_file);
od_config_free(&instance->config);
od_logger_close(&instance->logger);
shapito_cache_free(&instance->stream_cache);
machinarium_free();
@ -105,40 +105,40 @@ int od_instance_main(od_instance_t *instance, int argc, char **argv)
instance->config_file = argv[1];
/* read config file */
uint64_t scheme_version;
scheme_version = od_schememgr_version(&instance->scheme_mgr);
uint64_t config_version;
config_version = od_configmgr_version(&instance->config_mgr);
od_error_t error;
od_error_init(&error);
int rc;
rc = od_configreader_import(&instance->scheme, &error, instance->config_file,
scheme_version);
rc = od_configreader_import(&instance->config, &error, instance->config_file,
config_version);
if (rc == -1) {
od_error(&instance->logger, "config", NULL, NULL, "%s", error.error);
return -1;
}
/* validate configuration scheme */
rc = od_scheme_validate(&instance->scheme, &instance->logger);
/* validate configuration config */
rc = od_config_validate(&instance->config, &instance->logger);
if (rc == -1)
return -1;
/* set log in format */
od_logger_set_format(&instance->logger, instance->scheme.log_format);
od_logger_set_format(&instance->logger, instance->config.log_format);
/* set log debug messages */
od_logger_set_debug(&instance->logger, instance->scheme.log_debug);
od_logger_set_debug(&instance->logger, instance->config.log_debug);
/* set log to stdout */
od_logger_set_stdout(&instance->logger, instance->scheme.log_to_stdout);
od_logger_set_stdout(&instance->logger, instance->config.log_to_stdout);
/* set cache limits */
shapito_cache_set_limit(&instance->stream_cache, instance->scheme.cache);
shapito_cache_set_limit_size(&instance->stream_cache, instance->scheme.cache_chunk);
shapito_cache_set_limit(&instance->stream_cache, instance->config.cache);
shapito_cache_set_limit_size(&instance->stream_cache, instance->config.cache_chunk);
/* run as daemon */
if (instance->scheme.daemonize) {
if (instance->config.daemonize) {
rc = od_daemonize();
if (rc == -1)
return -1;
@ -147,26 +147,26 @@ int od_instance_main(od_instance_t *instance, int argc, char **argv)
}
/* init machinarium machinery */
machinarium_set_pool_size(instance->scheme.resolvers);
machinarium_set_coroutine_cache_size(instance->scheme.cache_coroutine);
machinarium_set_pool_size(instance->config.resolvers);
machinarium_set_coroutine_cache_size(instance->config.cache_coroutine);
machinarium_init();
/* reopen log file after config parsing */
if (instance->scheme.log_file) {
rc = od_logger_open(&instance->logger, instance->scheme.log_file);
if (instance->config.log_file) {
rc = od_logger_open(&instance->logger, instance->config.log_file);
if (rc == -1) {
od_error(&instance->logger, "init", NULL, NULL,
"failed to open log file '%s'",
instance->scheme.log_file);
instance->config.log_file);
return -1;
}
}
/* syslog */
if (instance->scheme.log_syslog) {
if (instance->config.log_syslog) {
od_logger_open_syslog(&instance->logger,
instance->scheme.log_syslog_ident,
instance->scheme.log_syslog_facility);
instance->config.log_syslog_ident,
instance->config.log_syslog_facility);
}
od_log(&instance->logger, "init", NULL, NULL, "odissey (git: %s %s)",
OD_VERSION_GIT,
@ -178,18 +178,18 @@ int od_instance_main(od_instance_t *instance, int argc, char **argv)
instance->config_file);
od_log(&instance->logger, "init", NULL, NULL, "");
if (instance->scheme.log_config)
od_scheme_print(&instance->scheme, &instance->logger, 0);
if (instance->config.log_config)
od_config_print(&instance->config, &instance->logger, 0);
/* create pid file */
if (instance->scheme.pid_file)
od_pid_create(&instance->pid, instance->scheme.pid_file);
if (instance->config.pid_file)
od_pid_create(&instance->pid, instance->config.pid_file);
/* seed id manager */
od_idmgr_seed(&instance->id_mgr);
/* is multi-worker deploy */
instance->is_shared = instance->scheme.workers > 1;
instance->is_shared = instance->config.workers > 1;
/* prepare system services */
od_pooler_t pooler;

View File

@ -14,8 +14,8 @@ struct od_instance
od_pid_t pid;
od_logger_t logger;
od_idmgr_t id_mgr;
od_schememgr_t scheme_mgr;
od_scheme_t scheme;
od_configmgr_t config_mgr;
od_config_t config;
shapito_cache_t stream_cache;
int is_shared;
char *config_file;

View File

@ -32,8 +32,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -371,12 +371,12 @@ void od_logger_write(od_logger_t *logger, od_logger_level_t level,
if (! is_debug) {
od_client_t *client_ref = client;
od_server_t *server_ref = server;
if (client_ref && client_ref->scheme) {
is_debug = client_ref->scheme->log_debug;
if (client_ref && client_ref->config) {
is_debug = client_ref->config->log_debug;
} else
if (server_ref && server_ref->route) {
od_route_t *route = server_ref->route;
is_debug = route->scheme->log_debug;
is_debug = route->config->log_debug;
}
}
if (! is_debug)

View File

@ -23,8 +23,8 @@
#include "sources/pid.h"
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/instance.h"

View File

@ -28,8 +28,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -62,7 +62,7 @@ od_pooler_server(void *arg)
/* accepted client io is not attached to epoll context yet */
machine_io_t *client_io;
int rc;
rc = machine_accept(server->io, &client_io, server->scheme->backlog,
rc = machine_accept(server->io, &client_io, server->config->backlog,
0, UINT32_MAX);
if (rc == -1) {
od_error(&instance->logger, "server", NULL, NULL,
@ -75,10 +75,10 @@ od_pooler_server(void *arg)
}
/* set network options */
machine_set_nodelay(client_io, instance->scheme.nodelay);
if (instance->scheme.keepalive > 0)
machine_set_keepalive(client_io, 1, instance->scheme.keepalive);
rc = machine_set_readahead(client_io, instance->scheme.readahead);
machine_set_nodelay(client_io, instance->config.nodelay);
if (instance->config.keepalive > 0)
machine_set_keepalive(client_io, 1, instance->config.keepalive);
rc = machine_set_readahead(client_io, instance->config.readahead);
if (rc == -1) {
od_error(&instance->logger, "server", NULL, NULL,
"failed to set client readahead: %s",
@ -99,7 +99,7 @@ od_pooler_server(void *arg)
}
od_idmgr_generate(&instance->id_mgr, &client->id, "c");
client->io = client_io;
client->scheme_listen = server->scheme;
client->config_listen = server->config;
client->tls = server->tls;
client->time_accept = machine_time();
@ -114,7 +114,7 @@ od_pooler_server(void *arg)
}
static inline int
od_pooler_server_start(od_pooler_t *pooler, od_schemelisten_t *scheme,
od_pooler_server_start(od_pooler_t *pooler, od_configlisten_t *config,
struct addrinfo *addr)
{
od_instance_t *instance = pooler->system.instance;
@ -125,13 +125,13 @@ od_pooler_server_start(od_pooler_t *pooler, od_schemelisten_t *scheme,
"failed to allocate pooler server object");
return -1;
}
server->scheme = scheme;
server->config = config;
server->addr = addr;
server->system = &pooler->system;
/* create server tls */
if (server->scheme->tls_mode != OD_TLS_DISABLE) {
server->tls = od_tls_frontend(server->scheme);
if (server->config->tls_mode != OD_TLS_DISABLE) {
server->tls = od_tls_frontend(server->config);
if (server->tls == NULL) {
od_error(&instance->logger, "server", NULL, NULL,
"failed to create tls handler");
@ -194,10 +194,10 @@ od_pooler_main(od_pooler_t *pooler)
od_instance_t *instance = pooler->system.instance;
int binded = 0;
od_list_t *i;
od_list_foreach(&instance->scheme.listen, i)
od_list_foreach(&instance->config.listen, i)
{
od_schemelisten_t *listen;
listen = od_container_of(i, od_schemelisten_t, link);
od_configlisten_t *listen;
listen = od_container_of(i, od_configlisten_t, link);
/* listen '*' */
struct addrinfo *hints_ptr = NULL;
@ -254,25 +254,25 @@ od_pooler_config_import(od_pooler_t *pooler)
od_log(&instance->logger, "config", NULL, NULL, "importing changes from '%s'",
instance->config_file);
od_scheme_t scheme;
od_scheme_init(&scheme);
uint64_t scheme_version;
scheme_version = od_schememgr_version_next(&instance->scheme_mgr);
od_config_t config;
od_config_init(&config);
uint64_t config_version;
config_version = od_configmgr_version_next(&instance->config_mgr);
od_error_t error;
od_error_init(&error);
int rc;
rc = od_configreader_import(&scheme, &error, instance->config_file,
scheme_version);
rc = od_configreader_import(&config, &error, instance->config_file,
config_version);
if (rc == -1) {
od_error(&instance->logger, "config", NULL, NULL,
"%s", error.error);
od_scheme_free(&scheme);
od_config_free(&config);
return;
}
rc = od_scheme_validate(&scheme, &instance->logger);
rc = od_config_validate(&config, &instance->logger);
if (rc == -1) {
od_scheme_free(&scheme);
od_config_free(&config);
return;
}
@ -282,13 +282,13 @@ od_pooler_config_import(od_pooler_t *pooler)
* present in new config file.
*/
int has_updates;
has_updates = od_scheme_merge(&instance->scheme, &instance->logger, &scheme);
has_updates = od_config_merge(&instance->config, &instance->logger, &config);
/* free unused settings */
od_scheme_free(&scheme);
od_config_free(&config);
if (has_updates && instance->scheme.log_config)
od_scheme_print(&instance->scheme, &instance->logger, 1);
if (has_updates && instance->config.log_config)
od_config_print(&instance->config, &instance->logger, 1);
}
static inline void
@ -361,7 +361,7 @@ od_pooler(void *arg)
/* start worker threads */
od_workerpool_t *worker_pool = pooler->system.worker_pool;
rc = od_workerpool_start(worker_pool, &pooler->system, instance->scheme.workers);
rc = od_workerpool_start(worker_pool, &pooler->system, instance->config.workers);
if (rc == -1)
return;

View File

@ -13,7 +13,7 @@ typedef struct od_poolerserver od_poolerserver_t;
struct od_poolerserver
{
struct addrinfo *addr;
od_schemelisten_t *scheme;
od_configlisten_t *config;
machine_io_t *io;
machine_tls_t *tls;
od_system_t *system;

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -64,7 +64,7 @@ int od_reset(od_server_t *server, shapito_stream_t *stream)
}
/* support route rollback off */
if (! route->scheme->pool_rollback) {
if (! route->config->pool_rollback) {
if (server->is_transaction) {
od_log(&instance->logger, "reset", server->client, server,
"in active transaction, closing");
@ -73,7 +73,7 @@ int od_reset(od_server_t *server, shapito_stream_t *stream)
}
/* support route cancel off */
if (! route->scheme->pool_cancel) {
if (! route->config->pool_cancel) {
if (! od_server_sync_is(server)) {
od_log(&instance->logger, "reset", server->client, server,
"not synchronized, closing");
@ -129,7 +129,7 @@ int od_reset(od_server_t *server, shapito_stream_t *stream)
wait_try_cancel++;
rc = od_cancel(server->system,
stream,
route->scheme->storage, &server->key,
route->config->storage, &server->key,
&server->id);
if (rc == -1)
goto error;
@ -143,7 +143,7 @@ int od_reset(od_server_t *server, shapito_stream_t *stream)
/* send rollback in case server has an active
* transaction running */
if (route->scheme->pool_rollback) {
if (route->config->pool_rollback) {
if (server->is_transaction) {
char query_rlb[] = "ROLLBACK";
rc = od_backend_query(server, stream, "reset rollback", query_rlb,

View File

@ -11,7 +11,7 @@ typedef struct od_route od_route_t;
struct od_route
{
od_schemeroute_t *scheme;
od_configroute_t *config;
od_routeid_t id;
od_serverstat_t cron_stats;
od_serverstat_t cron_stats_avg;
@ -24,7 +24,7 @@ struct od_route
static inline void
od_route_init(od_route_t *route)
{
route->scheme = NULL;
route->config = NULL;
od_routeid_init(&route->id);
od_serverpool_init(&route->server_pool);
od_clientpool_init(&route->client_pool);

View File

@ -24,8 +24,8 @@
#include "sources/pid.h"
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/system.h"
#include "sources/server.h"
@ -59,7 +59,7 @@ od_routepool_gc_route(od_routepool_t *pool, od_route_t *route)
od_clientpool_total(&route->client_pool) > 0)
return;
od_schemeroute_t *scheme = route->scheme;
od_configroute_t *config = route->config;
/* free route data */
assert(pool->count > 0);
@ -67,11 +67,11 @@ od_routepool_gc_route(od_routepool_t *pool, od_route_t *route)
od_list_unlink(&route->link);
od_route_free(route);
/* maybe free obsolete scheme db */
od_schemeroute_unref(scheme);
/* maybe free obsolete config db */
od_configroute_unref(config);
if (scheme->is_obsolete && scheme->refs == 0)
od_schemeroute_free(scheme);
if (config->is_obsolete && config->refs == 0)
od_configroute_free(config);
}
void od_routepool_gc(od_routepool_t *pool)
@ -85,7 +85,7 @@ void od_routepool_gc(od_routepool_t *pool)
}
od_route_t*
od_routepool_new(od_routepool_t *pool, od_schemeroute_t *scheme,
od_routepool_new(od_routepool_t *pool, od_configroute_t *config,
od_routeid_t *id)
{
od_route_t *route = od_route_allocate();
@ -97,7 +97,7 @@ od_routepool_new(od_routepool_t *pool, od_schemeroute_t *scheme,
od_route_free(route);
return NULL;
}
route->scheme = scheme;
route->config = config;
od_list_append(&pool->list, &route->link);
pool->count++;
return route;
@ -106,13 +106,13 @@ od_routepool_new(od_routepool_t *pool, od_schemeroute_t *scheme,
od_route_t*
od_routepool_match(od_routepool_t *pool,
od_routeid_t *key,
od_schemeroute_t *scheme)
od_configroute_t *config)
{
od_list_t *i;
od_list_foreach(&pool->list, i) {
od_route_t *route;
route = od_container_of(i, od_route_t, link);
if (route->scheme == scheme && od_routeid_compare(&route->id, key))
if (route->config == config && od_routeid_compare(&route->id, key))
return route;
}
return NULL;

View File

@ -26,11 +26,11 @@ void od_routepool_free(od_routepool_t*);
void od_routepool_gc(od_routepool_t*);
od_route_t*
od_routepool_new(od_routepool_t*, od_schemeroute_t*,
od_routepool_new(od_routepool_t*, od_configroute_t*,
od_routeid_t*);
od_route_t*
od_routepool_match(od_routepool_t*, od_routeid_t*, od_schemeroute_t*);
od_routepool_match(od_routepool_t*, od_routeid_t*, od_configroute_t*);
od_server_t*
od_routepool_next(od_routepool_t*, od_serverstate_t);

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -65,12 +65,12 @@ od_router_fwd(od_router_t *router, shapito_be_startup_t *startup)
assert(startup->database != NULL);
assert(startup->user != NULL);
/* match latest version of route scheme */
od_schemeroute_t *scheme;
scheme = od_schemeroute_forward(&instance->scheme,
/* match latest version of route config */
od_configroute_t *config;
config = od_configroute_forward(&instance->config,
shapito_parameter_value(startup->database),
shapito_parameter_value(startup->user));
assert(scheme != NULL);
assert(config != NULL);
od_routeid_t id = {
.database = shapito_parameter_value(startup->database),
@ -80,29 +80,29 @@ od_router_fwd(od_router_t *router, shapito_be_startup_t *startup)
};
/* force settings required by route */
if (scheme->storage_db) {
id.database = scheme->storage_db;
id.database_len = strlen(scheme->storage_db) + 1;
if (config->storage_db) {
id.database = config->storage_db;
id.database_len = strlen(config->storage_db) + 1;
}
if (scheme->storage_user) {
id.user = scheme->storage_user;
id.user_len = strlen(scheme->storage_user) + 1;
if (config->storage_user) {
id.user = config->storage_user;
id.user_len = strlen(config->storage_user) + 1;
}
/* match or create dynamic route */
od_route_t *route;
route = od_routepool_match(&router->route_pool, &id, scheme);
route = od_routepool_match(&router->route_pool, &id, config);
if (route) {
od_schemeroute_ref(scheme);
od_configroute_ref(config);
return route;
}
route = od_routepool_new(&router->route_pool, scheme, &id);
route = od_routepool_new(&router->route_pool, config, &id);
if (route == NULL) {
od_error(&instance->logger, "router", NULL, NULL,
"failed to allocate route");
return NULL;
}
od_schemeroute_ref(scheme);
od_configroute_ref(config);
return route;
}
@ -136,11 +136,11 @@ od_router_attacher(void *arg)
goto on_attach;
/* always start new connection, if pool_size is zero */
if (route->scheme->pool_size == 0)
if (route->config->pool_size == 0)
break;
/* maybe start new connection */
if (od_serverpool_total(&route->server_pool) < route->scheme->pool_size)
if (od_serverpool_total(&route->server_pool) < route->config->pool_size)
break;
/* pool_size limit implementation.
@ -153,14 +153,14 @@ od_router_attacher(void *arg)
*/
od_debug(&instance->logger, "router", client, NULL,
"route '%s.%s' pool limit reached (%d), waiting",
route->scheme->db_name,
route->scheme->user_name,
route->scheme->pool_size);
route->config->db_name,
route->config->user_name,
route->config->pool_size);
/* enqueue client */
od_clientpool_set(&route->client_pool, client, OD_CQUEUE);
uint32_t timeout = route->scheme->pool_timeout;
uint32_t timeout = route->config->pool_timeout;
if (timeout == 0)
timeout = UINT32_MAX;
int rc;
@ -169,8 +169,8 @@ od_router_attacher(void *arg)
od_clientpool_set(&route->client_pool, client, OD_CPENDING);
od_error(&instance->logger, "router", client, NULL,
"route '%s.%s' server pool wait timedout, closing",
route->scheme->db_name,
route->scheme->user_name);
route->config->db_name,
route->config->user_name);
msg_attach->status = OD_RERROR_TIMEDOUT;
machine_channel_write(msg_attach->response, msg);
return;
@ -249,11 +249,11 @@ od_router(void *arg)
msg_route = machine_msg_get_data(msg);
/* ensure global client_max limit */
if (instance->scheme.client_max_set) {
if (router->clients >= instance->scheme.client_max) {
if (instance->config.client_max_set) {
if (router->clients >= instance->config.client_max) {
od_log(&instance->logger, "router", NULL, NULL,
"router: global client_max limit reached (%d)",
instance->scheme.client_max);
instance->config.client_max);
msg_route->status = OD_RERROR_LIMIT;
machine_channel_write(msg_route->response, msg);
break;
@ -270,15 +270,15 @@ od_router(void *arg)
}
/* ensure route client_max limit */
if (route->scheme->client_max_set) {
if (route->config->client_max_set) {
int client_total;
client_total = od_clientpool_total(&route->client_pool);
if (client_total >= route->scheme->client_max) {
if (client_total >= route->config->client_max) {
od_log(&instance->logger, "router", NULL, NULL,
"route '%s.%s' client_max limit reached (%d)",
route->scheme->db_name,
route->scheme->user_name,
route->scheme->client_max);
route->config->db_name,
route->config->user_name,
route->config->client_max);
msg_route->status = OD_RERROR_LIMIT;
machine_channel_write(msg_route->response, msg);
break;
@ -289,7 +289,7 @@ od_router(void *arg)
od_clientpool_set(&route->client_pool, msg_route->client, OD_CPENDING);
router->clients++;
msg_route->client->scheme = route->scheme;
msg_route->client->config = route->config;
msg_route->client->route = route;
msg_route->status = OD_ROK;
machine_channel_write(msg_route->response, msg);
@ -445,7 +445,7 @@ od_router(void *arg)
case OD_MROUTER_CANCEL:
{
/* match server key and scheme by client key */
/* match server key and config by client key */
od_msgrouter_t *msg_cancel;
msg_cancel = machine_msg_get_data(msg);
int rc;

View File

@ -9,23 +9,23 @@
typedef struct
{
od_id_t id;
od_schemestorage_t *scheme;
shapito_key_t key;
od_id_t id;
od_configstorage_t *config;
shapito_key_t key;
} od_routercancel_t;
static inline void
od_routercancel_init(od_routercancel_t *cancel)
{
cancel->scheme = NULL;
cancel->config = NULL;
shapito_key_init(&cancel->key);
}
static inline void
od_routercancel_free(od_routercancel_t *cancel)
{
if (cancel->scheme)
od_schemestorage_free(cancel->scheme);
if (cancel->config)
od_configstorage_free(cancel->config);
}
#endif

View File

@ -1,35 +0,0 @@
#ifndef SCHEME_MGR_H
#define SCHEME_MGR_H
/*
* Odissey.
*
* Advanced PostgreSQL connection pooler.
*/
typedef struct od_schememgr od_schememgr_t;
struct od_schememgr
{
uint64_t version;
};
static inline void
od_schememgr_init(od_schememgr_t *mgr)
{
mgr->version = 0;
}
static inline uint64_t
od_schememgr_version(od_schememgr_t *mgr)
{
return mgr->version;
}
static inline uint64_t
od_schememgr_version_next(od_schememgr_t *mgr)
{
return ++mgr->version;
}
#endif /* SCHEME_MGR_H */

View File

@ -24,8 +24,8 @@
#include "sources/pid.h"
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/system.h"
#include "sources/server.h"
@ -139,11 +139,11 @@ od_serverpool_foreach(od_serverpool_t *pool,
{
od_list_t *target = NULL;
switch (state) {
case OD_SIDLE: target = &pool->idle;
case OD_SIDLE: target = &pool->idle;
break;
case OD_SEXPIRE: target = &pool->expire;
case OD_SEXPIRE: target = &pool->expire;
break;
case OD_SACTIVE: target = &pool->active;
case OD_SACTIVE: target = &pool->active;
break;
case OD_SUNDEF: assert(0);
break;

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"
@ -48,36 +48,36 @@
#include "sources/frontend.h"
machine_tls_t*
od_tls_frontend(od_schemelisten_t *scheme)
od_tls_frontend(od_configlisten_t *config)
{
int rc;
machine_tls_t *tls;
tls = machine_tls_create();
if (tls == NULL)
return NULL;
if (scheme->tls_mode == OD_TLS_ALLOW)
if (config->tls_mode == OD_TLS_ALLOW)
machine_tls_set_verify(tls, "none");
else
if (scheme->tls_mode == OD_TLS_REQUIRE)
if (config->tls_mode == OD_TLS_REQUIRE)
machine_tls_set_verify(tls, "peer");
else
machine_tls_set_verify(tls, "peer_strict");
if (scheme->tls_ca_file) {
rc = machine_tls_set_ca_file(tls, scheme->tls_ca_file);
if (config->tls_ca_file) {
rc = machine_tls_set_ca_file(tls, config->tls_ca_file);
if (rc == -1) {
machine_tls_free(tls);
return NULL;
}
}
if (scheme->tls_cert_file) {
rc = machine_tls_set_cert_file(tls, scheme->tls_cert_file);
if (config->tls_cert_file) {
rc = machine_tls_set_cert_file(tls, config->tls_cert_file);
if (rc == -1) {
machine_tls_free(tls);
return NULL;
}
}
if (scheme->tls_key_file) {
rc = machine_tls_set_key_file(tls, scheme->tls_key_file);
if (config->tls_key_file) {
rc = machine_tls_set_key_file(tls, config->tls_key_file);
if (rc == -1) {
machine_tls_free(tls);
return NULL;
@ -89,7 +89,7 @@ od_tls_frontend(od_schemelisten_t *scheme)
int
od_tls_frontend_accept(od_client_t *client,
od_logger_t *logger,
od_schemelisten_t *scheme,
od_configlisten_t *config,
machine_tls_t *tls)
{
shapito_stream_t *stream = client->stream;
@ -99,7 +99,7 @@ od_tls_frontend_accept(od_client_t *client,
od_debug(logger, "tls", client, NULL, "ssl request");
shapito_stream_reset(stream);
int rc;
if (scheme->tls_mode == OD_TLS_DISABLE) {
if (config->tls_mode == OD_TLS_DISABLE) {
/* not supported 'N' */
shapito_stream_write8(stream, 'N');
rc = od_write(client->io, stream);
@ -128,7 +128,7 @@ od_tls_frontend_accept(od_client_t *client,
od_debug(logger, "tls", client, NULL, "ok");
return 0;
}
switch (scheme->tls_mode) {
switch (config->tls_mode) {
case OD_TLS_DISABLE:
case OD_TLS_ALLOW:
break;
@ -142,36 +142,36 @@ od_tls_frontend_accept(od_client_t *client,
}
machine_tls_t*
od_tls_backend(od_schemestorage_t *scheme)
od_tls_backend(od_configstorage_t *config)
{
int rc;
machine_tls_t *tls;
tls = machine_tls_create();
if (tls == NULL)
return NULL;
if (scheme->tls_mode == OD_TLS_ALLOW)
if (config->tls_mode == OD_TLS_ALLOW)
machine_tls_set_verify(tls, "none");
else
if (scheme->tls_mode == OD_TLS_REQUIRE)
if (config->tls_mode == OD_TLS_REQUIRE)
machine_tls_set_verify(tls, "peer");
else
machine_tls_set_verify(tls, "peer_strict");
if (scheme->tls_ca_file) {
rc = machine_tls_set_ca_file(tls, scheme->tls_ca_file);
if (config->tls_ca_file) {
rc = machine_tls_set_ca_file(tls, config->tls_ca_file);
if (rc == -1) {
machine_tls_free(tls);
return NULL;
}
}
if (scheme->tls_cert_file) {
rc = machine_tls_set_cert_file(tls, scheme->tls_cert_file);
if (config->tls_cert_file) {
rc = machine_tls_set_cert_file(tls, config->tls_cert_file);
if (rc == -1) {
machine_tls_free(tls);
return NULL;
}
}
if (scheme->tls_key_file) {
rc = machine_tls_set_key_file(tls, scheme->tls_key_file);
if (config->tls_key_file) {
rc = machine_tls_set_key_file(tls, config->tls_key_file);
if (rc == -1) {
machine_tls_free(tls);
return NULL;
@ -184,7 +184,7 @@ int
od_tls_backend_connect(od_server_t *server,
od_logger_t *logger,
shapito_stream_t *stream,
od_schemestorage_t *scheme)
od_configstorage_t *config)
{
od_debug(logger, "tls", NULL, server, "init");
@ -223,7 +223,7 @@ od_tls_backend_connect(od_server_t *server,
break;
case 'N':
/* not supported */
if (scheme->tls_mode == OD_TLS_ALLOW) {
if (config->tls_mode == OD_TLS_ALLOW) {
od_debug(logger, "tls", NULL, server,
"not supported, continue (allow)");
} else {

View File

@ -8,17 +8,17 @@
*/
machine_tls_t*
od_tls_frontend(od_schemelisten_t*);
od_tls_frontend(od_configlisten_t*);
int
od_tls_frontend_accept(od_client_t*, od_logger_t*, od_schemelisten_t*,
od_tls_frontend_accept(od_client_t*, od_logger_t*, od_configlisten_t*,
machine_tls_t*);
machine_tls_t*
od_tls_backend(od_schemestorage_t*);
od_tls_backend(od_configstorage_t*);
int
od_tls_backend_connect(od_server_t*, od_logger_t*, shapito_stream_t*,
od_schemestorage_t*);
od_configstorage_t*);
#endif /* OD_TLS_H */

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"

View File

@ -26,8 +26,8 @@
#include "sources/id.h"
#include "sources/logger.h"
#include "sources/daemon.h"
#include "sources/scheme.h"
#include "sources/scheme_mgr.h"
#include "sources/config.h"
#include "sources/config_mgr.h"
#include "sources/config_reader.h"
#include "sources/msg.h"
#include "sources/system.h"