MAJOR: sessions: Store multiple outgoing connections in the session.
Instead of just storing the last connection in the session, store all of
the connections, for at most MAX_SRV_LIST (currently 5) targets.
That way we can do keepalive on more than 1 outgoing connection when the
client uses HTTP/2.
diff --git a/include/types/connection.h b/include/types/connection.h
index dbf985b..85afca0 100644
--- a/include/types/connection.h
+++ b/include/types/connection.h
@@ -414,7 +414,7 @@
struct wait_event *send_wait; /* Task to wake when we're ready to send */
struct wait_event *recv_wait; /* Task to wake when we're ready to recv */
struct list list; /* attach point to various connection lists (idle, ...) */
- struct list session_list; /* List of all sessions attached to this connection */
+ struct list session_list; /* List of attached connections to a session */
int xprt_st; /* transport layer state, initialized to zero */
int tmp_early_data; /* 1st byte of early data, if any */
int sent_early_data; /* Amount of early data we sent so far */
diff --git a/include/types/session.h b/include/types/session.h
index e0e1455..334a071 100644
--- a/include/types/session.h
+++ b/include/types/session.h
@@ -37,6 +37,13 @@
#include <types/task.h>
#include <types/vars.h>
+struct sess_srv_list {
+ void *target;
+ struct list list;
+};
+
+#define MAX_SRV_LIST 5
+
struct session {
struct proxy *fe; /* the proxy this session depends on for the client side */
struct listener *listener; /* the listener by which the request arrived */
@@ -47,8 +54,7 @@
struct vars vars; /* list of variables for the session scope. */
struct task *task; /* handshake timeout processing */
long t_handshake; /* handshake duration, -1 = not completed */
- struct connection *srv_conn; /* Server connection we last used */
- struct list conn_list; /* List element for the session list in each connection */
+ struct sess_srv_list srv_list[MAX_SRV_LIST]; /* List of servers and the connections the session is currently responsible for */
};
#endif /* _TYPES_SESSION_H */