diff --git a/doc/configuration.txt b/doc/configuration.txt index fb2f48d82..f2275f79a 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -5055,7 +5055,9 @@ stick-table type {ip | integer | string [len ] } size item specified here, the size of each entry will be inflated so that the additional data can fit. At the moment, only "conn_cum" is supported, which can be used to store and retrieve the total - number of connections matching the entry since it was created. + number of connections matching the entry since it was created. A + "server_id" type is also supported but it's only for internal + use for stick and store directives. The is only one stick-table per backend. At the moment of writing this doc, it does not seem useful to have multiple tables per backend. If this happens diff --git a/include/types/stick_table.h b/include/types/stick_table.h index 3e27b8f27..843f5d73e 100644 --- a/include/types/stick_table.h +++ b/include/types/stick_table.h @@ -41,6 +41,7 @@ enum { /* The types of extra data we can store in a stick table */ enum { + STKTABLE_DT_SERVER_ID, /* the server ID to use with this session if > 0 */ STKTABLE_DT_CONN_CUM, /* cumulated number of connections */ STKTABLE_DATA_TYPES /* Number of data types, must always be last */ }; @@ -48,6 +49,7 @@ enum { /* stick_table extra data. This is mainly used for casting or size computation */ union stktable_data { unsigned int conn_cum; + int server_id; }; /* known data types */ @@ -72,7 +74,6 @@ struct stktable_type { * keys and variable-sized data without making use of intermediate pointers. */ struct stksess { - int sid; /* id of server to use for this session */ unsigned int expire; /* session expiration date */ struct eb32_node exp; /* ebtree node used to hold the session in expiration tree */ struct ebmb_node key; /* ebtree node used to hold the session in table */ diff --git a/src/cfgparse.c b/src/cfgparse.c index 26c8ba744..d472f9963 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -4899,6 +4899,7 @@ int check_config_validity() else { free((void *)mrule->table.name); mrule->table.t = &(target->table); + stktable_alloc_data_type(&target->table, STKTABLE_DT_SERVER_ID); } } @@ -4931,6 +4932,7 @@ int check_config_validity() else { free((void *)mrule->table.name); mrule->table.t = &(target->table); + stktable_alloc_data_type(&target->table, STKTABLE_DT_SERVER_ID); } } diff --git a/src/session.c b/src/session.c index 873201c68..2ae6f906c 100644 --- a/src/session.c +++ b/src/session.c @@ -945,9 +945,11 @@ int process_sticking_rules(struct session *s, struct buffer *req, int an_bit) if ((ts = stktable_lookup_key(rule->table.t, key)) != NULL) { if (!(s->flags & SN_ASSIGNED)) { struct eb32_node *node; + void *ptr; /* srv found in table */ - node = eb32_lookup(&px->conf.used_server_id, ts->sid); + ptr = stktable_data_ptr(rule->table.t, ts, STKTABLE_DT_SERVER_ID); + node = eb32_lookup(&px->conf.used_server_id, stktable_data_cast(ptr, server_id)); if (node) { struct server *srv; @@ -1050,6 +1052,7 @@ int process_store_rules(struct session *s, struct buffer *rep, int an_bit) /* process store request and store response */ for (i = 0; i < s->store_count; i++) { struct stksess *ts; + void *ptr; ts = stktable_lookup(s->store[i].table, s->store[i].ts); if (ts) { @@ -1060,7 +1063,8 @@ int process_store_rules(struct session *s, struct buffer *rep, int an_bit) ts = stktable_store(s->store[i].table, s->store[i].ts); s->store[i].ts = NULL; - ts->sid = s->srv->puid; + ptr = stktable_data_ptr(s->store[i].table, ts, STKTABLE_DT_SERVER_ID); + stktable_data_cast(ptr, server_id) = s->srv->puid; } rep->analysers &= ~an_bit; diff --git a/src/stick_table.c b/src/stick_table.c index 994fbebef..017362f70 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -64,7 +64,6 @@ void stksess_setkey(struct stktable *t, struct stksess *ts, struct stktable_key static struct stksess *stksess_init(struct stktable *t, struct stksess * ts) { memset((void *)ts - t->data_size, 0, t->data_size); - ts->sid = 0; ts->key.node.leaf_p = NULL; ts->exp.node.leaf_p = NULL; return ts; @@ -476,6 +475,7 @@ int stktable_compatible_pattern(struct pattern_expr *expr, unsigned long table_t /* Extra data types processing */ struct stktable_data_type stktable_data_types[STKTABLE_DATA_TYPES] = { [STKTABLE_DT_CONN_CUM] = { .name = "conn_cum", .data_length = stktable_data_size(conn_cum) }, + [STKTABLE_DT_SERVER_ID] = { .name = "server_id", .data_length = stktable_data_size(server_id) }, }; /*