blob: 237bfbe682bf5c39e5c62f5910a2d62dc2eba9a0 [file] [log] [blame]
Emeric Brun3bd697e2010-01-04 15:23:48 +01001/*
Willy Tarreau872f2ea2020-06-04 18:46:44 +02002 * include/haproxy/stick_table-t.h
Emeric Brun3bd697e2010-01-04 15:23:48 +01003 * Macros, variables and structures for stick tables management.
4 *
5 * Copyright (C) 2009-2010 EXCELIANCE, Emeric Brun <ebrun@exceliance.fr>
Willy Tarreau08d5f982010-06-06 13:34:54 +02006 * Copyright (C) 2010 Willy Tarreau <w@1wt.eu>
Emeric Brun3bd697e2010-01-04 15:23:48 +01007 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation, version 2.1
11 * exclusively.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
Willy Tarreau872f2ea2020-06-04 18:46:44 +020023#ifndef _HAPROXY_STICK_TABLE_T_H
24#define _HAPROXY_STICK_TABLE_T_H
Emeric Brun3bd697e2010-01-04 15:23:48 +010025
26#include <sys/socket.h>
27#include <netinet/in.h>
28
Willy Tarreau8d2b7772020-05-27 10:58:19 +020029#include <import/eb32tree.h>
Willy Tarreau872f2ea2020-06-04 18:46:44 +020030#include <import/ebmbtree.h>
31#include <import/ebpttree.h>
32
Willy Tarreaub2551052020-06-09 09:07:15 +020033#include <haproxy/api-t.h>
Willy Tarreau66347942020-06-01 12:18:08 +020034#include <haproxy/freq_ctr-t.h>
Willy Tarreau872f2ea2020-06-04 18:46:44 +020035#include <haproxy/thread-t.h>
Willy Tarreau872f2ea2020-06-04 18:46:44 +020036
Emeric Brun3bd697e2010-01-04 15:23:48 +010037
Willy Tarreau08d5f982010-06-06 13:34:54 +020038/* The types of extra data we can store in a stick table */
39enum {
Willy Tarreau87b09662015-04-03 00:22:06 +020040 STKTABLE_DT_SERVER_ID, /* the server ID to use with this stream if > 0 */
Thierry FOURNIER3cf11112015-07-28 08:57:05 +020041 STKTABLE_DT_GPT0, /* General Purpose Flag 0. */
Willy Tarreauc3bd9722010-06-20 12:47:25 +020042 STKTABLE_DT_GPC0, /* General Purpose Counter 0 (unsigned 32-bit integer) */
Willy Tarreauba2ffd12013-05-29 15:54:14 +020043 STKTABLE_DT_GPC0_RATE, /* General Purpose Counter 0's event rate */
Willy Tarreau8fb12c42010-06-18 20:16:39 +020044 STKTABLE_DT_CONN_CNT, /* cumulated number of connections */
Willy Tarreau91c43d72010-06-20 11:19:22 +020045 STKTABLE_DT_CONN_RATE, /* incoming connection rate */
Willy Tarreau38285c12010-06-18 16:35:43 +020046 STKTABLE_DT_CONN_CUR, /* concurrent number of connections */
Willy Tarreauf4d17d92010-06-18 22:10:12 +020047 STKTABLE_DT_SESS_CNT, /* cumulated number of sessions (accepted connections) */
Willy Tarreau91c43d72010-06-20 11:19:22 +020048 STKTABLE_DT_SESS_RATE, /* accepted sessions rate */
Willy Tarreauda7ff642010-06-23 11:44:09 +020049 STKTABLE_DT_HTTP_REQ_CNT, /* cumulated number of incoming HTTP requests */
50 STKTABLE_DT_HTTP_REQ_RATE,/* incoming HTTP request rate */
51 STKTABLE_DT_HTTP_ERR_CNT, /* cumulated number of HTTP requests errors (4xx) */
52 STKTABLE_DT_HTTP_ERR_RATE,/* HTTP request error rate */
Willy Tarreau855e4bb2010-06-18 18:33:32 +020053 STKTABLE_DT_BYTES_IN_CNT, /* cumulated bytes count from client to servers */
Willy Tarreau6c59e0a2010-06-20 11:56:30 +020054 STKTABLE_DT_BYTES_IN_RATE,/* bytes rate from client to servers */
Willy Tarreau855e4bb2010-06-18 18:33:32 +020055 STKTABLE_DT_BYTES_OUT_CNT,/* cumulated bytes count from servers to client */
Willy Tarreau6c59e0a2010-06-20 11:56:30 +020056 STKTABLE_DT_BYTES_OUT_RATE,/* bytes rate from servers to client */
Frédéric Lécaille6778b272018-01-29 15:22:53 +010057 STKTABLE_DT_GPC1, /* General Purpose Counter 1 (unsigned 32-bit integer) */
58 STKTABLE_DT_GPC1_RATE, /* General Purpose Counter 1's event rate */
Thayne McCombs92149f92020-11-20 01:28:26 -070059 STKTABLE_DT_SERVER_KEY, /* The server key */
Willy Tarreau826f3ab2021-02-10 12:07:15 +010060 STKTABLE_DT_HTTP_FAIL_CNT, /* cumulated number of HTTP server failures */
61 STKTABLE_DT_HTTP_FAIL_RATE,/* HTTP server failures rate */
62
Willy Tarreauedee1d62014-07-15 16:44:27 +020063 STKTABLE_STATIC_DATA_TYPES,/* number of types above */
64 /* up to STKTABLE_EXTRA_DATA_TYPES types may be registered here, always
65 * followed by the number of data types, must always be last.
66 */
67 STKTABLE_DATA_TYPES = STKTABLE_STATIC_DATA_TYPES + STKTABLE_EXTRA_DATA_TYPES
Willy Tarreau08d5f982010-06-06 13:34:54 +020068};
69
Willy Tarreau3b9c6e02010-07-18 08:04:30 +020070/* The equivalent standard types of the stored data */
71enum {
72 STD_T_SINT = 0, /* data is of type signed int */
73 STD_T_UINT, /* data is of type unsigned int */
74 STD_T_ULL, /* data is of type unsigned long long */
Willy Tarreaufa1258f2021-04-10 23:00:53 +020075 STD_T_FRQP, /* data is of type freq_ctr */
Frédéric Lécaille5ad57ea2019-05-17 10:08:29 +020076 STD_T_DICT, /* data is of type key of dictionary entry */
Willy Tarreau3b9c6e02010-07-18 08:04:30 +020077};
78
Willy Tarreau888617d2010-06-20 09:11:39 +020079/* The types of optional arguments to stored data */
80enum {
81 ARG_T_NONE = 0, /* data type takes no argument (default) */
82 ARG_T_INT, /* signed integer */
83 ARG_T_DELAY, /* a delay which supports time units */
84};
85
Thayne McCombs92149f92020-11-20 01:28:26 -070086/* They types of keys that servers can be identified by */
87enum {
88 STKTABLE_SRV_NAME = 0,
89 STKTABLE_SRV_ADDR,
90};
91
Willy Tarreau872f2ea2020-06-04 18:46:44 +020092/* stick table key type flags */
93#define STK_F_CUSTOM_KEYSIZE 0x00000001 /* this table's key size is configurable */
94
95/* WARNING: if new fields are added, they must be initialized in stream_accept()
96 * and freed in stream_free() !
97 *
98 * What's the purpose of there two macro:
99 * - STKCTR_TRACK_BACKEND indicates that a tracking pointer was set from the backend
100 * and thus that when a keep-alive request goes to another backend, the track
101 * must cease.
102 *
103 * - STKCTR_TRACK_CONTENT indicates that the tracking pointer was set in a
104 * content-aware rule (tcp-request content or http-request) and that the
105 * tracking has to be performed in the stream and not in the session, and
106 * will cease for a new keep-alive request over the same connection.
107 *
108 * These values are mixed with the stksess pointer in stkctr->entry.
109 */
110#define STKCTR_TRACK_BACKEND 1
111#define STKCTR_TRACK_CONTENT 2
112
Willy Tarreau08d5f982010-06-06 13:34:54 +0200113/* stick_table extra data. This is mainly used for casting or size computation */
114union stktable_data {
Willy Tarreau3b9c6e02010-07-18 08:04:30 +0200115 /* standard types for easy casting */
116 int std_t_sint;
117 unsigned int std_t_uint;
118 unsigned long long std_t_ull;
Willy Tarreaufa1258f2021-04-10 23:00:53 +0200119 struct freq_ctr std_t_frqp;
Frédéric Lécaille5ad57ea2019-05-17 10:08:29 +0200120 struct dict_entry *std_t_dict;
Willy Tarreau3b9c6e02010-07-18 08:04:30 +0200121
122 /* types of each storable data */
Willy Tarreau13c29de2010-06-06 16:40:39 +0200123 int server_id;
Thayne McCombs92149f92020-11-20 01:28:26 -0700124 struct dict_entry *server_key;
Thierry FOURNIER3cf11112015-07-28 08:57:05 +0200125 unsigned int gpt0;
Willy Tarreauc3bd9722010-06-20 12:47:25 +0200126 unsigned int gpc0;
Willy Tarreaufa1258f2021-04-10 23:00:53 +0200127 struct freq_ctr gpc0_rate;
Frédéric Lécaille6778b272018-01-29 15:22:53 +0100128 unsigned int gpc1;
Willy Tarreaufa1258f2021-04-10 23:00:53 +0200129 struct freq_ctr gpc1_rate;
Willy Tarreau38285c12010-06-18 16:35:43 +0200130 unsigned int conn_cnt;
Willy Tarreaufa1258f2021-04-10 23:00:53 +0200131 struct freq_ctr conn_rate;
Willy Tarreau38285c12010-06-18 16:35:43 +0200132 unsigned int conn_cur;
Willy Tarreauf4d17d92010-06-18 22:10:12 +0200133 unsigned int sess_cnt;
Willy Tarreaufa1258f2021-04-10 23:00:53 +0200134 struct freq_ctr sess_rate;
Willy Tarreauda7ff642010-06-23 11:44:09 +0200135 unsigned int http_req_cnt;
Willy Tarreaufa1258f2021-04-10 23:00:53 +0200136 struct freq_ctr http_req_rate;
Willy Tarreauda7ff642010-06-23 11:44:09 +0200137 unsigned int http_err_cnt;
Willy Tarreaufa1258f2021-04-10 23:00:53 +0200138 struct freq_ctr http_err_rate;
Willy Tarreau855e4bb2010-06-18 18:33:32 +0200139 unsigned long long bytes_in_cnt;
Willy Tarreaufa1258f2021-04-10 23:00:53 +0200140 struct freq_ctr bytes_in_rate;
Willy Tarreau855e4bb2010-06-18 18:33:32 +0200141 unsigned long long bytes_out_cnt;
Willy Tarreaufa1258f2021-04-10 23:00:53 +0200142 struct freq_ctr bytes_out_rate;
Willy Tarreau826f3ab2021-02-10 12:07:15 +0100143 unsigned int http_fail_cnt;
Willy Tarreaufa1258f2021-04-10 23:00:53 +0200144 struct freq_ctr http_fail_rate;
Willy Tarreau08d5f982010-06-06 13:34:54 +0200145};
146
Willy Tarreau08d5f982010-06-06 13:34:54 +0200147/* known data types */
148struct stktable_data_type {
149 const char *name; /* name of the data type */
Willy Tarreau3b9c6e02010-07-18 08:04:30 +0200150 int std_type; /* standard type we can use for this data, STD_T_* */
Willy Tarreau888617d2010-06-20 09:11:39 +0200151 int arg_type; /* type of optional argument, ARG_T_* */
Willy Tarreau08d5f982010-06-06 13:34:54 +0200152};
153
Emeric Brun3bd697e2010-01-04 15:23:48 +0100154/* stick table keyword type */
155struct stktable_type {
Willy Tarreauaea940e2010-06-06 11:56:36 +0200156 const char *kw; /* keyword string */
157 int flags; /* type flags */
158 size_t default_size; /* default key size */
Emeric Brun3bd697e2010-01-04 15:23:48 +0100159};
160
Willy Tarreau393379c2010-06-06 12:11:37 +0200161/* Sticky session.
162 * Any additional data related to the stuck session is installed *before*
163 * stksess (with negative offsets). This allows us to run variable-sized
164 * keys and variable-sized data without making use of intermediate pointers.
165 */
Emeric Brun3bd697e2010-01-04 15:23:48 +0100166struct stksess {
Emeric Brun3bd697e2010-01-04 15:23:48 +0100167 unsigned int expire; /* session expiration date */
Willy Tarreaue7f3d7a2010-06-14 14:53:07 +0200168 unsigned int ref_cnt; /* reference count, can only purge when zero */
Willy Tarreauaf613e82020-06-05 08:40:51 +0200169 __decl_thread(HA_RWLOCK_T lock); /* lock related to the table entry */
Willy Tarreau86257dc2010-06-06 12:57:10 +0200170 struct eb32_node exp; /* ebtree node used to hold the session in expiration tree */
Emeric Brun85e77c72010-09-23 18:16:52 +0200171 struct eb32_node upd; /* ebtree node used to hold the update sequence tree */
Willy Tarreau86257dc2010-06-06 12:57:10 +0200172 struct ebmb_node key; /* ebtree node used to hold the session in table */
Willy Tarreauaea940e2010-06-06 11:56:36 +0200173 /* WARNING! do not put anything after <keys>, it's used by the key */
Emeric Brun3bd697e2010-01-04 15:23:48 +0100174};
175
Emeric Brun85e77c72010-09-23 18:16:52 +0200176
Emeric Brun3bd697e2010-01-04 15:23:48 +0100177/* stick table */
178struct stktable {
Frédéric Lécaillec02766a2019-03-20 15:06:55 +0100179 char *id; /* local table id name. */
180 char *nid; /* table id name sent over the network with peers protocol. */
Frédéric Lécailled456aa42019-03-08 14:47:00 +0100181 struct stktable *next; /* The stick-table may be linked when belonging to
182 * the same configuration section.
183 */
Frédéric Lécaille1b8e68e2019-03-14 07:07:41 +0100184 struct ebpt_node name; /* Stick-table are lookup by name here. */
Willy Tarreauaea940e2010-06-06 11:56:36 +0200185 struct eb_root keys; /* head of sticky session tree */
186 struct eb_root exps; /* head of sticky session expiration tree */
Emeric Brun85e77c72010-09-23 18:16:52 +0200187 struct eb_root updates; /* head of sticky updates sequence tree */
Willy Tarreauaea940e2010-06-06 11:56:36 +0200188 struct pool_head *pool; /* pool used to allocate sticky sessions */
Emeric Brun3bd697e2010-01-04 15:23:48 +0100189 struct task *exp_task; /* expiration task */
Emeric Brun85e77c72010-09-23 18:16:52 +0200190 struct task *sync_task; /* sync task */
191 unsigned int update;
192 unsigned int localupdate;
Emeric Brunaaf58602015-06-15 17:23:30 +0200193 unsigned int commitupdate;/* used to identify the latest local updates
194 pending for sync */
Emeric Brun2cc201f2021-04-23 12:21:26 +0200195 unsigned int refcnt; /* number of local peer over all peers sections
196 attached to this table */
Emeric Brun32da3c42010-09-23 18:39:19 +0200197 union {
198 struct peers *p; /* sync peers */
199 char *name;
200 } peers;
201
Willy Tarreauaea940e2010-06-06 11:56:36 +0200202 unsigned long type; /* type of table (determines key format) */
Thayne McCombs92149f92020-11-20 01:28:26 -0700203 unsigned int server_key_type; /* What type of key is used to identify servers */
Emeric Brun3bd697e2010-01-04 15:23:48 +0100204 size_t key_size; /* size of a key, maximum size in case of string */
Willy Tarreauaea940e2010-06-06 11:56:36 +0200205 unsigned int size; /* maximum number of sticky sessions in table */
206 unsigned int current; /* number of sticky sessions currently in table */
207 int nopurge; /* if non-zero, don't purge sticky sessions when full */
208 int exp_next; /* next expiration date (ticks) */
209 int expire; /* time to live for sticky sessions (milliseconds) */
Willy Tarreau393379c2010-06-06 12:11:37 +0200210 int data_size; /* the size of the data that is prepended *before* stksess */
Willy Tarreau08d5f982010-06-06 13:34:54 +0200211 int data_ofs[STKTABLE_DATA_TYPES]; /* negative offsets of present data types, or 0 if absent */
Willy Tarreau888617d2010-06-20 09:11:39 +0200212 union {
213 int i;
214 unsigned int u;
215 void *p;
216 } data_arg[STKTABLE_DATA_TYPES]; /* optional argument of each data type */
Frédéric Lécailled456aa42019-03-08 14:47:00 +0100217 struct proxy *proxy; /* The proxy this stick-table is attached to, if any.*/
Frédéric Lécaille015e4d72019-03-19 14:55:01 +0100218 struct proxy *proxies_list; /* The list of proxies which reference this stick-table. */
Willy Tarreaue72a3f42020-10-18 11:08:41 +0200219 struct {
220 const char *file; /* The file where the stick-table is declared. */
221 int line; /* The line in this <file> the stick-table is declared. */
222 } conf;
223 __decl_thread(HA_SPINLOCK_T lock); /* spin lock related to the table */
Emeric Brun3bd697e2010-01-04 15:23:48 +0100224};
225
Willy Tarreau795e4a92010-07-18 07:38:17 +0200226extern struct stktable_data_type stktable_data_types[STKTABLE_DATA_TYPES];
Willy Tarreauaea940e2010-06-06 11:56:36 +0200227
Emeric Brun3bd697e2010-01-04 15:23:48 +0100228/* stick table key */
229struct stktable_key {
230 void *key; /* pointer on key buffer */
231 size_t key_len; /* data len to read in buff in case of null terminated string */
Emeric Brun3bd697e2010-01-04 15:23:48 +0100232};
233
Willy Tarreau5ed1bbf2014-06-25 18:30:01 +0200234/* stick counter. The <entry> member is a composite address (caddr) made of a
235 * pointer to an stksess struct, and two flags among STKCTR_TRACK_* above.
236 */
237struct stkctr {
Willy Tarreau87b09662015-04-03 00:22:06 +0200238 unsigned long entry; /* entry containing counters currently being tracked by this stream */
Willy Tarreau5ed1bbf2014-06-25 18:30:01 +0200239 struct stktable *table; /* table the counters above belong to (undefined if counters are null) */
240};
241
242/* parameters to configure tracked counters */
243struct track_ctr_prm {
244 struct sample_expr *expr; /* expression used as the key */
245 union {
246 struct stktable *t; /* a pointer to the table */
247 char *n; /* or its name during parsing. */
248 } table;
249};
250
Willy Tarreau872f2ea2020-06-04 18:46:44 +0200251#endif /* _HAPROXY_STICK_TABLE_T_H */