summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordormando <dormando@rydia.net>2022-02-08 18:18:13 -0800
committerdormando <dormando@rydia.net>2022-02-08 18:18:13 -0800
commit2cb5f95ceea7e29b1d1eaa7dc6a66becbf1c7fe1 (patch)
treeaae9d44e75447291ae16280268882dd23a4333a0
parent4b781973608a8f31fff314340759af936c518cd2 (diff)
downloadmemcached-2cb5f95ceea7e29b1d1eaa7dc6a66becbf1c7fe1.tar.gz
proxy: accept fractional time for timeouts
the uring bits make abstraction this to the obvious common function a little harder, so I skipped for now.
-rw-r--r--proto_proxy.c35
-rw-r--r--t/startfile.lua2
2 files changed, 26 insertions, 11 deletions
diff --git a/proto_proxy.c b/proto_proxy.c
index 20f908f..94fca9c 100644
--- a/proto_proxy.c
+++ b/proto_proxy.c
@@ -3211,15 +3211,22 @@ static int mcplib_backend_failure_limit(lua_State *L) {
return 0;
}
-// TODO: take fractional time and convert.
+// sad, I had to look this up...
+#define NANOSECONDS(x) ((x) * 1E9 + 0.5)
+#define MICROSECONDS(x) ((x) * 1E6 + 0.5)
+
static int mcplib_backend_connect_timeout(lua_State *L) {
- int seconds = luaL_checkinteger(L, -1);
+ lua_Number secondsf = luaL_checknumber(L, -1);
+ lua_Integer secondsi = (lua_Integer) secondsf;
+ lua_Number subseconds = secondsf - secondsi;
proxy_ctx_t *ctx = settings.proxy_ctx; // FIXME (v2): get global ctx reference in thread/upvalue.
STAT_L(ctx);
- ctx->tunables.connect.tv_sec = seconds;
+ ctx->tunables.connect.tv_sec = secondsi;
+ ctx->tunables.connect.tv_usec = MICROSECONDS(subseconds);
#ifdef HAVE_LIBURING
- ctx->tunables.connect_ur.tv_sec = seconds;
+ ctx->tunables.connect_ur.tv_sec = secondsi;
+ ctx->tunables.connect_ur.tv_nsec = NANOSECONDS(subseconds);
#endif
STAT_UL(ctx);
@@ -3227,13 +3234,17 @@ static int mcplib_backend_connect_timeout(lua_State *L) {
}
static int mcplib_backend_retry_timeout(lua_State *L) {
- int seconds = luaL_checkinteger(L, -1);
+ lua_Number secondsf = luaL_checknumber(L, -1);
+ lua_Integer secondsi = (lua_Integer) secondsf;
+ lua_Number subseconds = secondsf - secondsi;
proxy_ctx_t *ctx = settings.proxy_ctx; // FIXME (v2): get global ctx reference in thread/upvalue.
STAT_L(ctx);
- ctx->tunables.retry.tv_sec = seconds;
+ ctx->tunables.retry.tv_sec = secondsi;
+ ctx->tunables.retry.tv_usec = MICROSECONDS(subseconds);
#ifdef HAVE_LIBURING
- ctx->tunables.retry_ur.tv_sec = seconds;
+ ctx->tunables.retry_ur.tv_sec = secondsi;
+ ctx->tunables.retry_ur.tv_nsec = NANOSECONDS(subseconds);
#endif
STAT_UL(ctx);
@@ -3241,13 +3252,17 @@ static int mcplib_backend_retry_timeout(lua_State *L) {
}
static int mcplib_backend_read_timeout(lua_State *L) {
- int seconds = luaL_checkinteger(L, -1);
+ lua_Number secondsf = luaL_checknumber(L, -1);
+ lua_Integer secondsi = (lua_Integer) secondsf;
+ lua_Number subseconds = secondsf - secondsi;
proxy_ctx_t *ctx = settings.proxy_ctx; // FIXME (v2): get global ctx reference in thread/upvalue.
STAT_L(ctx);
- ctx->tunables.read.tv_sec = seconds;
+ ctx->tunables.read.tv_sec = secondsi;
+ ctx->tunables.read.tv_usec = MICROSECONDS(subseconds);
#ifdef HAVE_LIBURING
- ctx->tunables.read_ur.tv_sec = seconds;
+ ctx->tunables.read_ur.tv_sec = secondsi;
+ ctx->tunables.read_ur.tv_nsec = NANOSECONDS(subseconds);
#endif
STAT_UL(ctx);
diff --git a/t/startfile.lua b/t/startfile.lua
index b1d2787..85c743b 100644
--- a/t/startfile.lua
+++ b/t/startfile.lua
@@ -13,7 +13,7 @@ local STAT_ANOTHER <const> = 2
function mcp_config_pools(oldss)
mcp.add_stat(STAT_EXAMPLE, "example")
mcp.add_stat(STAT_ANOTHER, "another")
- mcp.backend_connect_timeout(5) -- 5 second timeout.
+ mcp.backend_connect_timeout(5.5) -- 5 and a half second timeout.
-- alias mcp.backend for convenience.
-- important to alias global variables in routes where speed is concerned.
local srv = mcp.backend