mirror of https://github.com/yandex/odyssey.git
odissey: major scheme rework, rename it to config
This commit is contained in:
parent
a096d258b7
commit
bb826db7e8
|
@ -4,7 +4,7 @@ set(od_src
|
|||
pid.c
|
||||
daemon.c
|
||||
logger.c
|
||||
scheme.c
|
||||
config.c
|
||||
config_reader.c
|
||||
id.c
|
||||
instance.c
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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*);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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--;
|
||||
}
|
|
@ -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 */
|
|
@ -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 */
|
|
@ -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);
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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"
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 */
|
|
@ -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;
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 */
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue