mirror of https://github.com/yandex/odyssey.git
odissey: add default route support
This commit is contained in:
parent
18a13e60f2
commit
bddb0afc19
|
@ -47,6 +47,7 @@ static odkeyword_t od_config_keywords[] =
|
|||
od_keyword("server", OD_LSERVER),
|
||||
/* routing */
|
||||
od_keyword("routing", OD_LROUTING),
|
||||
od_keyword("default", OD_LDEFAULT),
|
||||
od_keyword("route", OD_LROUTE),
|
||||
od_keyword("mode", OD_LMODE),
|
||||
od_keyword("database", OD_LDATABASE),
|
||||
|
@ -265,7 +266,12 @@ od_configparse_route(odconfig_t *config, odtoken_t *name)
|
|||
od_schemeroute_add(config->scheme);
|
||||
if (route == NULL)
|
||||
return -1;
|
||||
if (name == NULL) {
|
||||
route->is_default = 1;
|
||||
route->target = "";
|
||||
} else {
|
||||
route->target = name->v.string;
|
||||
}
|
||||
if (od_confignext(config, '{', NULL) == -1)
|
||||
return -1;
|
||||
odtoken_t *tk;
|
||||
|
@ -355,6 +361,12 @@ od_configparse_routing(odconfig_t *config)
|
|||
if (rc == -1)
|
||||
return -1;
|
||||
break;
|
||||
/* route default */
|
||||
case OD_LDEFAULT:
|
||||
rc = od_configparse_route(config, NULL);
|
||||
if (rc == -1)
|
||||
return -1;
|
||||
break;
|
||||
case OD_LEOF:
|
||||
od_configerror(config, tk, "unexpected end of config file");
|
||||
return -1;
|
||||
|
|
|
@ -24,6 +24,7 @@ enum {
|
|||
OD_LCLIENT_MAX,
|
||||
OD_LSERVER,
|
||||
OD_LROUTING,
|
||||
OD_LDEFAULT,
|
||||
OD_LROUTE,
|
||||
OD_LMODE,
|
||||
OD_LDATABASE,
|
||||
|
|
|
@ -28,6 +28,7 @@ void od_schemeinit(odscheme_t *scheme)
|
|||
scheme->pooling_mode = OD_PUNDEF;
|
||||
scheme->routing = NULL;
|
||||
scheme->routing_mode = OD_RUNDEF;
|
||||
scheme->routing_default = NULL;
|
||||
scheme->server_id = 0;
|
||||
od_listinit(&scheme->servers);
|
||||
od_listinit(&scheme->routing_table);
|
||||
|
@ -158,6 +159,8 @@ int od_schemevalidate(odscheme_t *scheme, odlog_t *log)
|
|||
}
|
||||
}
|
||||
|
||||
odscheme_route_t *default_route = NULL;
|
||||
|
||||
/* routing table */
|
||||
od_listforeach(&scheme->routing_table, i) {
|
||||
odscheme_route_t *route;
|
||||
|
@ -173,7 +176,15 @@ int od_schemevalidate(odscheme_t *scheme, odlog_t *log)
|
|||
route->route);
|
||||
return -1;
|
||||
}
|
||||
if (route->is_default) {
|
||||
if (default_route) {
|
||||
od_error(log, "more than one default route");
|
||||
return -1;
|
||||
}
|
||||
default_route = route;
|
||||
}
|
||||
}
|
||||
scheme->routing_default = default_route;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -208,8 +219,10 @@ void od_schemeprint(odscheme_t *scheme, odlog_t *log)
|
|||
od_listforeach(&scheme->routing_table, i) {
|
||||
odscheme_route_t *route;
|
||||
route = od_container_of(i, odscheme_route_t, link);
|
||||
od_log(log, " <%s>", route->database);
|
||||
od_log(log, " <%s>", route->target);
|
||||
od_log(log, " route '%s'", route->route);
|
||||
if (route->database)
|
||||
od_log(log, " database '%s'", route->database);
|
||||
if (route->user)
|
||||
od_log(log, " user '%s'", route->user);
|
||||
if (route->password)
|
||||
|
|
|
@ -35,6 +35,7 @@ struct odscheme_server_t {
|
|||
|
||||
struct odscheme_route_t {
|
||||
odscheme_server_t *server;
|
||||
int is_default;
|
||||
char *target;
|
||||
char *route;
|
||||
char *database;
|
||||
|
@ -65,6 +66,7 @@ struct odscheme_t {
|
|||
/* routing */
|
||||
char *routing;
|
||||
odrouting_t routing_mode;
|
||||
odscheme_route_t *routing_default;
|
||||
odlist_t routing_table;
|
||||
};
|
||||
|
||||
|
|
10
odissey.conf
10
odissey.conf
|
@ -36,7 +36,15 @@ 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"
|
||||
pool_min 0
|
||||
pool_max 100
|
||||
|
|
Loading…
Reference in New Issue