09133860bf
Michel Mayen reported that mixing lua actions loaded from 'lua-load' and 'lua-load-per-thread' directives within a single http/tcp session yields unexpected results. When executing action defined in another running context from the one of the previously executed action (from lua-load, then from lua-load-per-thread or the opposite, order doesn't matter), it would yield this kind of error: "Lua function 'name': [state-id x] runtime error: attempt to call a nil value from ." He also noted that when loading all actions using the same loading directive, the issue is gone. This is due to the fact that for lua actions, fetches and converters, lua code is being executed from the stream lua context. However, the stream lua context, which is created on the fly when first executing some lua code related to the stream, is reused between multiple lua executions. But the thing is, despite successive executions referring to the same parent "stream" (which is also assigned to a given thread id), they don't necessarily depend on the same running context from lua point of view. Indeed, since the function which is about to be executed could have been loaded from either 'lua-load' or 'lua-load-per-thread', the function declaration and related dependencies are defined in a specific stack ID which is known by calling fcn_ref_to_stack_id() on the given function. Thus, in order to make streams capable of chaining lua actions, fetches and converters loaded in different lua stacks, we add a new detection logic in hlua_stream_ctx_prepare() to be able to recreate the lua context in the proper stack space when the existing one conflicts with the expected stack id. This must be backported in every stable versions. It depends on: - "MINOR: hlua: add hlua_stream_prepare helper function" [for < 2.5, skip the filter part since they didn't exist] [wt: warning, wait a little bit before backporting too far, we need to be certain the added BUG_ON() will never trigger] |
||
---|---|---|
.github | ||
addons | ||
admin | ||
dev | ||
doc | ||
examples | ||
include | ||
reg-tests | ||
scripts | ||
src | ||
tests | ||
.cirrus.yml | ||
.gitattributes | ||
.gitignore | ||
.mailmap | ||
.travis.yml | ||
BRANCHES | ||
BSDmakefile | ||
CHANGELOG | ||
CONTRIBUTING | ||
INSTALL | ||
LICENSE | ||
MAINTAINERS | ||
Makefile | ||
README | ||
SUBVERS | ||
VERDATE | ||
VERSION |
README
The HAProxy documentation has been split into a number of different files for ease of use. Please refer to the following files depending on what you're looking for : - INSTALL for instructions on how to build and install HAProxy - BRANCHES to understand the project's life cycle and what version to use - LICENSE for the project's license - CONTRIBUTING for the process to follow to submit contributions The more detailed documentation is located into the doc/ directory : - doc/intro.txt for a quick introduction on HAProxy - doc/configuration.txt for the configuration's reference manual - doc/lua.txt for the Lua's reference manual - doc/SPOE.txt for how to use the SPOE engine - doc/network-namespaces.txt for how to use network namespaces under Linux - doc/management.txt for the management guide - doc/regression-testing.txt for how to use the regression testing suite - doc/peers.txt for the peers protocol reference - doc/coding-style.txt for how to adopt HAProxy's coding style - doc/internals for developer-specific documentation (not all up to date)