From d2f61de8c244e71f7194af53c03c98dcb3d6219a Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Thu, 27 Apr 2023 18:44:14 +0200 Subject: [PATCH] BUG/MINOR: hlua: return wall-clock date, not internal date in core.now() That's hopefully the last one affected by this. It was a bit trickier because there's the promise in the doc that the date is monotonous, so we continue to use now-start_time as the uptime value and add it to start_date to get the current date. It was also emphasized by commit 28360dc ("MEDIUM: clock: force internal time to wrap early after boot"), causing core.now() to return a date of Mar 20 on Apr 27. No backport is needed. --- src/hlua_fcn.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/hlua_fcn.c b/src/hlua_fcn.c index 188fcf4fd..8d87c34a6 100644 --- a/src/hlua_fcn.c +++ b/src/hlua_fcn.c @@ -300,12 +300,20 @@ void *hlua_checkudata(lua_State *L, int ud, int class_ref) /* This function return the current date at epoch format in milliseconds. */ int hlua_now(lua_State *L) { + /* WT: the doc says "returns the current time" and later says that it's + * monotonic. So the best fit is to use start_date+(now-start_time). + */ + struct timeval tv; + + tv_remain(&start_time, &now, &tv); + tv_add(&tv, &tv, &start_date); + lua_newtable(L); lua_pushstring(L, "sec"); - lua_pushinteger(L, now.tv_sec); + lua_pushinteger(L, tv.tv_sec); lua_rawset(L, -3); lua_pushstring(L, "usec"); - lua_pushinteger(L, now.tv_usec); + lua_pushinteger(L, tv.tv_usec); lua_rawset(L, -3); return 1; }