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), 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;

View File

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

View File

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

View File

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

View File

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