]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: debug/lua: Use internal hlua function to dump the lua traceback
authorChristopher Faulet <cfaulet@haproxy.com>
Wed, 24 Mar 2021 13:52:24 +0000 (14:52 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Wed, 24 Mar 2021 15:35:23 +0000 (16:35 +0100)
The commit reverts following commits:
  * 83926a04 BUG/MEDIUM: debug/lua: Don't dump the lua stack if not dumpable
  * a61789a1 MEDIUM: lua: Use a per-thread counter to track some non-reentrant parts of lua

Instead of relying on a Lua function to print the lua traceback into the
debugger, we are now using our own internal function (hlua_traceback()).
This one does not allocate memory and use a chunk instead. This avoids any
issue with a possible deadlock in the memory allocator because the thread
processing was interrupted during a memory allocation.

This patch relies on the commit "BUG/MEDIUM: debug/lua: Use internal hlua
function to dump the lua traceback". Both must be backported wherever the
patches above are backported, thus as far as 2.0

include/haproxy/hlua.h
src/debug.c
src/hlua.c

index 596d096ecf9ef8629d8f9dcb5935cb24b6154591..f139552968a6d2a72aed98d614ff4fa491bf5d60 100644 (file)
@@ -51,7 +51,6 @@ void hlua_applet_tcp_fct(struct appctx *ctx);
 void hlua_applet_http_fct(struct appctx *ctx);
 struct task *hlua_process_task(struct task *task, void *context, unsigned int state);
 
-extern THREAD_LOCAL unsigned int hlua_not_dumpable;
 #else /* USE_LUA */
 
 /************************ For use when Lua is disabled ********************/
index 9346828577beb7422433fdf0e83e320d57b42b48..7f004dff50fe7f8c533e676d2d9492c5832ca162 100644 (file)
@@ -264,13 +264,9 @@ void ha_task_dump(struct buffer *buf, const struct task *task, const char *pfx)
        }
 
        if (hlua && hlua->T) {
-               if (hlua_not_dumpable == 0) {
-                       luaL_traceback(hlua->T, hlua->T, NULL, 0);
-                       if (!append_prefixed_str(buf, lua_tostring(hlua->T, -1), pfx, '\n', 1))
-                               b_putchr(buf, '\n');
-               }
-               else
-                       chunk_appendf(buf, "Inside non-rentrant part, Stack traceback not available\n");
+               chunk_appendf(buf, "stack traceback:\n    ");
+               append_prefixed_str(buf, hlua_traceback(hlua->T, "\n    "), pfx, '\n', 0);
+               b_putchr(buf, '\n');
        }
        else
                b_putchr(buf, '\n');
index f3a099e58f3bc1cca25ce86010e43adcfbc2ff80..5f93c7c92f80fc6024e6c72b38f6185176e620b0 100644 (file)
@@ -274,9 +274,6 @@ struct hlua_mem_allocator {
 
 static struct hlua_mem_allocator hlua_global_allocator THREAD_ALIGNED(64);
 
- /* > 0 if lua is in a non-rentrant part, thus with a non-dumpable stack */
-THREAD_LOCAL unsigned int hlua_not_dumpable = 0;
-
 /* These functions converts types between HAProxy internal args or
  * sample and LUA types. Another function permits to check if the
  * LUA stack contains arguments according with an required ARG_T
@@ -8635,12 +8632,8 @@ static void *hlua_alloc(void *ud, void *ptr, size_t osize, size_t nsize)
        /* a limit of ~0 means unlimited and boot complete, so there's no need
         * for accounting anymore.
         */
-       if (likely(~zone->limit == 0)) {
-               hlua_not_dumpable++;
-               ptr = realloc(ptr, nsize);
-               hlua_not_dumpable--;
-               return ptr;
-       }
+       if (likely(~zone->limit == 0))
+               return realloc(ptr, nsize);
 
        if (!ptr)
                osize = 0;
@@ -8654,9 +8647,7 @@ static void *hlua_alloc(void *ud, void *ptr, size_t osize, size_t nsize)
                        return NULL;
        } while (!_HA_ATOMIC_CAS(&zone->allocated, &old, new));
 
-       hlua_not_dumpable++;
        ptr = realloc(ptr, nsize);
-       hlua_not_dumpable--;
 
        if (unlikely(!ptr && nsize)) // failed
                _HA_ATOMIC_SUB(&zone->allocated, nsize - osize);