diff --git a/include/haproxy/stick_table.h b/include/haproxy/stick_table.h index e78bbd646..196aabb35 100644 --- a/include/haproxy/stick_table.h +++ b/include/haproxy/stick_table.h @@ -43,6 +43,7 @@ struct stksess *stksess_new(struct stktable *t, struct stktable_key *key); void stksess_setkey(struct stktable *t, struct stksess *ts, struct stktable_key *key); void stksess_free(struct stktable *t, struct stksess *ts); int stksess_kill(struct stktable *t, struct stksess *ts, int decrefcount); +int stktable_get_key_shard(struct stktable *t, const void *key, size_t len); int stktable_init(struct stktable *t); int stktable_parse_type(char **args, int *idx, unsigned long *type, size_t *key_size); diff --git a/src/stick_table.c b/src/stick_table.c index 152abf7e2..99b1d3334 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -156,13 +156,27 @@ void stksess_setkey(struct stktable *t, struct stksess *ts, struct stktable_key } } -/* - * Initialize or update the key hash in the sticky session present in table - * from the value present in . +/* return a shard number for key of len present in table . This + * takes into account the presence or absence of a peers section with shards + * and the number of shards, the table's hash_seed, and of course the key. The + * caller must pass a valid and . The shard number to be used by the + * entry is returned (from 1 to nb_shards, otherwise 0 for none). */ -static unsigned long long stksess_getkey_hash(struct stktable *t, - struct stksess *ts, - struct stktable_key *key) +int stktable_get_key_shard(struct stktable *t, const void *key, size_t len) +{ + /* no peers section or no shards in the peers section */ + if (!t->peers.p || !t->peers.p->nb_shards) + return 0; + + return XXH64(key, len, t->hash_seed) % t->peers.p->nb_shards + 1; +} + +/* + * Set the shard for key of sticky session attached to stick table. + * Use zero for stick-table without peers synchronisation. + */ +static void stksess_setkey_shard(struct stktable *t, struct stksess *ts, + struct stktable_key *key) { size_t keylen; @@ -171,24 +185,7 @@ static unsigned long long stksess_getkey_hash(struct stktable *t, else keylen = t->key_size; - return XXH64(key->key, keylen, t->hash_seed); -} - -/* - * Set the shard for key of sticky session attached to stick table. - * Do nothing for stick-table without peers synchronisation. - */ -static void stksess_setkey_shard(struct stktable *t, struct stksess *ts, - struct stktable_key *key) -{ - if (!t->peers.p) - /* This stick-table is not attached to any peers section */ - return; - - if (!t->peers.p->nb_shards) - ts->shard = 0; - else - ts->shard = stksess_getkey_hash(t, ts, key) % t->peers.p->nb_shards + 1; + ts->shard = stktable_get_key_shard(t, key->key, keylen); } /*