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),
|
od_keyword("server", OD_LSERVER),
|
||||||
/* routing */
|
/* routing */
|
||||||
od_keyword("routing", OD_LROUTING),
|
od_keyword("routing", OD_LROUTING),
|
||||||
|
od_keyword("default", OD_LDEFAULT),
|
||||||
od_keyword("route", OD_LROUTE),
|
od_keyword("route", OD_LROUTE),
|
||||||
od_keyword("mode", OD_LMODE),
|
od_keyword("mode", OD_LMODE),
|
||||||
od_keyword("database", OD_LDATABASE),
|
od_keyword("database", OD_LDATABASE),
|
||||||
|
@ -265,7 +266,12 @@ od_configparse_route(odconfig_t *config, odtoken_t *name)
|
||||||
od_schemeroute_add(config->scheme);
|
od_schemeroute_add(config->scheme);
|
||||||
if (route == NULL)
|
if (route == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
route->target = name->v.string;
|
if (name == NULL) {
|
||||||
|
route->is_default = 1;
|
||||||
|
route->target = "";
|
||||||
|
} else {
|
||||||
|
route->target = name->v.string;
|
||||||
|
}
|
||||||
if (od_confignext(config, '{', NULL) == -1)
|
if (od_confignext(config, '{', NULL) == -1)
|
||||||
return -1;
|
return -1;
|
||||||
odtoken_t *tk;
|
odtoken_t *tk;
|
||||||
|
@ -355,6 +361,12 @@ od_configparse_routing(odconfig_t *config)
|
||||||
if (rc == -1)
|
if (rc == -1)
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
|
/* route default */
|
||||||
|
case OD_LDEFAULT:
|
||||||
|
rc = od_configparse_route(config, NULL);
|
||||||
|
if (rc == -1)
|
||||||
|
return -1;
|
||||||
|
break;
|
||||||
case OD_LEOF:
|
case OD_LEOF:
|
||||||
od_configerror(config, tk, "unexpected end of config file");
|
od_configerror(config, tk, "unexpected end of config file");
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -24,6 +24,7 @@ enum {
|
||||||
OD_LCLIENT_MAX,
|
OD_LCLIENT_MAX,
|
||||||
OD_LSERVER,
|
OD_LSERVER,
|
||||||
OD_LROUTING,
|
OD_LROUTING,
|
||||||
|
OD_LDEFAULT,
|
||||||
OD_LROUTE,
|
OD_LROUTE,
|
||||||
OD_LMODE,
|
OD_LMODE,
|
||||||
OD_LDATABASE,
|
OD_LDATABASE,
|
||||||
|
|
|
@ -28,6 +28,7 @@ void od_schemeinit(odscheme_t *scheme)
|
||||||
scheme->pooling_mode = OD_PUNDEF;
|
scheme->pooling_mode = OD_PUNDEF;
|
||||||
scheme->routing = NULL;
|
scheme->routing = NULL;
|
||||||
scheme->routing_mode = OD_RUNDEF;
|
scheme->routing_mode = OD_RUNDEF;
|
||||||
|
scheme->routing_default = NULL;
|
||||||
scheme->server_id = 0;
|
scheme->server_id = 0;
|
||||||
od_listinit(&scheme->servers);
|
od_listinit(&scheme->servers);
|
||||||
od_listinit(&scheme->routing_table);
|
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 */
|
/* routing table */
|
||||||
od_listforeach(&scheme->routing_table, i) {
|
od_listforeach(&scheme->routing_table, i) {
|
||||||
odscheme_route_t *route;
|
odscheme_route_t *route;
|
||||||
|
@ -173,7 +176,15 @@ int od_schemevalidate(odscheme_t *scheme, odlog_t *log)
|
||||||
route->route);
|
route->route);
|
||||||
return -1;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -208,8 +219,10 @@ void od_schemeprint(odscheme_t *scheme, odlog_t *log)
|
||||||
od_listforeach(&scheme->routing_table, i) {
|
od_listforeach(&scheme->routing_table, i) {
|
||||||
odscheme_route_t *route;
|
odscheme_route_t *route;
|
||||||
route = od_container_of(i, odscheme_route_t, link);
|
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);
|
od_log(log, " route '%s'", route->route);
|
||||||
|
if (route->database)
|
||||||
|
od_log(log, " database '%s'", route->database);
|
||||||
if (route->user)
|
if (route->user)
|
||||||
od_log(log, " user '%s'", route->user);
|
od_log(log, " user '%s'", route->user);
|
||||||
if (route->password)
|
if (route->password)
|
||||||
|
|
|
@ -35,6 +35,7 @@ struct odscheme_server_t {
|
||||||
|
|
||||||
struct odscheme_route_t {
|
struct odscheme_route_t {
|
||||||
odscheme_server_t *server;
|
odscheme_server_t *server;
|
||||||
|
int is_default;
|
||||||
char *target;
|
char *target;
|
||||||
char *route;
|
char *route;
|
||||||
char *database;
|
char *database;
|
||||||
|
@ -47,25 +48,26 @@ struct odscheme_route_t {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct odscheme_t {
|
struct odscheme_t {
|
||||||
char *config_file;
|
char *config_file;
|
||||||
int server_id;
|
int server_id;
|
||||||
/* main */
|
/* main */
|
||||||
int daemonize;
|
int daemonize;
|
||||||
char *log_file;
|
char *log_file;
|
||||||
char *pid_file;
|
char *pid_file;
|
||||||
char *pooling;
|
char *pooling;
|
||||||
odpooling_t pooling_mode;
|
odpooling_t pooling_mode;
|
||||||
/* listen */
|
/* listen */
|
||||||
char *host;
|
char *host;
|
||||||
int port;
|
int port;
|
||||||
int workers;
|
int workers;
|
||||||
int client_max;
|
int client_max;
|
||||||
/* servers */
|
/* servers */
|
||||||
odlist_t servers;
|
odlist_t servers;
|
||||||
/* routing */
|
/* routing */
|
||||||
char *routing;
|
char *routing;
|
||||||
odrouting_t routing_mode;
|
odrouting_t routing_mode;
|
||||||
odlist_t routing_table;
|
odscheme_route_t *routing_default;
|
||||||
|
odlist_t routing_table;
|
||||||
};
|
};
|
||||||
|
|
||||||
void od_schemeinit(odscheme_t*);
|
void od_schemeinit(odscheme_t*);
|
||||||
|
|
10
odissey.conf
10
odissey.conf
|
@ -36,7 +36,15 @@ odissey {
|
||||||
|
|
||||||
routing {
|
routing {
|
||||||
mode "forward" # round-robin
|
mode "forward" # round-robin
|
||||||
"*" {
|
"testdb" {
|
||||||
|
route "default"
|
||||||
|
pool_min 0
|
||||||
|
pool_max 100
|
||||||
|
client_max 100
|
||||||
|
# force user, db, limits
|
||||||
|
}
|
||||||
|
|
||||||
|
default {
|
||||||
route "default"
|
route "default"
|
||||||
pool_min 0
|
pool_min 0
|
||||||
pool_max 100
|
pool_max 100
|
||||||
|
|
Loading…
Reference in New Issue