summaryrefslogtreecommitdiff
path: root/include/haproxy/hlua.h
Commit message (Collapse)AuthorAgeFilesLines
* MINOR: hlua: declare hlua_yieldk() functionAurelien DARRAGON2023-05-051-0/+1
| | | | Declaring hlua_yieldk() function to make it usable from hlua_fcn.c.
* MINOR: hlua: declare hlua_gethlua() functionAurelien DARRAGON2023-05-051-0/+1
| | | | Declaring hlua_gethlua() function to make it usable from hlua_fcn.c.
* MINOR: hlua: declare hlua_{ref,pushref,unref} functionsAurelien DARRAGON2023-05-051-0/+3
| | | | | Declaring hlua_{ref,pushref,unref} functions to make them usable from hlua_fcn.c to simplify reference handling.
* MEDIUM: hlua/event_hdl: initial support for event handlersAurelien DARRAGON2023-04-051-0/+1
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Now that the event handler API is pretty mature, we can expose it in the lua API. Introducing the core.event_sub(<event_types>, <cb>) lua function that takes an array of event types <event_types> as well as a callback function <cb> as argument. The function returns a subscription <sub> on success. Subscription <sub> allows you to manage the subscription from anywhere in the script. To this day only the sub->unsub method is implemented. The following event types are currently supported: - "SERVER_ADD": when a server is added - "SERVER_DEL": when a server is removed from haproxy - "SERVER_DOWN": server states goes from up to down - "SERVER_UP": server states goes from down to up As for the <cb> function: it will be called when one of the registered event types occur. The function will be called with 3 arguments: cb(<event>,<data>,<sub>) <event>: event type (string) that triggered the function. (could be any of the types used in <event_types> when registering the subscription) <data>: data associated with the event (specific to each event family). For "SERVER_" family events, server details such as server name/id/proxy will be provided. If the server still exists (not yet deleted), a reference to the live server is provided to spare you from an additionnal lookup if you need to have direct access to the server from lua. <sub> refers to the subscription. In case you need to manage it from within an event handler. (It refers to the same subscription that the one returned from core.event_sub()) Subscriptions are per-thread: the thread that will be handling the event is the one who performed the subscription using core.event_sub() function. Each thread treats events sequentially, it means that if you have, let's say SERVER_UP, then SERVER_DOWN in a short timelapse, then your cb function will first be called with SERVER_UP, and once you're done handling the event, your function will be called again with SERVER_DOWN. This is to ensure event consitency when it comes to logging / triggering logic from lua. Your lua cb function may yield if needed, but you're pleased to process the event as fast as possible to prevent the event queue from growing up To prevent abuses, if the event queue for the current subscription goes over 100 unconsumed events, the subscription will pause itself automatically for as long as it takes for your handler to catch up. This would lead to events being missed, so a warning will be emitted in the logs to inform you about that. This is not something you want to let happen too often, it may indicate that you subscribed to an event that is occurring too frequently or/and that your callback function is too slow to keep up the pace and you should review it. If you want to do some parallel processing because your callback functions are slow: you might want to create subtasks from lua using core.register_task() from within your callback function to perform the heavy job in a dedicated task and allow remaining events to be processed more quickly. Please check the lua documentation for more information.
* MINOR: hlua: add a new hlua_show_current_location() functionWilly Tarreau2022-06-191-0/+2
| | | | | | | | This function may be used to try to show where some Lua code is currently being executed. It tries hard to detect the initialization phase, both for the global and the per-thread states, and for runtime states. This intends to be used by error handlers to provide the users with indications about what Lua code was being executed when the error triggered.
* MINOR: lua: Add a flag on lua context to know the yield capability at run timeChristopher Faulet2021-08-121-0/+4
| | | | | | | | | | | | | When a script is executed, a flag is used to allow it to yield. An error is returned if a lua function yield, explicitly or not. But there is no way to get this capability in C functions. So there is no way to choose to yield or not depending on this capability. To fill this gap, the flag HLUA_NOYIELD is introduced and added on the lua context if the current script execution is not authorized to yield. Macros to set, clear and test this flags are also added. This feature will be usefull to fix some bugs in lua actions execution.
* BUG/MEDIUM: debug/lua: Use internal hlua function to dump the lua tracebackChristopher Faulet2021-03-241-1/+0
| | | | | | | | | | | | | | | | 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
* MINOR: lua: Slightly improve function dumping the lua tracebackChristopher Faulet2021-03-241-0/+1
| | | | | | The separator string is now configurable, passing it as parameter when the function is called. In addition, the message have been slightly changed to be a bit more readable.
* MEDIUM: lua: Use a per-thread counter to track some non-reentrant parts of luaChristopher Faulet2021-03-191-0/+1
| | | | | | | | | | | | | Some parts of the Lua are non-reentrant. We must be sure to carefully track these parts to not dump the lua stack when it is interrupted inside such parts. For now, we only identified the custom lua allocator. If the thread is interrupted during the memory allocation, we must not try to print the lua stack wich also allocate memory. Indeed, realloc() is not async-signal-safe. In this patch we introduce a thread-local counter. It is incremented before entering in a non-reentrant part and decremented when exiting. It is only performed in hlua_alloc() for now.
* MEDIUM: task: extend the state field to 32 bitsWilly Tarreau2021-03-051-1/+1
| | | | | | | | | | | | | | It's been too short for quite a while now and is now full. It's still time to extend it to 32-bits since we have room for this without wasting any space, so we now gained 16 new bits for future flags. The values were not reassigned just in case there would be a few hidden u16 or short somewhere in which these flags are placed (as it used to be the case with stream->pending_events). The patch is tagged MEDIUM because this required to update the task's process() prototype to use an int instead of a short, that's quite a bunch of places.
* REORG: include: move hlua.h to haproxy/hlua{,-t}.hWilly Tarreau2020-06-111-0/+68
This one required a few more includes as it uses list and ebpt_node. It still references lots of types/ files for now.