]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MAJOR: lua: scheduled task is freezing.
authorEmeric Brun <ebrun@haproxy.com>
Tue, 17 Oct 2017 16:58:40 +0000 (18:58 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 18 Oct 2017 17:23:33 +0000 (19:23 +0200)
Since commit 'MAJOR: task: task scheduler rework'
0194897e540cec67d7d1e9281648b70efe403f08. LUA's
scheduling tasks are freezing.

A running task should not handle the scheduling itself
but let the task scheduler to handle it based on the
'expire' field.

[wt: no backport needed]

src/hlua.c

index c68495b34c872748ab7f3db4eedeca6ae96cb252..7eddda8217870c75e341e46210abf06a5c388b91 100644 (file)
@@ -5360,12 +5360,6 @@ static struct task *hlua_process_task(struct task *task)
        struct hlua *hlua = task->context;
        enum hlua_exec status;
 
-       /* We need to remove the task from the wait queue before executing
-        * the Lua code because we don't know if it needs to wait for
-        * another timer or not in the case of E_AGAIN.
-        */
-       task_delete(task);
-
        /* If it is the first call to the task, we must initialize the
         * execution timeouts.
         */
@@ -5385,7 +5379,7 @@ static struct task *hlua_process_task(struct task *task)
 
        case HLUA_E_AGAIN: /* co process or timeout wake me later. */
                if (hlua->wake_time != TICK_ETERNITY)
-                       task_schedule(task, hlua->wake_time);
+                       task->expire = hlua->wake_time;
                break;
 
        /* finished with error. */
@@ -5394,6 +5388,7 @@ static struct task *hlua_process_task(struct task *task)
                hlua_ctx_destroy(hlua);
                task_delete(task);
                task_free(task);
+               task = NULL;
                break;
 
        case HLUA_E_ERR:
@@ -5402,9 +5397,10 @@ static struct task *hlua_process_task(struct task *task)
                hlua_ctx_destroy(hlua);
                task_delete(task);
                task_free(task);
+               task = NULL;
                break;
        }
-       return NULL;
+       return task;
 }
 
 /* This function is an LUA binding that register LUA function to be