[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.
diff --git a/doc/configuration.txt b/doc/configuration.txt
index fb2f48d..f2275f7 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -5055,7 +5055,9 @@
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 3e27b8f..843f5d7 100644
--- a/include/types/stick_table.h
+++ b/include/types/stick_table.h
@@ -41,6 +41,7 @@
/* 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 @@
/* 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 @@
* 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 26c8ba7..d472f99 100644
--- a/src/cfgparse.c
+++ b/src/cfgparse.c
@@ -4899,6 +4899,7 @@
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 @@
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 873201c..2ae6f90 100644
--- a/src/session.c
+++ b/src/session.c
@@ -945,9 +945,11 @@
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 @@
/* 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 @@
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 994fbeb..017362f 100644
--- a/src/stick_table.c
+++ b/src/stick_table.c
@@ -64,7 +64,6 @@
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 @@
/* 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) },
};
/*