Commit 2676c2e3 authored by Nils Goroll's avatar Nils Goroll

shard director vcc enum overhaul

parent 4094cf5b
......@@ -12,8 +12,8 @@ libvmod_directors_la_SOURCES = \
shard_cfg.h \
shard_dir.c \
shard_dir.h \
shard_parse_vcc_enums.h \
shard_parse_vcc_enums.c
tbl_by.h \
tbl_healthy.h
# Use vmodtool.py generated automake boilerplate
include $(srcdir)/automake_boilerplate.am
-efile(451, "tbl_*.h") // No include guard
......@@ -27,7 +27,19 @@
* SUCH DAMAGE.
*/
#include "shard_parse_vcc_enums.h"
enum by_e {
_BY_E_INVALID = 0,
#define VMODENUM(x) BY_ ## x,
#include "tbl_by.h"
_BY_E_MAX
};
enum healthy_e {
_HEALTHY_E_INVALID = 0,
#define VMODENUM(x) x,
#include "tbl_healthy.h"
_HEALTHY_E_MAX
};
struct vbitmap;
......
/*
* for the time being, this code is auto-generated outside the varnishd source
* tree, see
* https://code.uplex.de/uplex-varnish/libvmod-vslp/blob/shard/src/gen_enum_parse.pl
*
* TODO: integrate in vmodtool.py or replace with something else
*/
/*lint -e801 */
#include "shard_parse_vcc_enums.h"
#define term(c) ((c) == '\0')
enum alg_e parse_alg_e (const char *m) {
enum alg_e r;
switch (m[0]) {
case 'C': goto _0C; // CRC32
case 'R': goto _0R; // RS
case 'S': goto _0S; // SHA256
default: goto invalid;
}
_0C:
//CRC32
if ((m[1] == 'R') && (m[2] == 'C') && (m[3] == '3') && (m[4] == '2') && (term(m[5]))) {
r = CRC32;
goto ok;
}
goto invalid;
_0R:
//RS
if ((m[1] == 'S') && (term(m[2]))) {
r = RS;
goto ok;
}
goto invalid;
_0S:
//SHA256
if ((m[1] == 'H') && (m[2] == 'A') && (m[3] == '2') && (m[4] == '5') && (m[5] == '6') && (term(m[6]))) {
r = SHA256;
goto ok;
}
goto invalid;
ok:
return r;
invalid:
return _ALG_E_INVALID;
}
enum by_e parse_by_e (const char *m) {
enum by_e r;
switch (m[0]) {
case 'B': goto _0B; // BLOB
case 'H': goto _0H; // HASH
case 'K': goto _0K; // KEY
case 'U': goto _0U; // URL
default: goto invalid;
}
_0B:
//BLOB
if ((m[1] == 'L') && (m[2] == 'O') && (m[3] == 'B') && (term(m[4]))) {
r = BY_BLOB;
goto ok;
}
goto invalid;
_0H:
//HASH
if ((m[1] == 'A') && (m[2] == 'S') && (m[3] == 'H') && (term(m[4]))) {
r = BY_HASH;
goto ok;
}
goto invalid;
_0K:
//KEY
if ((m[1] == 'E') && (m[2] == 'Y') && (term(m[3]))) {
r = BY_KEY;
goto ok;
}
goto invalid;
_0U:
//URL
if ((m[1] == 'R') && (m[2] == 'L') && (term(m[3]))) {
r = BY_URL;
goto ok;
}
goto invalid;
ok:
return r;
invalid:
return _BY_E_INVALID;
}
enum healthy_e parse_healthy_e (const char *m) {
enum healthy_e r;
switch (m[0]) {
case 'A': goto _0A; // ALL
case 'C': goto _0C; // CHOSEN
case 'I': goto _0I; // IGNORE
default: goto invalid;
}
_0A:
//ALL
if ((m[1] == 'L') && (m[2] == 'L') && (term(m[3]))) {
r = ALL;
goto ok;
}
goto invalid;
_0C:
//CHOSEN
if ((m[1] == 'H') && (m[2] == 'O') && (m[3] == 'S') && (m[4] == 'E') && (m[5] == 'N') && (term(m[6]))) {
r = CHOSEN;
goto ok;
}
goto invalid;
_0I:
//IGNORE
if ((m[1] == 'G') && (m[2] == 'N') && (m[3] == 'O') && (m[4] == 'R') && (m[5] == 'E') && (term(m[6]))) {
r = IGNORE;
goto ok;
}
goto invalid;
ok:
return r;
invalid:
return _HEALTHY_E_INVALID;
}
/*
* for the time being, this code is auto-generated outside the varnishd source
* tree, see
* https://code.uplex.de/uplex-varnish/libvmod-vslp/blob/shard/src/gen_enum_parse.pl
*
* TODO: integrate in vmodtool.py or replace with something else
*/
enum alg_e {
_ALG_E_INVALID = 0,
CRC32,
SHA256,
RS,
_ALG_E_MAX
};
enum alg_e parse_alg_e (const char *);
/*lint -esym(769, by_e::_BY_E_MAX) */
enum by_e {
_BY_E_INVALID = 0,
BY_HASH,
BY_URL,
BY_KEY,
BY_BLOB,
_BY_E_MAX
};
enum by_e parse_by_e (const char *);
/*lint -esym(769, healthy_e::_HEALTHY_E_MAX) */
enum healthy_e {
_HEALTHY_E_INVALID = 0,
CHOSEN,
IGNORE,
ALL,
_HEALTHY_E_MAX
};
enum healthy_e parse_healthy_e (const char *);
VMODENUM(HASH)
VMODENUM(URL)
VMODENUM(KEY)
VMODENUM(BLOB)
#undef VMODENUM
VMODENUM(CHOSEN)
VMODENUM(IGNORE)
VMODENUM(ALL)
#undef VMODENUM
......@@ -409,13 +409,13 @@ To generate sharding keys using other hashes, use a custom vmod like
.. _vmod blobdigest: https://code.uplex.de/uplex-varnish/libvmod-blobdigest/blob/master/README.rst
$Method BACKEND .backend(
ENUM {HASH, URL, KEY, BLOB} by="HASH",
ENUM {HASH, URL, KEY, BLOB} by=HASH,
INT key=0,
BLOB key_blob=0,
INT alt=0,
REAL warmup=-1,
BOOL rampup=1,
ENUM {CHOSEN, IGNORE, ALL} healthy="CHOSEN")
ENUM {CHOSEN, IGNORE, ALL} healthy=CHOSEN)
Lookup a backend on the consistent hashing ring.
......
......@@ -218,6 +218,22 @@ get_key(VRT_CTX, enum by_e by, VCL_INT key_int, VCL_BLOB key_blob)
}
}
static enum by_e
parse_by_e(VCL_ENUM e)
{
#define VMODENUM(n) if (e == vmod_enum_ ## n) return(BY_ ## n);
#include "tbl_by.h"
WRONG("illegal by enum");
}
static enum healthy_e
parse_healthy_e(VCL_ENUM e)
{
#define VMODENUM(n) if (e == vmod_enum_ ## n) return(n);
#include "tbl_healthy.h"
WRONG("illegal healthy enum");
}
VCL_BACKEND v_matchproto_(td_directors_shard_backend)
vmod_shard_backend(VRT_CTX, struct vmod_directors_shard *vshard,
VCL_ENUM by_s, VCL_INT key_int, VCL_BLOB key_blob, VCL_INT alt,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment