]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: lbprm: support for the "none" hash-type function
authorAurelien DARRAGON <adarragon@haproxy.com>
Wed, 11 Oct 2023 07:57:35 +0000 (09:57 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 13 Oct 2023 08:05:06 +0000 (10:05 +0200)
Allow the use of the "none" hash-type function so that the key resulting
from the sample expression is directly used as the hash.

This can be useful to do the hashing manually using available hashing
converters, or even custom ones, and then inform haproxy that it can
directly rely on the sample expression result which is explictly handled
as an integer in this case.

doc/configuration.txt
include/haproxy/backend-t.h
src/backend.c
src/cfgparse-listen.c

index d0643574b464b8d87783c859758aa886db357a26..73652aa9bc11a8942c66d3660ac1caf128ba722c 100644 (file)
@@ -6060,6 +6060,10 @@ hash-type <method> <function> <modifier>
               a better distribution or less predictable results especially when
               used on strings.
 
+       none   don't hash the key, the key will be used as a hash, this can be
+              useful to manually hash the key using a converter for that purpose
+              and let haproxy use the result directly.
+
     <modifier> indicates an optional method applied after hashing the key :
 
        avalanche   This directive indicates that the result from the hash
index cce451a33f0ec66faaa91b14f52b1539ab4771df..8d59738711a2344789a00efffd62b10f888b58f6 100644 (file)
 #define BE_LB_HASH_MOD    0x200000  /* get/clear hash modifier */
 
 /* BE_LB_HFCN_* is the hash function, to be used with BE_LB_HASH_FUNC */
-#define BE_LB_HFCN_SDBM   0x000000 /* sdbm hash */
-#define BE_LB_HFCN_DJB2   0x400000 /* djb2 hash */
-#define BE_LB_HFCN_WT6    0x800000 /* wt6 hash */
-#define BE_LB_HFCN_CRC32  0xC00000 /* crc32 hash */
-#define BE_LB_HASH_FUNC   0xC00000 /* get/clear hash function */
+#define BE_LB_HFCN_SDBM   0x000000  /* sdbm hash */
+#define BE_LB_HFCN_DJB2   0x400000  /* djb2 hash */
+#define BE_LB_HFCN_WT6    0x800000  /* wt6 hash */
+#define BE_LB_HFCN_CRC32  0xC00000  /* crc32 hash */
+#define BE_LB_HFCN_NONE   0x1000000 /* none - no hash */
+#define BE_LB_HASH_FUNC   0x1C00000 /* get/clear hash function */
 
 
 /* various constants */
index e0b5a58775caf96177844593e76d08c49a8b605d..e7e8d29ed7e0699fbd7e2620cdb5a5e2e291ee07 100644 (file)
@@ -84,6 +84,14 @@ static unsigned int gen_hash(const struct proxy* px, const char* key, unsigned l
        case BE_LB_HFCN_CRC32:
                hash = hash_crc32(key, len);
                break;
+       case BE_LB_HFCN_NONE:
+               /* use key as a hash */
+               {
+                       const char *_key = key;
+
+                       hash = read_int64(&_key, _key + len);
+               }
+               break;
        case BE_LB_HFCN_SDBM:
                /* this is the default hash function */
        default:
index cddb9fc7930bc280ea7a4aef802526a80e35ad15..f039a4eb37c485689862ee2e9797b31263d8aed4 100644 (file)
@@ -2624,6 +2624,9 @@ stats_error_parsing:
                        else if (strcmp(args[2], "crc32") == 0) {
                                curproxy->lbprm.algo |= BE_LB_HFCN_CRC32;
                        }
+                       else if (strcmp(args[2], "none") == 0) {
+                               curproxy->lbprm.algo |= BE_LB_HFCN_NONE;
+                       }
                        else {
                                ha_alert("parsing [%s:%d] : '%s' only supports 'sdbm', 'djb2', 'crc32', or 'wt6' hash functions.\n", file, linenum, args[0]);
                                err_code |= ERR_ALERT | ERR_FATAL;