summaryrefslogtreecommitdiff
path: root/proxy_jump_hash.c
diff options
context:
space:
mode:
authordormando <dormando@rydia.net>2022-02-18 15:19:09 -0800
committerdormando <dormando@rydia.net>2022-02-18 16:13:52 -0800
commit34e0359d4de223d8cde4166f7d10ae352d7ebfdf (patch)
tree041a57edfb4bb3b58aa23498681295cb71789ee5 /proxy_jump_hash.c
parentd85c379d74d92f8e9bd7ccf1ca57520f485a24f0 (diff)
downloadmemcached-34e0359d4de223d8cde4166f7d10ae352d7ebfdf.tar.gz
proxy: pull chunks into individual c files
now's a good time to at least shove functional subsections of code into their own files. Some further work to clearly separate the API's will help but looks not too terrible. Big bonus is getting the backend handling code away from the frontend handling code, which should make it easier to follow.
Diffstat (limited to 'proxy_jump_hash.c')
-rw-r--r--proxy_jump_hash.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/proxy_jump_hash.c b/proxy_jump_hash.c
new file mode 100644
index 0000000..82baf5f
--- /dev/null
+++ b/proxy_jump_hash.c
@@ -0,0 +1,51 @@
+/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
+
+#include "proxy.h"
+
+typedef struct {
+ struct proxy_hash_caller phc; // passed back to proxy API
+ unsigned int buckets;
+} mcplib_jump_hash_t;
+
+static uint32_t mcplib_dist_jump_hash_get_server(uint64_t hash, void *ctx) {
+ mcplib_jump_hash_t *jh = ctx;
+
+ int64_t b = -1, j = 0;
+ while (j < jh->buckets) {
+ b = j;
+ hash = hash * 2862933555777941757ULL + 1;
+ j = (b + 1) * ((double)(1LL << 31) / (double)((hash >> 33) + 1));
+ }
+ return b;
+}
+
+// stack = [pool, option]
+static int mcplib_dist_jump_hash_new(lua_State *L) {
+ luaL_checktype(L, 1, LUA_TTABLE);
+ lua_Unsigned buckets = lua_rawlen(L, 1);
+
+ mcplib_jump_hash_t *jh = lua_newuserdatauv(L, sizeof(mcplib_jump_hash_t), 0);
+
+ // don't need to loop through the table at all, just need its length.
+ // could optimize startup time by adding hints to the module for how to
+ // format pool (ie; just a total count or the full table)
+ jh->buckets = buckets;
+ jh->phc.ctx = jh;
+ jh->phc.selector_func = mcplib_dist_jump_hash_get_server;
+
+ lua_pushlightuserdata(L, &jh->phc);
+
+ // - return [UD, lightuserdata]
+ return 2;
+}
+
+int mcplib_open_dist_jump_hash(lua_State *L) {
+ const struct luaL_Reg jump_f[] = {
+ {"new", mcplib_dist_jump_hash_new},
+ {NULL, NULL},
+ };
+
+ luaL_newlib(L, jump_f);
+
+ return 1;
+}