another big merge of routers

This commit is contained in:
roberto@precise64
2012-05-13 07:44:05 +02:00
parent 06b4300d09
commit f041509f15
5 changed files with 61 additions and 4 deletions
+28
View File
@@ -25,6 +25,7 @@ void uwsgi_opt_corerouter(char *opt, char *value, void *cr) {
void uwsgi_opt_corerouter_use_socket(char *opt, char *value, void *cr) {
struct uwsgi_corerouter *ucr = (struct uwsgi_corerouter *) cr;
ucr->use_socket = 1;
ucr->has_backends++;
if (value) {
ucr->socket_num = atoi(value);
@@ -35,12 +36,14 @@ void uwsgi_opt_corerouter_use_base(char *opt, char *value, void *cr) {
struct uwsgi_corerouter *ucr = (struct uwsgi_corerouter *) cr;
ucr->base = value;
ucr->base_len = strlen(ucr->base);
ucr->has_backends++;
}
void uwsgi_opt_corerouter_use_pattern(char *opt, char *value, void *cr) {
struct uwsgi_corerouter *ucr = (struct uwsgi_corerouter *) cr;
ucr->pattern = value;
ucr->pattern_len = strlen(ucr->pattern);
ucr->has_backends++;
}
@@ -112,6 +115,8 @@ void uwsgi_opt_corerouter_cs(char *opt, char *value, void *cr) {
ucr->code_string_code = cs_code + 1;
ucr->code_string_function = cs_func + 1;
ucr->has_backends++;
}
void uwsgi_opt_corerouter_ss(char *opt, char *value, void *cr) {
@@ -121,6 +126,8 @@ void uwsgi_opt_corerouter_ss(char *opt, char *value, void *cr) {
ugs->subscription = 1;
ucr->has_subscription_sockets++;
ucr->has_backends++;
}
@@ -455,6 +462,9 @@ void uwsgi_corerouter_loop(int id, void *data) {
else if (ucr->static_nodes) {
ucr->mapper = uwsgi_cr_map_use_static_nodes;
}
else if (ucr->use_cluster) {
ucr->mapper = uwsgi_cr_map_use_cluster;
}
#ifdef UWSGI_SCTP
else if (ucr->has_sctp_sockets > 0) {
ucr->mapper = uwsgi_cr_map_use_sctp;
@@ -632,6 +642,24 @@ int uwsgi_corerouter_init(struct uwsgi_corerouter *ucr) {
if (!ucr->nevents)
ucr->nevents = 64;
// check if the router has configured backends
if (ucr->use_cache ||
ucr->pattern ||
ucr->has_subscription_sockets ||
ucr->base ||
(ucr->code_string_code && ucr->code_string_function) ||
ucr->to_socket ||
ucr->static_nodes ||
ucr->use_cluster
#ifdef UWSGI_SCTP
|| ucr->has_sctp_sockets
#endif
) {
ucr->has_backends = 1;
}
uwsgi_corerouter_setup_sockets(ucr);
if (ucr->processes < 1)
+4
View File
@@ -22,6 +22,7 @@ struct uwsgi_corerouter {
void (*switch_events)(struct uwsgi_corerouter *, struct corerouter_session *, int);
int has_sockets;
int has_backends;
int has_subscription_sockets;
#ifdef UWSGI_SCTP
int has_sctp_sockets;
@@ -59,6 +60,8 @@ struct uwsgi_corerouter {
int socket_num;
struct uwsgi_socket *to_socket;
int use_cluster;
struct uwsgi_subscribe_slot *subscriptions;
int subscription_regexp;
@@ -167,6 +170,7 @@ void corerouter_close_session(struct uwsgi_corerouter *, struct corerouter_sessi
int uwsgi_cr_map_use_void(struct uwsgi_corerouter *, struct corerouter_session *);
int uwsgi_cr_map_use_cache(struct uwsgi_corerouter *, struct corerouter_session *);
int uwsgi_cr_map_use_pattern(struct uwsgi_corerouter *, struct corerouter_session *);
int uwsgi_cr_map_use_cluster(struct uwsgi_corerouter *, struct corerouter_session *);
int uwsgi_cr_map_use_subscription(struct uwsgi_corerouter *, struct corerouter_session *);
int uwsgi_cr_map_use_base(struct uwsgi_corerouter *, struct corerouter_session *);
int uwsgi_cr_map_use_cs(struct uwsgi_corerouter *, struct corerouter_session *);
+9
View File
@@ -83,6 +83,15 @@ int uwsgi_cr_map_use_to(struct uwsgi_corerouter *ucr, struct corerouter_session
return 0;
}
int uwsgi_cr_map_use_cluster(struct uwsgi_corerouter *ucr, struct corerouter_session *cr_session) {
cr_session->instance_address = uwsgi_cluster_best_node();
if (cr_session->instance_address) {
cr_session->instance_address_len = strlen(cr_session->instance_address);
}
return 0;
}
int uwsgi_cr_map_use_static_nodes(struct uwsgi_corerouter *ucr, struct corerouter_session *cr_session) {
if (!ucr->current_static_node) {
ucr->current_static_node = ucr->static_nodes;
+3 -1
View File
@@ -30,9 +30,11 @@ struct uwsgi_option fastrouter_options[] = {
{"fastrouter-use-base", required_argument, 0, "use a base dir for fastrouter hostname->server mapping", uwsgi_opt_corerouter_use_base, &ufr, 0},
{"fastrouter-fallback", required_argument, 0, "fallback to the specified node in case of error", uwsgi_opt_add_string_list, &ufr.cr.fallback, 0},
{"fastrouter-use-cluster", no_argument, 0, "load balance to nodes subscribed to the cluster", uwsgi_opt_true, &ufr.cr.use_cluster, 0},
{"fastrouter-use-code-string", required_argument, 0, "use code string as hostname->server mapper for the fastrouter", uwsgi_opt_corerouter_cs, &ufr, 0},
{"fastrouter-use-socket", optional_argument, 0, "forward request to the specified uwsgi socket", uwsgi_opt_corerouter_use_socket, NULL, 0},
{"fastrouter-use-socket", optional_argument, 0, "forward request to the specified uwsgi socket", uwsgi_opt_corerouter_use_socket, &ufr, 0},
{"fastrouter-to", required_argument, 0, "forward requests to the specified uwsgi server (you can specify it multiple times for load balancing)", uwsgi_opt_add_string_list, &ufr.cr.static_nodes, 0},
{"fastrouter-gracetime", required_argument, 0, "retry connections to dead static nodes after the specified amount of seconds", uwsgi_opt_set_int, &ufr.cr.static_node_gracetime, 0},
{"fastrouter-events", required_argument, 0, "set the maximum number of concurrent events", uwsgi_opt_set_int, &ufr.cr.nevents, 0},
+17 -3
View File
@@ -33,18 +33,27 @@ struct uwsgi_option http_options[] = {
{"http-processes", required_argument, 0, "set the number of http processes to spawn", uwsgi_opt_set_int, &uhttp.cr.processes, 0},
{"http-workers", required_argument, 0, "set the number of http processes to spawn", uwsgi_opt_set_int, &uhttp.cr.processes, 0},
{"http-var", required_argument, 0, "add a key=value item to the generated uwsgi packet", uwsgi_opt_add_string_list, &uhttp.http_vars, 0},
//{"http-to", required_argument, 0, "forward requests to the specified node", uwsgi_opt_corerouter_use_to, NULL, 0 },
{"http-to", required_argument, 0, "forward requests to the specified node (you can specify it multiple time for lb)", uwsgi_opt_add_string_list, &uhttp.cr.static_nodes, 0 },
{"http-zerg", required_argument, 0, "attach the http router to a zerg server", uwsgi_opt_corerouter_zerg, &uhttp, 0 },
{"http-fallback", required_argument, 0, "fallback to the specified node in case of error", uwsgi_opt_add_string_list, &uhttp.cr.fallback, 0},
{"http-modifier1", required_argument, 0, "set uwsgi protocol modifier1", uwsgi_opt_set_int, &uhttp.modifier1, 0},
{"http-use-cache", no_argument, 0, "use uWSGI cache as key->value virtualhost mapper", uwsgi_opt_true, &uhttp.cr.use_cache, 0},
{"http-use-pattern", required_argument, 0, "use the specified pattern for mapping requests to unix sockets", uwsgi_opt_corerouter_use_pattern, NULL, 0},
{"http-use-pattern", required_argument, 0, "use the specified pattern for mapping requests to unix sockets", uwsgi_opt_corerouter_use_pattern, &uhttp, 0},
{"http-use-base", required_argument, 0, "use the specified base for mapping requests to unix sockets", uwsgi_opt_corerouter_use_base, &uhttp, 0},
//{"http-use-cluster", no_argument, 0, "load balance to nodes subscribed to the cluster", uwsgi_opt_true, &uhttp.cr.use_cluster, 0},
{"http-use-cluster", no_argument, 0, "load balance to nodes subscribed to the cluster", uwsgi_opt_true, &uhttp.cr.use_cluster, 0},
{"http-events", required_argument, 0, "set the number of concurrent http async events", uwsgi_opt_set_int, &uhttp.cr.nevents, 0},
{"http-subscription-server", required_argument, 0, "enable the subscription server", uwsgi_opt_corerouter_ss, &uhttp, 0},
{"http-subscription-use-regexp", no_argument, 0, "enable regexp usage in subscription system", uwsgi_opt_true, &uhttp.cr.subscription_regexp, 0},
{"http-timeout", required_argument, 0, "set internal http socket timeout", uwsgi_opt_set_int, &uhttp.cr.socket_timeout, 0},
{"http-manage-expect", no_argument, 0, "manage the Expect HTTP request header", uwsgi_opt_true, &uhttp.manage_expect, 0},
{"http-use-code-string", required_argument, 0, "use code string as hostname->server mapper for the http router", uwsgi_opt_corerouter_cs, &uhttp, 0},
{"http-use-socket", optional_argument, 0, "forward request to the specified uwsgi socket", uwsgi_opt_corerouter_use_socket, &uhttp, 0},
{"http-gracetime", required_argument, 0, "retry connections to dead static nodes after the specified amount of seconds", uwsgi_opt_set_int, &uhttp.cr.static_node_gracetime, 0},
{"http-quiet", required_argument, 0, "do not report failed connections to instances", uwsgi_opt_true, &uhttp.cr.quiet, 0},
{"http-cheap", no_argument, 0, "run the http router in cheap mode", uwsgi_opt_true, &uhttp.cr.cheap, 0},
{"http-stats", required_argument, 0, "run the http router stats server", uwsgi_opt_set_str, &uhttp.cr.stats_server, 0},
{"http-stats-server", required_argument, 0, "run the http router stats server", uwsgi_opt_set_str, &uhttp.cr.stats_server, 0},
{"http-ss", required_argument, 0, "run the http router stats server", uwsgi_opt_set_str, &uhttp.cr.stats_server, 0},
@@ -635,6 +644,11 @@ int http_init() {
uhttp.cr.switch_events = uwsgi_http_switch_events;
uhttp.cr.alloc_session = http_alloc_session;
uwsgi_corerouter_init((struct uwsgi_corerouter *) &uhttp);
if (uhttp.cr.has_sockets && !uwsgi.sockets && !uhttp.cr.has_backends) {
uwsgi_new_socket(uwsgi_concat2("127.0.0.1:0", ""));
uhttp.cr.use_socket = 1;
uhttp.cr.socket_num = 0;
}
return 0;
}