]> git.ipfire.org Git - thirdparty/haproxy.git/log
thirdparty/haproxy.git
4 years agoBUG/MINOR: tools: make parse_time_err() more strict on the timer validity
Christopher Faulet [Fri, 11 Dec 2020 08:23:07 +0000 (09:23 +0100)] 
BUG/MINOR: tools: make parse_time_err() more strict on the timer validity

First, an error is now reported if the first character is not a digit. Thus,
"timeout client s" triggers an error now. Then 'u' is also rejected
now. 'us' is valid and should be used set the timer in microseconds. However
'u' alone is not a valid unit. It was just ignored before (default to
milliseconds). Now, it is an error. Finally, a warning is reported if the
end of the text is not reached after the timer parsing. This warning will
probably be switched to an error in a futur version.

This patch must be backported to all stable versions.

4 years agoMINOR: tcpcheck: Only wait for more payload data on HTTP expect rules
Christopher Faulet [Wed, 9 Dec 2020 17:45:47 +0000 (18:45 +0100)] 
MINOR: tcpcheck: Only wait for more payload data on HTTP expect rules

For HTTP expect rules, if the buffer is not empty, it is guarantee that all
responses headers are received, with the start-line. Thus, except for
payload matching, there is no reason to wait for more data from the moment
the htx message is not empty.

This patch may be backported as far as 2.2.

4 years agoBUG/MINOR: tcpcheck: Don't rearm the check timeout on each read
Christopher Faulet [Wed, 9 Dec 2020 18:46:38 +0000 (19:46 +0100)] 
BUG/MINOR: tcpcheck: Don't rearm the check timeout on each read

The check timeout is used to limit a health-check execution. By default
inter timeout is used. But when defined the check timeout is used. In this
case, the inter timeout (or connect timeout) is used for the connection
establishment only. And the check timeout for the health-check
execution. Thus, it must be set after a successfull connect. It means it is
rearm at the end of each connect rule.

This patch with the previous one (BUG/MINOR: http-check: Use right condition
to consider HTX message as full) should solve the issue #991. It must be
backported as far as 2.2. On the 2.3 and 2.2, there are 2 places were the
connection establishement is handled. The check timeout must be set on both.

4 years agoBUG/MINOR: http-check: Use right condition to consider HTX message as full
Christopher Faulet [Wed, 9 Dec 2020 18:45:07 +0000 (19:45 +0100)] 
BUG/MINOR: http-check: Use right condition to consider HTX message as full

When an HTTP expect rule is evaluated, we must know if more data is expected
or not to wait if the matching fails. If the whole response is received or
if the HTX message is full, we must not wait. In this context,
htx_free_data_space() must be used instead of htx_free_space(). The fisrt
one count down the block size. Otherwise at the edge, when only the block
size remains free (8 bytes), we may think there is some place for more data
while the mux is unable to add more block.

This bug explains the loop described on the GH issue #991. It should be
backported as far as 2.2.

4 years agoCLEANUP: connection: remove the unused conn_{stop,cond_update}_polling()
Willy Tarreau [Fri, 11 Dec 2020 10:21:53 +0000 (11:21 +0100)] 
CLEANUP: connection: remove the unused conn_{stop,cond_update}_polling()

These functions are not used anymore and were quite confusing given that
their names reflected their original role and not the current ones. Let's
kill them before they inspire anyone.

4 years agoCLEANUP: connection: open-code conn_cond_update_polling() and update the comment
Willy Tarreau [Fri, 11 Dec 2020 10:19:24 +0000 (11:19 +0100)] 
CLEANUP: connection: open-code conn_cond_update_polling() and update the comment

This last call to conn_cond_update_polling() is now totally misleading as
the function only stops polling in case of unrecoverable connection error.
Let's open-code the test to make it more prominent and explain what we're
trying to do there. It's even almost certain this code is never executed
anymore, as the only remaining case should be a mux's wake function setting
CO_FL_ERROR without disabling the polling, but they need to be audited first
to make sure this is the case.

4 years agoMINOR: checks: don't call conn_cond_update_polling() anymore
Willy Tarreau [Fri, 11 Dec 2020 10:11:06 +0000 (11:11 +0100)] 
MINOR: checks: don't call conn_cond_update_polling() anymore

This was a leftover of the pre-mux v1.8-dev3 era. It makes no sense anymore
to try to disable polling on a connection we don't own, it's the mux's job
and it's properly done upon shutdowns and closes.

4 years agoMINOR: checks: use cs_drain_and_close() instead of draining the connection
Willy Tarreau [Fri, 11 Dec 2020 10:09:29 +0000 (11:09 +0100)] 
MINOR: checks: use cs_drain_and_close() instead of draining the connection

As explained in previous commit, the situation is absurd as we try to
cleanly drain pending data before impolitely shutting down, and it could
be counter productive on real muxes. Let's use cs_drain_and_close() instead.

4 years agoMINOR: mux-pt: take care of CS_SHR_DRAIN in shutr()
Willy Tarreau [Fri, 11 Dec 2020 10:07:19 +0000 (11:07 +0100)] 
MINOR: mux-pt: take care of CS_SHR_DRAIN in shutr()

When the shutr() requests CS_SHR_DRAIN and there's no particular shutr
implemented on the underlying transport layer, we must drain pending data.
This is what happens when cs_drain_and_close() is called. It is important
for TCP checks to drain large responses and close cleanly.

4 years agoMINOR: connection: implement cs_drain_and_close()
Willy Tarreau [Fri, 11 Dec 2020 10:04:51 +0000 (11:04 +0100)] 
MINOR: connection: implement cs_drain_and_close()

We had cs_close() which forces a CS_SHR_RESET mode on the read side,
and due to this there are a few call places in the checks which
perform a manual call to conn_sock_drain() before calling cs_close().
This is absurd by principle, and it can be counter-productive in the
case of a mux where this could even cause the opposite of the desired
effect by deleting pending frames on the socket before closing.

Let's add cs_drain_and_close() which uses the CS_SHR_DRAIN mode to
prepare this.

4 years agoMINOR: stream-int: don't touch polling anymore on shutdown
Willy Tarreau [Fri, 11 Dec 2020 09:24:05 +0000 (10:24 +0100)] 
MINOR: stream-int: don't touch polling anymore on shutdown

Not only it's become totally useless with muxes, in addition it's
dangerous to play with the mux's FD while shutting a stream down for
writes. It's already done *if necessary* by the cs_shutw() code at the
mux layer. Fortunately it doesn't seem to have any impact, most likely
the polling updates used to immediately revert this operation.

4 years agoCLEANUP: connection: use fd_stop_both() instead of conn_stop_polling()
Willy Tarreau [Fri, 11 Dec 2020 08:56:53 +0000 (09:56 +0100)] 
CLEANUP: connection: use fd_stop_both() instead of conn_stop_polling()

conn_stop_polling() in fact only calls fd_stop_both() after checking
that the ctrl layer is ready. It's the case in conn_fd_check() so
let's get rid of this next-to-last user of this function.

4 years agoMINOR: cache: Dump secondary entries in "show cache"
Remi Tricot-Le Breton [Fri, 27 Nov 2020 14:48:40 +0000 (15:48 +0100)] 
MINOR: cache: Dump secondary entries in "show cache"

The duplicated entries (in case of vary) were not taken into account by
the "show cache" command. They are now dumped too.
A new "vary" column is added to the output. It contains the complete
seocndary key (in hex format).

4 years agoDOC: email change of the DeviceAtlas maintainer
David Carlier [Thu, 10 Dec 2020 09:56:09 +0000 (09:56 +0000)] 
DOC: email change of the DeviceAtlas maintainer

4 years agoBUG/MEDIUM: spoa/python: Fixing references to None
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:14 +0000 (14:37 +0000)] 
BUG/MEDIUM: spoa/python: Fixing references to None

As per https://docs.python.org/3/c-api/none.html, None has to be treated
exactly like other objects for reference counting.
So, when we use it, we need to INCREF and when we are done, DECREF

This patch must be backported as far as 2.0.

4 years agoBUG/MEDIUM: spoa/python: Fixing PyObject_Call positional arguments
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:13 +0000 (14:37 +0000)] 
BUG/MEDIUM: spoa/python: Fixing PyObject_Call positional arguments

As per https://docs.python.org/3/c-api/object.html#c.PyObject_Call,
positional arguments should be an empty tuple when not used.
Previously the code had a dictionary instead of tuple. This commit is to
fix it and use tuple to avoid unexpected consequences

This patch must be backported as far as 2.0.

4 years agoBUG/MINOR: spoa/python: Cleanup ipaddress objects if initialization fails
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:12 +0000 (14:37 +0000)] 
BUG/MINOR: spoa/python: Cleanup ipaddress objects if initialization fails

This change is to ensure objects from the ipaddress module are cleaned
up when spoa module initialization fails.
In general the interpreter would just crash, but in a code where import
is conditional (try/except), then we would keep those objects around

This patch must be backported as far as 2.0.

4 years agoBUG/MINOR: spoa/python: Cleanup references for failed Module Addobject operations
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:11 +0000 (14:37 +0000)] 
BUG/MINOR: spoa/python: Cleanup references for failed Module Addobject operations

As per https://docs.python.org/3/c-api/module.html#c.PyModule_AddObject,
references are stolen by the function only for success. We must do
cleanup manually if there is a failure

This patch must be backported as far as 2.0.

4 years agoDOC: spoa/python: Fixing typos in comments
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:10 +0000 (14:37 +0000)] 
DOC: spoa/python: Fixing typos in comments

Fixing a missing letter in a comment

This patch must be backported as far as 2.0.

4 years agoDOC: spoa/python: Rephrasing memory related error messages
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:09 +0000 (14:37 +0000)] 
DOC: spoa/python: Rephrasing memory related error messages

The old message "No more space left available" was redundant with "left
available". This commit is to rephrase that sentence and make it more
explicit we are talking about memory

This patch must be backported as far as 2.0.

4 years agoDOC: spoa/python: Fixing typo in IP related error messages
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:08 +0000 (14:37 +0000)] 
DOC: spoa/python: Fixing typo in IP related error messages

This commit fixes typos in the ps_python_set_var_ip* byte manipulation error
messages

This patch must be backported as far as 2.0.

4 years agoBUG/MAJOR: spoa/python: Fixing return None
Gilchrist Dadaglo [Tue, 8 Dec 2020 14:37:07 +0000 (14:37 +0000)] 
BUG/MAJOR: spoa/python: Fixing return None

As per https://docs.python.org/3/c-api/none.html, None requires to be
incremented before being returned to prevent deallocating none

This patch must be backported as far as 2.0.

4 years agoMINOR: udp: export udp_suspend_receiver() and udp_resume_receiver()
Willy Tarreau [Tue, 8 Dec 2020 17:05:16 +0000 (18:05 +0100)] 
MINOR: udp: export udp_suspend_receiver() and udp_resume_receiver()

QUIC will rely on UDP at the receiver level, and will need these functions
to suspend/resume the receivers. In the future, protocol chaining may
simplify this.

4 years agoMINOR: connection: use the control layer's init/close
Willy Tarreau [Tue, 8 Dec 2020 14:53:45 +0000 (15:53 +0100)] 
MINOR: connection: use the control layer's init/close

In conn_ctrl_init() and conn_ctrl_close() we now use the control layer's
functions instead of manipulating the FD directly. This is safe since the
control layer is always present when done. Note that now we also adjust
the flag before calling the function to make things cleaner in case such
a layer would need to call the same functions again for any reason.

4 years agoMINOR: protocol: add a set of ctrl_init/ctrl_close methods for setup/teardown
Willy Tarreau [Tue, 8 Dec 2020 14:50:56 +0000 (15:50 +0100)] 
MINOR: protocol: add a set of ctrl_init/ctrl_close methods for setup/teardown

Currnetly conn_ctrl_init() does an fd_insert() and conn_ctrl_close() does an
fd_delete(). These are the two only short-term obstacles against using a
non-fd handle to set up a connection. Let's have pur these into the protocol
layer, along with the other connection-level stuff so that the generic
connection code uses them instead. This will allow to define new ones for
other protocols (e.g. QUIC).

Since we only support regular sockets at the moment, the code was placed
into sock.c and shared with proto_tcp, proto_uxst and proto_sockpair.

4 years agoCLEANUP: protocol: group protocol struct members by usage
Willy Tarreau [Tue, 8 Dec 2020 13:54:20 +0000 (14:54 +0100)] 
CLEANUP: protocol: group protocol struct members by usage

For the sake of an improved readability, let's group the protocol
field members according to where they're supposed to be defined:
  - connection layer (note: for now even UDP needs one)
  - binding layer
  - address family
  - socket layer
Nothing else was changed.

4 years agoMINOR: protocol: export protocol definitions
Willy Tarreau [Tue, 8 Dec 2020 13:13:11 +0000 (14:13 +0100)] 
MINOR: protocol: export protocol definitions

The various protocols were made static since there was no point in
exporting them in the past. Nowadays with QUIC relying on UDP we'll
significantly benefit from UDP being exported and more generally from
being able to declare some functions as being the same as other
protocols'.

In an ideal world it should not be these protocols which should be
exported, but the intermediary levels:
  - socket layer (sock.c only right now), already exported as functions
    but nothing structured at the moment ;
  - family layer (sock_inet, sock_unix, sockpair etc): already structured
    and exported
  - binding layer (the part that relies on the receiver): currently fused
    within the protocol
  - connectiong layer (the part that manipulates connections): currently
    fused within the protocol
  - protocol (connection's control): shouldn't need to be exposed
    ultimately once the elements above are in an easily sharable way.

4 years agoMINOR: protocol: remove the redundant ->sock_domain field
Willy Tarreau [Tue, 8 Dec 2020 11:13:54 +0000 (12:13 +0100)] 
MINOR: protocol: remove the redundant ->sock_domain field

This field used to be needed before commit 2b5e0d8b6 ("MEDIUM: proto_udp:
replace last AF_CUST_UDP* with AF_INET*") as it was used as a protocol
entry selector. Since this commit it's always equal to the socket family's
value so it's entirely redundant. Let's remove it now to simplify the
protocol definition a little bit.

4 years agoBUG/MINOR: stream: Don't use input buffer after the ownership xfer
Christopher Faulet [Fri, 4 Dec 2020 16:22:49 +0000 (17:22 +0100)] 
BUG/MINOR: stream: Don't use input buffer after the ownership xfer

At the end of stream_new(), once the input buffer is transfer to the request
channel, it must not be used anymore. The previous patch (16df178b6 "BUG/MEDIUM:
stream: Xfer the input buffer to a fully created stream") was pushed to quickly.

No backport needed.

4 years agoBUG/MEDIUM: stream: Xfer the input buffer to a fully created stream
Christopher Faulet [Fri, 4 Dec 2020 15:47:41 +0000 (16:47 +0100)] 
BUG/MEDIUM: stream: Xfer the input buffer to a fully created stream

The input buffer passed as argument to create a new stream must not be
transferred when the request channel is initialized because the channel
flags are not set at this stage. In addition, the API is a bit confusing
regarding the buffer owner when an error occurred. The caller remains the
owner, but reading the code it is not obvious.

So, first of all, to avoid any ambiguities, comments are added on the
calling chain to make it clear. The buffer owner is the caller if any error
occurred. And the ownership is transferred to the stream on success.

Then, to make things simple, the ownership is transferred at the end of
stream_new(), in case of success. And the input buffer is updated to point
on BUF_NULL. Thus, in all cases, if the caller try to release it calling
b_free() on it, it is not a problem. Of course, it remains the caller
responsibility to release it on error.

The patch fixes a bug introduced by the commit 26256f86e ("MINOR: stream:
Pass an optional input buffer when a stream is created"). No backport is
needed.

4 years agoMEDIUM: ssl: fatal error with bundle + openssl < 1.1.1
William Lallemand [Fri, 4 Dec 2020 14:45:02 +0000 (15:45 +0100)] 
MEDIUM: ssl: fatal error with bundle + openssl < 1.1.1

Since HAProxy 2.3, OpenSSL 1.1.1 is a requirement for using a
multi-certificate bundle in the configuration. This patch emits a fatal
error when HAProxy tries to load a bundle with an older version of
HAProxy.

This problem was encountered by an user in issue #990.

This must be backported in 2.3.

4 years agoMINOR: listener: now use a generic add_listener() function
Willy Tarreau [Fri, 4 Dec 2020 14:03:36 +0000 (15:03 +0100)] 
MINOR: listener: now use a generic add_listener() function

With the removal of the family-specific port setting, all protocol had
exactly the same implementation of ->add(). A generic one was created
with the name "default_add_listener" so that all other ones can now be
removed. The API was slightly adjusted so that the protocol and the
listener are passed instead of the listener and the port.

Note that all protocols continue to provide this ->add() method instead
of routinely calling default_add_listener() from create_listeners(). This
makes sure that any non-standard protocol will still be able to intercept
the listener addition if needed.

This could be backported to 2.3 along with the few previous patches on
listners as a pure code cleanup.

4 years agoMINOR: listener: automatically set the port when creating listeners
Willy Tarreau [Fri, 4 Dec 2020 13:49:11 +0000 (14:49 +0100)] 
MINOR: listener: automatically set the port when creating listeners

In create_listeners() we iterate over a port range and call the
protocol's ->add() function to add a new listener on the specified
port. Only tcp4/tcp6/udp4/udp6 support a port, the other ones ignore
it. Now that we can rely on the address family to properly set the
port, better do it this way directly from create_listeners() and
remove the family-specific case from the protocol layer.

4 years agoMINOR: protocol: add a ->set_port() helper to address families
Willy Tarreau [Fri, 4 Dec 2020 13:43:36 +0000 (14:43 +0100)] 
MINOR: protocol: add a ->set_port() helper to address families

At various places we need to set a port on an IPv4 or IPv6 address, and
it requires casts that are easy to get wrong. Let's add a new set_port()
helper to the address family to assist in this. It will be directly
accessible from the protocol and will make the operation seamless.
Right now this is only implemented for sock_inet as other families do
not need a port.

4 years agoMINOR: h1-htx/http-ana: Set BODYLESS flag on message in TUNNEL state
Christopher Faulet [Fri, 20 Nov 2020 13:30:38 +0000 (14:30 +0100)] 
MINOR: h1-htx/http-ana: Set BODYLESS flag on message in TUNNEL state

When a H1 message is parsed, if the parser state is switched to TUNNEL mode
just after the header parsing, the BODYLESS flag is set on the HTX
start-line. By transitivity, the corresponding flag is set on the message in
HTTP analysers.  Thus it is possible to rely on it to not wait for the
request body.

4 years agoMINOR: http-ana: Properly set message flags from the start-line flags
Christopher Faulet [Fri, 20 Nov 2020 13:22:37 +0000 (14:22 +0100)] 
MINOR: http-ana: Properly set message flags from the start-line flags

CNT_LEN and TE_CHNK flags must be set on the message only when the
corresponding flag is set on the HTX start-line. Before, when the transfer
length was known XFER_LEN set), the HTTP_MSGF_TE_CHNK was the default. But
it is not appropriate. Now, it is only set if the message is chunked. Thus,
it is now possible to have a known transfer length without CNT_LEN or
TE_CHNK.

In addition, the BODYLESS flags may be set, independently on XFER_LEN one.

4 years agoREGTESTS: Fix proxy_protocol_tlv_validation
Christopher Faulet [Tue, 20 Oct 2020 07:10:25 +0000 (09:10 +0200)] 
REGTESTS: Fix proxy_protocol_tlv_validation

Remaining data after the PROXYv2 header now trigger a parsing error in the
H1 multiplexer Thus the required version for this test is now set to 2.4.

4 years agoCLEANUP: connection: Remove CS_FL_READ_PARTIAL flag
Christopher Faulet [Mon, 12 Oct 2020 13:56:16 +0000 (15:56 +0200)] 
CLEANUP: connection: Remove CS_FL_READ_PARTIAL flag

Since the recent refactoring of the H1 multiplexer, this flag is no more
used. Thus it is removed.

4 years agoCLEANUP: http-ana: Remove TX_WAIT_NEXT_RQ unsued flag
Christopher Faulet [Tue, 6 Oct 2020 15:58:43 +0000 (17:58 +0200)] 
CLEANUP: http-ana: Remove TX_WAIT_NEXT_RQ unsued flag

This flags is now unused. It was used in REQ_WAIT_HTTP analyser, when a
stream was waiting for a request, to set the keep-alive timeout or to avoid
to send HTTP errors to client.

4 years agoMEDIUM: http-ana: Don't process partial or empty request anymore
Christopher Faulet [Tue, 6 Oct 2020 15:54:56 +0000 (17:54 +0200)] 
MEDIUM: http-ana: Don't process partial or empty request anymore

It is now impossible to start the HTTP request processing in the stream
analysers with a partial or empty request message. The mux-h2 was already
waiting of the request headers before creating the stream. Now the mux-h1
does the same. All errors (aborts, timeout or invalid requests) waiting for
the request headers are now handled by the multiplexers. So there is no
reason to still handle them in the REQ_WAIT_HTTP (http_wait_for_request)
analyser.

To ensure there is no ambiguity, a BUG_ON() was added to exit if a partial
request is received in this analyser.

4 years agoCLEANUP: htx: Remove HTX_FL_UPGRADE unsued flag
Christopher Faulet [Tue, 6 Oct 2020 15:48:05 +0000 (17:48 +0200)] 
CLEANUP: htx: Remove HTX_FL_UPGRADE unsued flag

Now the H1 to H2 upgrade is handled before the stream
creation. HTX_FL_UPGRADE flag is now unused.

4 years agoMINOR: http-ana: Remove useless update of t_idle duration of the stream
Christopher Faulet [Wed, 30 Sep 2020 13:12:13 +0000 (15:12 +0200)] 
MINOR: http-ana: Remove useless update of t_idle duration of the stream

Becaues the stream is now created after the request headers parsing, the
idle duration from the session is always up-to-date.

4 years agoCLEANUP: mux-h1: Rename H1C_F_CS_* flags and reorder H1C flags
Christopher Faulet [Fri, 27 Nov 2020 15:44:01 +0000 (16:44 +0100)] 
CLEANUP: mux-h1: Rename H1C_F_CS_* flags and reorder H1C flags

H1C_F_CS_* flags are renamed into H1C_F_ST_*. They reflect the connection
state. So "ST" is well suited. "CS" is confusing because it is also the
abbreviation for conn-stream.

In addition, H1C flags are reordered.

4 years agoDOC: config: Add notes about errors emitted by H1 mux
Christopher Faulet [Wed, 2 Dec 2020 07:40:14 +0000 (08:40 +0100)] 
DOC: config: Add notes about errors emitted by H1 mux

Now, some errors are handled by the H1 multiplexer. During the headers
parsing request, there is no stream attached to the H1 mux. Thus, if an
error is reported at this stage, it is handled by the mux itself. If
possible the corresponding frontend errorfile is used, but it should be a
static message. Custom error messages are not supported. Otherwise, default
error messages are used.

In addition, the http analysis has not started yet, so http-after-response
ruleset is not evaluated and cannot alter these early responses.

4 years agoMAJOR: mux-h1: Create the client stream as later as possible
Christopher Faulet [Tue, 6 Oct 2020 15:45:34 +0000 (17:45 +0200)] 
MAJOR: mux-h1: Create the client stream as later as possible

This is the reason for all previous patches. The conn-stream and the
associated stream are created as later as possible. It only concerns the
frontend connections. But it means the request headers, and possibly the
first data block, are received and parsed before the conn-stream
creation. To do so, an embryonic H1 stream, with no conn-stream, is
created. The result of this "early parsing" is stored in its rx buffer, used
to fill the request channel when the stream is created. During this step,
some HTTP errors may be returned by the mux. It must also handle
http-request/keep-alive timeouts. A significative change is about H1 to H2
upgrade. It happens very early now, and no H1 stream are created (and thus
of course no conn-stream).

The most important part of this patch is located to the h1_process()
function. Because it must trigger the parsing when there is no H1
stream. h1_recv() function has also been simplified.

4 years agoMINOR: mux-h1: Add functions to send HTTP errors from the mux
Christopher Faulet [Tue, 6 Oct 2020 15:41:36 +0000 (17:41 +0200)] 
MINOR: mux-h1: Add functions to send HTTP errors from the mux

For now, this part is unsued. But this patch adds functions to handle errors
on idle and embryonic H1 connections and send corresponding HTTP error
messages to the client (400, 408 or 500). Thanks to previous patches, these
functions take care to update the right stats counters, but also the
counters tracked by the session.

A field to store the HTTP error code has been added in the H1C structure. It
is used for error retransmits, if any, and to get it in http logs. It is
used to return the mux exit status code when the MUX_EXIT_STATUS ctl
parameter is requested.

4 years agoMINOR: logs: Get the multiplexer exist status when no stream is provided
Christopher Faulet [Tue, 6 Oct 2020 13:11:43 +0000 (15:11 +0200)] 
MINOR: logs: Get the multiplexer exist status when no stream is provided

When a log message is emitted from the session level, by a multiplexer,
there is no stream. Thus for HTTP session, there no status code and the
termination flags are not correctly set.

Thanks to previous patch, the HTTP status code is deduced from the mux exist
status, using the MUX_EXIT_STATE ctl param. This is only done for HTTP
frontends. If it is defined ( != 0), it is used to deduce the termination
flags.

4 years agoMINOR: mux: Add a ctl parameter to get the exit status of the multiplexers
Christopher Faulet [Tue, 6 Oct 2020 12:59:17 +0000 (14:59 +0200)] 
MINOR: mux: Add a ctl parameter to get the exit status of the multiplexers

The ctl param MUX_EXIT_STATUS can be request to get the exit status of a
multiplexer. For instance, it may be an HTTP status code or an H2 error. For
now, 0 is always returned. When the mux h1 will be able to return HTTP
errors itself, this ctl param will be used to get the HTTP status code from
the logs.

the mux_exit_status enum has been created to map internal mux exist status
to generic one. Thus there is 5 possible status for now: success, invalid
error, timeout error, internal error and unknown.

4 years agoMINOR: session: Add functions to increase http values of tracked counters
Christopher Faulet [Tue, 6 Oct 2020 12:23:34 +0000 (14:23 +0200)] 
MINOR: session: Add functions to increase http values of tracked counters

cumulative numbers of http request and http errors of counters tracked at
the session level and their rates can now be updated at the session level
thanks to two new functions. These functions are not used for now, but it
will be called to keep tracked counters up-to-date if an error occurs before
the stream creation.

4 years agoMINOR: stick-tables: Add functions to update some values of a tracked counter
Christopher Faulet [Tue, 6 Oct 2020 11:52:40 +0000 (13:52 +0200)] 
MINOR: stick-tables: Add functions to update some values of a tracked counter

The cumulative numbers of http requests, http errors, bytes received and
sent and their respective rates for a tracked counters are now updated using
specific stream independent functions. These functions are used by the
stream but the aim is to allow the session to do so too. For now, there is
no reason to perform these updates from the session, except from the mux-h2
maybe. But, the mux-h1, on the frontend side, will be able to return some
errors to the client, before the stream creation. In this case, it will be
mandatory to update counters tracked at the session level.

4 years agoMINOR: mux-h1: Add a idle expiration date on the H1 connection
Christopher Faulet [Mon, 5 Oct 2020 15:50:58 +0000 (17:50 +0200)] 
MINOR: mux-h1: Add a idle expiration date on the H1 connection

An idle expiration date is added on the H1 connection with the function to
set it depending on connection state. First, there is no idle timeout on
backend connections, For idle frontend connections, the http-request or
keep-alive timeout are used depending on which timeout is defined and if it
is the first request or not. For embryonic connections, the http-request is
always used, if defined. For attached or shutted down connections, no idle
timeout is applied.

For now the idle expiration date is never set and the h1_set_idle_expiration
function remains unused.

4 years agoMINOR: mux-h1: Process next request for IDLE connection only
Christopher Faulet [Mon, 5 Oct 2020 15:14:28 +0000 (17:14 +0200)] 
MINOR: mux-h1: Process next request for IDLE connection only

When the conn-stream is detached for a H1 connection, there is no reason to
subscribe for reads or process pending input data if the connection is not
idle. Because, it means a shutdown is pending.

4 years agoMINOR: mux-h1: Rework h1_refresh_timeout to be easier to read
Christopher Faulet [Mon, 5 Oct 2020 15:13:05 +0000 (17:13 +0200)] 
MINOR: mux-h1: Rework h1_refresh_timeout to be easier to read

Conditions to set a timeout on the H1C task have been simplified or at least
changed to rely on H1 connection flags. Now, following rules are used :

 * the shutdown timeout is applied on dead (not alive) or shutted down
   connections.

 * The client/server timeout is applied if there are still some pending
   outgoing data.

 * The client timeout is applied on alive frontend connections with no
   conn-stream. It means on idle or embryionic frontend connections.

 * For all other connections (backend or attached connections), no timeout
   is applied. For frontend or backend attached connections, the timeout is
   handled by the application layer. For idle backend connections, there is
   no timeout.

4 years agoMINOR: mux-h1: Rework how shutdowns are handled
Christopher Faulet [Mon, 5 Oct 2020 15:11:16 +0000 (17:11 +0200)] 
MINOR: mux-h1: Rework how shutdowns are handled

We now only rely on one flag to notify a shutdown. The shutdown is performed
at the connection level when there are no more pending outgoing data. So, it
means it is performed immediately if the output buffer is empty. Otherwise
it is deferred after the outgoing data are sent.

This simplify a bit the mux because there is now only one flag to check.

4 years agoMINOR: mux-h1: Disable reads if an error was reported on the H1 stream
Christopher Faulet [Wed, 30 Sep 2020 15:33:22 +0000 (17:33 +0200)] 
MINOR: mux-h1: Disable reads if an error was reported on the H1 stream

Don't try to read more data if a parsing or a formatting error was reported
on the H1 stream. There is no reason to continue to process the messages for
the current connection in this case. If a parsing error occurs, it means the
input is invalid. If a formatting error occurs, it is an internal error and
it is probably safer to give up.

4 years agoMINOR: mux-h1: Reset more H1C flags when a H1 stream is destroyed
Christopher Faulet [Wed, 30 Sep 2020 15:14:55 +0000 (17:14 +0200)] 
MINOR: mux-h1: Reset more H1C flags when a H1 stream is destroyed

When a H1 stream is destroyed, all dynamic flags on the H1 connection are
reset to be sure to leave it in a clean state.

4 years agoMINOR: mux-h1: rework the h1_timeout_task() function
Christopher Faulet [Tue, 29 Sep 2020 13:30:15 +0000 (15:30 +0200)] 
MINOR: mux-h1: rework the h1_timeout_task() function

Mainly to make it easier to read. First of all, when a H1 connection is
still there, we check if the connection was stolen by another thread or
not. If yes we release the task and leave. Then we check if the task is
expired or not. Only expired tasks are considered. Finally, if a conn-stream
is still attached to the connection (H1C_F_CS_ATTACHED flag set), we
return. Otherwise, the task and the H1 connection are released.

4 years agoMINOR: mux-h1: Add embryonic and attached states on the H1 connection
Christopher Faulet [Tue, 29 Sep 2020 13:18:40 +0000 (15:18 +0200)] 
MINOR: mux-h1: Add embryonic and attached states on the H1 connection

Be prepared to have a H1 connection in one of the following states :

 * A H1 connection waiting for a new message with no H1 stream.
   H1C_F_CS_IDLE flag is set.

 * A H1 connection processing a new message with a H1 stream but no
   conn-stream attached. H1C_F_CS_EMBRYONIC flag is set

 * A H1 connection with a H1 stream and a conn-stream attached.
   H1C_F_CS_ATTACHED flag is set.

 * A H1 connection with no H1 stream, waiting to be released. No flag is set.

These flags are mutually exclusives. When none is set, it means the
connection will be released ASAP, just remaining outgoing data must be sent
before. For now, the second state (H1C_F_CS_EMBRYONIC) is transient.

4 years agoMINOR: mux-h1: Don't set CS flags in internal parsing functions
Christopher Faulet [Thu, 24 Sep 2020 13:35:37 +0000 (15:35 +0200)] 
MINOR: mux-h1: Don't set CS flags in internal parsing functions

Now, only h1_process_input() function set or unset the conn-stream
flags. This way, internal parsing functions don't rely anymore on the
conn-stream.

4 years agoMINOR: mux-h1: Add a rxbuf into the H1 stream
Christopher Faulet [Thu, 24 Sep 2020 13:14:29 +0000 (15:14 +0200)] 
MINOR: mux-h1: Add a rxbuf into the H1 stream

For now this buffer is not used. But it will be used to parse the headers,
and possibly the first block of data, when no stream is attached to the H1
connection. The aim is to use it to create the stream, thanks to recent
changes on the streams creation api.

4 years agoMINOR: mux-h1: Split front/back h1 stream creation in 2 functions
Christopher Faulet [Thu, 24 Sep 2020 08:30:15 +0000 (10:30 +0200)] 
MINOR: mux-h1: Split front/back h1 stream creation in 2 functions

Dedicated functions are now used to create frontend and backend H1
streams. h1c_frt_stream_new() is now used to create frontend H1 streams and
h1c_bck_stream_new() to create backend ones. Both rely on h1s_new() function
to allocate the stream itself. It is a bit easier to add specific processing
depending we are on the frontend or the backend side.

4 years agoMINOR: mux-h1: Separate parsing and formatting errors at H1 stream level
Christopher Faulet [Thu, 24 Sep 2020 08:05:44 +0000 (10:05 +0200)] 
MINOR: mux-h1: Separate parsing and formatting errors at H1 stream level

Instead of using H1S flags to report an error on the request or the
response, independently it is a parsing or a formatting error, we now use a
flag to report parsing errors and another one to report formatting
ones. This simplify the message parsing. It is also easier to figure out
what error happened when one of this flag is set. The side may be deduced
checking the H1C_F_IS_BACK flag.

4 years agoMINOR: mux-h1: Introduce H1C_F_IS_BACK flag on the H1 connection
Christopher Faulet [Thu, 24 Sep 2020 07:52:52 +0000 (09:52 +0200)] 
MINOR: mux-h1: Introduce H1C_F_IS_BACK flag on the H1 connection

This flag is only set on the backend side and is tested instead of calling
conn_is_back() function.

4 years agoMEDIUM: mux-h1: Use a h1c flag to block reads when splicing is in-progress
Christopher Faulet [Mon, 21 Sep 2020 09:47:16 +0000 (11:47 +0200)] 
MEDIUM: mux-h1: Use a h1c flag to block reads when splicing is in-progress

Instead of using 2 flags on the H1 stream (H1S_F_BUF_FLUSH and
H1S_F_SPLICED_DATA), we now only use one flag on the H1 connection
(H1C_F_WANT_SPLICE) to notify we want to use splicing or we are using
splicing. This flag blocks the calls to rcv_buf() connection callback.

It is a bit easier to set the H1 connection capability to receive data in
its input buffer instead of relying on the H1 stream.

4 years agoMINOR: mux-h1: Add a flag to disable reads to wait opposite side
Christopher Faulet [Mon, 21 Sep 2020 08:57:52 +0000 (10:57 +0200)] 
MINOR: mux-h1: Add a flag to disable reads to wait opposite side

H1C_F_WAIT_OPPOSITE must be set on the H1 conenction to don't read more data
because we must be sync with the opposite side. This flag replaces the
H1C_F_IN_BUSY flag. Its name is a bit explicit. It is automatically set on
the backend side when the mux is created. It is safe to do so because at
this stage, the request has not yet been sent to the server. This way, in
h1_recv_allowed(), a test on this flag is enough to block the reads instead
of testing the H1 stream state on the backend side.

4 years agoMINOR: stream: Pass an optional input buffer when a stream is created
Christopher Faulet [Mon, 14 Sep 2020 09:40:13 +0000 (11:40 +0200)] 
MINOR: stream: Pass an optional input buffer when a stream is created

It is now possible to set the buffer used by the channel request buffer when
a stream is created. It may be useful if input data are already received,
instead of waiting the first call to the mux rcv_buf() callback. This change
is mandatory to support H1 connection with no stream attached.

For now, the multiplexers don't pass any buffer. BUF_NULL is thus used to
call stream_create_from_cs().

4 years agoMINOR: muxes: Remove get_cs_info callback function now useless
Christopher Faulet [Wed, 30 Sep 2020 12:08:30 +0000 (14:08 +0200)] 
MINOR: muxes: Remove get_cs_info callback function now useless

This callback function was only defined by the mux-h1. But it has been
removed in the previous commit because it is unused now. So, we can do a
step forward removing the callback function from the mux definition and the
cs_info structure.

4 years agoMINOR: mux-h1: Don't provide anymore timing info using cs_info structure
Christopher Faulet [Wed, 30 Sep 2020 12:06:23 +0000 (14:06 +0200)] 
MINOR: mux-h1: Don't provide anymore timing info using cs_info structure

The cs_info are now unused. The stream uses the session to get these
info. So we can safely remove it from the mux-h1.

4 years agoMINOR: stream: Don't retrieve anymore timing info from the mux csinfo
Christopher Faulet [Wed, 30 Sep 2020 12:03:54 +0000 (14:03 +0200)] 
MINOR: stream: Don't retrieve anymore timing info from the mux csinfo

These info are only provided by the mux-h1. But, thanks to previous patches,
we can get them from the session directly. There is no need to retrieve them
from the mux anymore.

4 years agoMINOR: stream: Always get idle duration from the session
Christopher Faulet [Wed, 30 Sep 2020 11:49:56 +0000 (13:49 +0200)] 
MINOR: stream: Always get idle duration from the session

Since the idle duration provided by the session is always up-to-date, there
is no more reason to rely on the multiplexer cs_info to set it to the
stream.

4 years agoMINOR: logs: Use session idle duration when no stream is provided
Christopher Faulet [Wed, 30 Sep 2020 13:10:07 +0000 (15:10 +0200)] 
MINOR: logs: Use session idle duration when no stream is provided

When a log message is emitted from the session, using sess_log() function,
there is no stream available. In this case, instead of deducing the idle
duration from the accept date, we use the one provided by the session. 0 is
used if it is undefined (i.e set to -1).

4 years agoMINOR: mux-h1: Reset session dates and durations info when the CS is detached
Christopher Faulet [Mon, 5 Oct 2020 09:35:17 +0000 (11:35 +0200)] 
MINOR: mux-h1: Reset session dates and durations info when the CS is detached

These info are reset for the next transaction, if the connection is kept
alive. From the stream point of view, it should be the same a new
connection, except there is no handshake. Thus the handshake duration is set
to 0.

4 years agoMINOR: mux-h1: Update session idle duration when data are received
Christopher Faulet [Wed, 30 Sep 2020 11:47:09 +0000 (13:47 +0200)] 
MINOR: mux-h1: Update session idle duration when data are received

The session idle duration is set if not already done when data are
received. For now, this value is still unused.

4 years agoMINOR: session: Add the idle duration field into the session
Christopher Faulet [Wed, 30 Sep 2020 08:28:02 +0000 (10:28 +0200)] 
MINOR: session: Add the idle duration field into the session

The idle duration between two streams is added to the session structure. It
is not necessarily pertinent on all protocols. In fact, it is only defined
for H1 connections. It is the duration between two H1 transactions. But the
.get_cs_info() callback function on the multiplexers only exists because
this duration is missing at the session level. So it is a simplification
opportunity for a really low cost.

To reduce the cost, a hole in the session structure is filled by moving
.srv_list field at the end of the structure.

4 years agoBUG/MINOR: mux-h1: Handle keep-alive timeout for idle frontend connections
Christopher Faulet [Tue, 1 Dec 2020 10:42:53 +0000 (11:42 +0100)] 
BUG/MINOR: mux-h1: Handle keep-alive timeout for idle frontend connections

IDLE frontend connections have no stream attached. The stream is only
created when new data are received, when the parsing of the next request
starts. Thus the keep-alive timeout, handled into the HTTP analysers, is not
considered while nothing is received. But this is especially when this
timeout must be considered. Concretely the http-keep-alive is ignored while
no data are received. Only the client timeout is used. It will only be
considered on incomplete requests, if the http-request timeout is not set.

To fix the bug, the http-keep-alive timeout must be handled at the mux
level, for IDLE frontend connection only.

This patch should fix the issue #984. It must be backported as far as
2.2. On prior versions, the stream is created earlier. So, it is not a
problem, except if this behavior changes of course (it was an optim of the
2.2, but don't remember the commit).

4 years agoBUG/MINOR: listener: use sockaddr_in6 for IPv6
Willy Tarreau [Fri, 4 Dec 2020 13:28:23 +0000 (14:28 +0100)] 
BUG/MINOR: listener: use sockaddr_in6 for IPv6

A copy-paste bug between {tcp,udp}{4,6}_add_listener() resulted in
using a struct sockaddr_in to set the TCP/UDP port while it ought to
be a struct sockaddr_in6. Fortunately, the port has the same offset
(2) in both so it was harmless. A cleaner way to proceed would be
to have a set_port function exported by the address family layer.

This needs to be backported to 2.3.

4 years agoBUG/MINOR: lua-thread: close all states on deinit
Willy Tarreau [Fri, 4 Dec 2020 10:48:12 +0000 (11:48 +0100)] 
BUG/MINOR: lua-thread: close all states on deinit

It seems to me that lua_close() must be called on all states at deinit
time, not just the first two ones. This is likely a remnant of commit
59f11be43 ("MEDIUM: lua-thread: Add the lua-load-per-thread directive").
There should likely be some memory leak reports when using Lua without
this fix, though none were observed for now.

No backport is needed as this was merged into 2.4-dev.

4 years agoBUG/MEDIUM: lua-thread: some parts must be initialized once
Thierry Fournier [Fri, 4 Dec 2020 10:47:47 +0000 (11:47 +0100)] 
BUG/MEDIUM: lua-thread: some parts must be initialized once

Lua dedicated TCP, HTTP and SSL socket and proxies must be initialized
once. Right now, they are initialized from the Lua init state, but since
commit 59f11be43 ("MEDIUM: lua-thread: Add the lua-load-per-thread
directive") this function is called one time per lua context. This
caused some fields to be cleared and overwritten, and pre-allocated
object to be lost. This is why the address sanitizer detected memory
leaks from the socket_ssl server initialization.

Let's move all the state-independent part of the function to the
hlua_init() function to avoid this.

No backport is needed, this is only 2.4-dev.

4 years agoMINOR: cache: Consider invalid Age values as stale
Remi Tricot-Le Breton [Thu, 3 Dec 2020 17:19:32 +0000 (18:19 +0100)] 
MINOR: cache: Consider invalid Age values as stale

Do not store responses that have an invalid age header (non numerical,
negative ...).

4 years agoMEDIUM: cache: Remove cache entry in case of POST on the same resource
Remi Tricot-Le Breton [Thu, 3 Dec 2020 17:19:31 +0000 (18:19 +0100)] 
MEDIUM: cache: Remove cache entry in case of POST on the same resource

In case of successful unsafe method on a stored resource, the cached entry
must be invalidated (see RFC7234#4.4).
A "non-error response" is one with a 2xx (Successful) or 3xx (Redirection)
status code.
This implies that the primary hash must now be calculated on requests
that have an unsafe method (POST or PUT for instance) so that we can
disable the corresponding entries when we process the response.

4 years agoMINOR: cache: Add extra "cache-control" value checks
Remi Tricot-Le Breton [Thu, 3 Dec 2020 17:19:30 +0000 (18:19 +0100)] 
MINOR: cache: Add extra "cache-control" value checks

The Cache-Control max-age and s-maxage directives should be followed by
a positive numerical value (see RFC 7234#5.2.1.1). According to the
specs, a sender "should not" generate a quoted-string value but we will
still accept this format.

4 years agoMINOR: cache: Do not store stale entry
Remi Tricot-Le Breton [Thu, 3 Dec 2020 17:19:29 +0000 (18:19 +0100)] 
MINOR: cache: Do not store stale entry

When a response has an Age header (filled in by another cache on the
message's path) that is greater than its defined maximum age (extracted
either from cache-control directives or an expires header), it is
already stale and should not be cached.

4 years agoDOC/MINOR: Fix formatting in Management Guide
Phil Scherer [Wed, 2 Dec 2020 19:36:08 +0000 (19:36 +0000)] 
DOC/MINOR: Fix formatting in Management Guide

section numbering used '9.2)' instead of '9.2.'.

4 years agoBUILD/MINOR: haproxy DragonFlyBSD affinity build update.
David Carlier [Wed, 2 Dec 2020 21:14:51 +0000 (21:14 +0000)] 
BUILD/MINOR: haproxy DragonFlyBSD affinity build update.

sched_setaffinity supported by this platform.

4 years agoREGTESTS: add a test for the threaded Lua code
Willy Tarreau [Wed, 2 Dec 2020 15:44:34 +0000 (16:44 +0100)] 
REGTESTS: add a test for the threaded Lua code

This is simply txn_get_priv.vtc with the loading made using
lua-load-per-thread, allowing all threads to run independently.
There's nothing global nor thread-specific in this test, which makes
an excellent example of something that should work out of the box.
Four concurrent clients are initialized with 4 loops each so as to
give a little chance to various threads to run concurrently.

4 years agoMINOR: lua-thread: Add verbosity in errors
Thierry Fournier [Sun, 29 Nov 2020 10:48:12 +0000 (11:48 +0100)] 
MINOR: lua-thread: Add verbosity in errors

Because lua-load-per-thread could not load the same code for each thread,
this patch displays the state-id associated with the error.

4 years agoMEDIUM: lua-thread: Add the lua-load-per-thread directive
Thierry Fournier [Sat, 28 Nov 2020 23:37:41 +0000 (00:37 +0100)] 
MEDIUM: lua-thread: Add the lua-load-per-thread directive

The goal is to allow execution of one main lua state per thread.

This patch contains the main job. The lua init is done using these
steps:
 - "lua-load-per-thread" loads the lua code in the first thread
 - it creates the structs
 - it stores loaded files
 - the 1st step load is completed (execution of hlua_post_init)
   and now, we known the number of threads
 - we initilize lua states for all remaining threads
 - for each one, we load the lua file
 - for each one, we execute post-init

Once all is loaded, we control consistency of functions references.
The rules are:
 - a function reference cannot be in the shared lua state and in
   a per-thread lua state at the same time.
 - if a function reference is declared in a per-thread lua state, it
   must be declared in all per-thread lua states

4 years agoMINOR: lua-thread: Store each function reference and init reference in array
Thierry Fournier [Sat, 28 Nov 2020 22:57:24 +0000 (23:57 +0100)] 
MINOR: lua-thread: Store each function reference and init reference in array

The goal is to allow execution of one main lua state per thread.

The array introduces storage of one reference per thread, because each
lua state can have different reference id for a same function. A function
returns the preferred state id according to configuration and current
thread id.

4 years agoMINOR: lua-thread: Replace state_from by state_id
Thierry Fournier [Sat, 28 Nov 2020 22:42:03 +0000 (23:42 +0100)] 
MINOR: lua-thread: Replace state_from by state_id

The goal is to allow execution of one main lua state per thread.

"state_from" is a pointer to the parent lua state. "state_id"
is the index of the parent state id in the reference lua states
array. "state_id" is better because the lock is a "== 0" test
which is quick than pointer comparison. In other way, the state_id
index could index other things the the Lua state concerned. I
think to the function references.

4 years agoMINOR: lua-thread: Replace "struct hlua_function" allocation by dedicated function
Thierry Fournier [Sat, 28 Nov 2020 20:06:35 +0000 (21:06 +0100)] 
MINOR: lua-thread: Replace "struct hlua_function" allocation by dedicated function

The goal is to allow execution of one main lua state per thread.

This function will initialize the struct with other things than 0.
With this function helper, the initialization is centralized and
it prevents mistakes. This patch also keeps a reference to each
declared function in a list. It will be useful in next patches to
control consistency of declared references.

4 years agoMINOR: lua-thread: Replace global gL var with an array of states
Thierry Fournier [Sat, 28 Nov 2020 16:06:51 +0000 (17:06 +0100)] 
MINOR: lua-thread: Replace global gL var with an array of states

The goal is to allow execution of one main lua state per thread.

The array of states is initialized at the max number of thread +1.
We define the index 0 is the common state shared by all threads
and should be locked. Other index index are dedicated to each
one thread. The old gL now becomes hlua_states[0].

4 years agoMEDIUM: lua-thread: Apply lock only if the parent state is the main thread
Thierry Fournier [Sat, 28 Nov 2020 16:02:21 +0000 (17:02 +0100)] 
MEDIUM: lua-thread: Apply lock only if the parent state is the main thread

The goal is to allow execution of one main lua state per thread.

This patch opens the way to addition of a per-thread dedicated lua state.
By passing the hlua we can figure the original state that's been used
and decide to lock or not.

4 years agoMEDIUM: lua-thread: No longer use locked context in initialization parts
Thierry Fournier [Sat, 28 Nov 2020 15:05:05 +0000 (16:05 +0100)] 
MEDIUM: lua-thread: No longer use locked context in initialization parts

The goal is to allow execution of one main lua state per thread.

Stop using locks in init part, we will use only in parts where
the parent lua state is known, so we could take decision about lock
according with the lua parent state.

4 years agoMINOR: lua-thread: Add the "thread" core variable
Thierry Fournier [Sat, 28 Nov 2020 14:49:44 +0000 (15:49 +0100)] 
MINOR: lua-thread: Add the "thread" core variable

The goal is to allow execution of one main lua state per thread.

This commit introduces this variable in the core. Lua state initialized
by thread will have access to this variable, which reports the executing
thread. 0 indicates the shared thread. Programs which must be executed
only once can check for core.thread <= 1.

4 years agoMINOR: lua-thread: Split hlua_post_init() function in two parts
Thierry Fournier [Sat, 28 Nov 2020 14:37:17 +0000 (15:37 +0100)] 
MINOR: lua-thread: Split hlua_post_init() function in two parts

The goal is to allow execution of one main lua state per thread.

This function will be called for each initialized lua state, so
one per thread. The split transforms the lua state variable from
global to local.

4 years agoMINOR: lua-thread: Split hlua_load function in two parts
Thierry Fournier [Sat, 28 Nov 2020 14:02:13 +0000 (15:02 +0100)] 
MINOR: lua-thread: Split hlua_load function in two parts

The goal is to allow execution of one main lua state per thread.

This function will be called once per thread, using different Lua
states. This patch prepares the work.

4 years agoMINOR: lua-thread: make hlua_ctx_init() get L from its caller
Thierry Fournier [Sat, 28 Nov 2020 12:18:56 +0000 (13:18 +0100)] 
MINOR: lua-thread: make hlua_ctx_init() get L from its caller

The goal is to allow execution of one main lua state per thread.

The function hlua_ctx_init() now gets the original lua state from
its caller. This allows the initialisation of lua_thread (coroutines)
from any master lua state.

The parent lua state is stored in the hlua struct.

This patch is a temporary transition, it will be modified later.

4 years agoMINOR: lua-thread: Split hlua_init() function in two parts
Thierry Fournier [Sat, 28 Nov 2020 11:26:24 +0000 (12:26 +0100)] 
MINOR: lua-thread: Split hlua_init() function in two parts

The goal is to allow execution of one main lua state per thread.

This is a preparative work in order to init more than one stack
in the lua-thread objective.

4 years agoMINOR: lua-thread: Replace embedded struct hlua_function by a pointer
Thierry Fournier [Sun, 29 Nov 2020 01:05:57 +0000 (02:05 +0100)] 
MINOR: lua-thread: Replace embedded struct hlua_function by a pointer

The goal is to allow execution of one main lua state per thread.

Because this struct will be filled after the configuration parser, we
cannot copy the content. The actual state of the Haproxy code doesn't
justify this change, it is an update preparing next steps.

4 years agoMINOR: lua-thread: Stop usage of struct hlua for the global lua state
Thierry Fournier [Sat, 28 Nov 2020 10:21:25 +0000 (11:21 +0100)] 
MINOR: lua-thread: Stop usage of struct hlua for the global lua state

The goal is to no longer use "struct hlua" with global main lua_state.

The usage of the "struct hlua" is no longer required. This patch replaces
this struct by another one.

Now, the usage of runtime Lua phase is separated from the start lua phase.