[MEDIUM] stick_table: move the server ID to a generic data type

The server ID is now stored just as any other data type. It is only
allocated if needed and is manipulated just like the other ones.
This commit is contained in:
Willy Tarreau 2010-06-06 16:40:39 +02:00
parent 68129b90eb
commit 13c29dee21
5 changed files with 14 additions and 5 deletions

View File

@ -5055,7 +5055,9 @@ stick-table type {ip | integer | string [len <length>] } size <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

View File

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

View File

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

View File

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

View File

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