odissey: add default route support

This commit is contained in:
Dmitry Simonenko 2016-11-11 13:27:31 +03:00
parent 18a13e60f2
commit bddb0afc19
5 changed files with 54 additions and 18 deletions

View File

@ -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;

View File

@ -24,6 +24,7 @@ enum {
OD_LCLIENT_MAX,
OD_LSERVER,
OD_LROUTING,
OD_LDEFAULT,
OD_LROUTE,
OD_LMODE,
OD_LDATABASE,

View File

@ -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)

View File

@ -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;
};

View File

@ -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