mirror of https://github.com/yandex/odyssey.git
odissey: implement router logic
This commit is contained in:
parent
0969a10775
commit
eb19ed9f76
|
@ -36,51 +36,47 @@
|
|||
static odroute_t*
|
||||
od_route(odpooler_t *pooler, sobestartup_t *startup)
|
||||
{
|
||||
(void)pooler;
|
||||
(void)startup;
|
||||
#if 0
|
||||
char *database = NULL;
|
||||
int database_len = 0;
|
||||
char *user = NULL;
|
||||
int user_len;
|
||||
assert(startup->database != NULL);
|
||||
assert(startup->user != NULL);
|
||||
|
||||
/* match required route according to scheme */
|
||||
odscheme_route_t *route_scheme;
|
||||
route_scheme = od_schemeroute_match(&pooler->od->scheme, NULL);
|
||||
route_scheme =
|
||||
od_schemeroute_match(&pooler->od->scheme, startup->database);
|
||||
if (route_scheme == NULL) {
|
||||
/* try to use default route */
|
||||
route_scheme = pooler->od->scheme.routing_default;
|
||||
if (route_scheme == NULL)
|
||||
return NULL;
|
||||
}
|
||||
odroute_id_t id = {
|
||||
.database = startup->database,
|
||||
.database_len = startup->database_len,
|
||||
.user = startup->user,
|
||||
.user_len = startup->user_len
|
||||
};
|
||||
|
||||
database = NULL; /* startup->database */
|
||||
database_len = 0; /* startup->database_len */
|
||||
user = NULL; /* startup->user */
|
||||
user_len = 0; /* startup->user_len */
|
||||
|
||||
/* force settings required by route */
|
||||
if (route_scheme->database) {
|
||||
database = route_scheme->database;
|
||||
database_len = strlen(database);
|
||||
id.database = route_scheme->database;
|
||||
id.database_len = strlen(route_scheme->database) + 1;
|
||||
}
|
||||
if (route_scheme->user) {
|
||||
user = route_scheme->user;
|
||||
user_len = strlen(user);
|
||||
id.user = route_scheme->user;
|
||||
id.user_len = strlen(route_scheme->user) + 1;
|
||||
}
|
||||
|
||||
/* match or create dynamic route */
|
||||
odroute_t *route;
|
||||
route = od_routepool_match(&pooler->route_pool,
|
||||
database, database_len,
|
||||
user, user_len);
|
||||
route = od_routepool_match(&pooler->route_pool, &id);
|
||||
if (route)
|
||||
return route;
|
||||
route = od_routepool_new(&pooler->route_pool,
|
||||
route_scheme,
|
||||
database, database_len,
|
||||
user, user_len);
|
||||
if (route)
|
||||
return route;
|
||||
/* error */
|
||||
#endif
|
||||
return NULL;
|
||||
route = od_routepool_new(&pooler->route_pool, route_scheme, &id);
|
||||
if (route == NULL) {
|
||||
od_error(&pooler->od->log, "failed to allocate route");
|
||||
return NULL;
|
||||
}
|
||||
return route;
|
||||
}
|
||||
|
||||
void od_router(void *arg)
|
||||
|
@ -111,6 +107,14 @@ void od_router(void *arg)
|
|||
|
||||
/* route client */
|
||||
odroute_t *route = od_route(pooler, &client->startup);
|
||||
if (route == NULL) {
|
||||
od_feerror(client, "odissey: database route could not be found");
|
||||
od_feclose(client);
|
||||
return;
|
||||
}
|
||||
|
||||
od_log(&pooler->od->log, "C: route to %s server",
|
||||
route->scheme->server->name);
|
||||
|
||||
/* get server connection for the route */
|
||||
odserver_t *server = od_bepop(pooler, route);
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit ee551985d439fdf980c9696247966f61fa8e1365
|
||||
Subproject commit 6ba685361b00226819c4e1ee600937475c21d652
|
|
@ -25,7 +25,7 @@ odissey {
|
|||
|
||||
server "default" {
|
||||
host "127.0.0.1"
|
||||
port 4321
|
||||
port 5432
|
||||
# tls_sslmode disable
|
||||
# tls_ca_file
|
||||
# tls_key_file
|
||||
|
@ -36,13 +36,6 @@ odissey {
|
|||
|
||||
routing {
|
||||
mode "forward" # round-robin
|
||||
"testdb" {
|
||||
route "default"
|
||||
pool_min 0
|
||||
pool_max 100
|
||||
client_max 100
|
||||
# force user, db, limits
|
||||
}
|
||||
|
||||
default {
|
||||
route "default"
|
||||
|
|
Loading…
Reference in New Issue