mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2025-01-20 20:50:44 +00:00
[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:
parent
68129b90eb
commit
13c29dee21
@ -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
|
||||
|
@ -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 */
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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) },
|
||||
};
|
||||
|
||||
/*
|
||||
|
Loading…
Reference in New Issue
Block a user