]> git.ipfire.org Git - thirdparty/haproxy.git/commit
[MAJOR] rework of the server FSM
authorWilly Tarreau <w@1wt.eu>
Sun, 19 Oct 2008 05:30:41 +0000 (07:30 +0200)
committerWilly Tarreau <w@1wt.eu>
Sun, 2 Nov 2008 09:19:04 +0000 (10:19 +0100)
commitfa7e10251def8336519e6de619bdd3efc3a6b3fc
tree487cc2e60de76429a3940c22ad48d2ae8d6ba9ab
parent41f40ede3bab7a099072f7ab3cadf170bcc4ae3c
[MAJOR] rework of the server FSM

srv_state has been removed from HTTP state machines, and states
have been split in either TCP states or analyzers. For instance,
the TARPIT state has just become a simple analyzer.

New flags have been added to the struct buffer to compensate this.
The high-level stream processors sometimes need to force a disconnection
without touching a file-descriptor (eg: report an error). But if
they touched BF_SHUTW or BF_SHUTR, the file descriptor would not
be closed. Thus, the two SHUT?_NOW flags have been added so that
an application can request a forced close which the stream interface
will be forced to obey.

During this change, a new BF_HIJACK flag was added. It will
be used for data generation, eg during a stats dump. It
prevents the producer on a buffer from sending data into it.

  BF_SHUTR_NOW  /* the producer must shut down for reads ASAP  */
  BF_SHUTW_NOW  /* the consumer must shut down for writes ASAP */
  BF_HIJACK     /* the producer is temporarily replaced        */

BF_SHUTW_NOW has precedence over BF_HIJACK. BF_HIJACK has
precedence over BF_MAY_FORWARD (so that it does not need it).

New functions buffer_shutr_now(), buffer_shutw_now(), buffer_abort()
are provided to manipulate BF_SHUT* flags.

A new type "stream_interface" has been added to describe both
sides of a buffer. A stream interface has states and error
reporting. The session now has two stream interfaces (one per
side). Each buffer has stream_interface pointers to both
consumer and producer sides.

The server-side file descriptor has moved to its stream interface,
so that even the buffer has access to it.

process_srv() has been split into three parts :
  - tcp_get_connection() obtains a connection to the server
  - tcp_connection_failed() tests if a previously attempted
    connection has succeeded or not.
  - process_srv_data() only manages the data phase, and in
    this sense should be roughly equivalent to process_cli.

Little code has been removed, and a lot of old code has been
left in comments for now.
12 files changed:
include/proto/buffers.h
include/proto/proto_http.h
include/proto/stream_sock.h
include/types/buffers.h
include/types/session.h
include/types/stream_interface.h [new file with mode: 0644]
src/backend.c
src/client.c
src/proto_http.c
src/proto_uxst.c
src/senddata.c
src/stream_sock.c