diff --git a/doc/configuration.txt b/doc/configuration.txt index aa167a8264..7b01c7969a 100644 --- a/doc/configuration.txt +++ b/doc/configuration.txt @@ -17710,6 +17710,14 @@ table_conn_rate() rate associated with the input sample in the designated table. See also the sc_conn_rate sample fetch keyword. +table_expire(
[,]) + Uses the input sample to perform a look up in the specified table. If the key + is not found in the table, the converter fails except if is + set: this makes the converter succeed and return . If the key + is found the converter returns the key expiration delay associated with the + input sample in the designated table. + See also the table_idle sample fetch keyword. + table_gpt(,
) Uses the string representation of the input sample to perform a lookup in the specified table. If the key is not found in the table, boolean value zero @@ -17828,6 +17836,15 @@ table_http_req_rate(
) period configured in the table. See also the sc_http_req_rate sample fetch keyword. +table_idle(
) + Uses the input sample to perform a look up in the specified table. If the key + is not found in the table, the converter fails except if is + set: this makes the converter succeed and return . If the key + is found the converter returns the time the key entry associated with the + input sample in the designated table remained idle since the last time it was + updated. + See also the table_expire sample fetch keyword. + table_kbytes_in(
) Uses the string representation of the input sample to perform a look up in the specified table. If the key is not found in the table, integer value zero diff --git a/src/stick_table.c b/src/stick_table.c index 9112996aa5..b1e7b59a5e 100644 --- a/src/stick_table.c +++ b/src/stick_table.c @@ -1392,6 +1392,82 @@ static int sample_conv_table_conn_rate(const struct arg *arg_p, struct sample *s return !!ptr; } +/* Casts sample to the type of the table specified in arg(0), and looks + * it up into this table. Returns the expiration delay for the key if the key is + * present in the table, otherwise the default value provided as second argument + * if any, if not (no default value), is returned. + */ +static int sample_conv_table_expire(const struct arg *arg_p, struct sample *smp, void *private) +{ + struct stktable *t; + struct stktable_key *key; + struct stksess *ts; + + t = arg_p[0].data.t; + + key = smp_to_stkey(smp, t); + if (!key) + return 0; + + ts = stktable_lookup_key(t, key); + + smp->flags = SMP_F_VOL_TEST; + smp->data.type = SMP_T_SINT; + smp->data.u.sint = 0; + + if (!ts) { /* key not present */ + if (arg_p[1].type == ARGT_STOP) + return 0; + + /* default value */ + smp->data.u.sint = arg_p[1].data.sint; + return 1; + } + + smp->data.u.sint = tick_remain(now_ms, ts->expire); + + stktable_release(t, ts); + return 1; +} + +/* Casts sample to the type of the table specified in arg(0), and looks + * it up into this table. Returns the time the key remains unused if the key is + * present in the table, otherwise the default value provided as second argument + * if any, if not (no default value), is returned. + */ +static int sample_conv_table_idle(const struct arg *arg_p, struct sample *smp, void *private) +{ + struct stktable *t; + struct stktable_key *key; + struct stksess *ts; + + t = arg_p[0].data.t; + + key = smp_to_stkey(smp, t); + if (!key) + return 0; + + ts = stktable_lookup_key(t, key); + + smp->flags = SMP_F_VOL_TEST; + smp->data.type = SMP_T_SINT; + smp->data.u.sint = 0; + + if (!ts) { /* key not present */ + if (arg_p[1].type == ARGT_STOP) + return 0; + + /* default value */ + smp->data.u.sint = arg_p[1].data.sint; + return 1; + } + + smp->data.u.sint = tick_remain(tick_remain(now_ms, ts->expire), t->expire); + + stktable_release(t, ts); + return 1; +} + /* Casts sample to the type of the table specified in arg(0), and looks * it up into this table. Returns the data rate sent to clients in bytes/s * if the key is present in the table, otherwise zero, so that comparisons can @@ -5074,6 +5150,7 @@ static struct sample_conv_kw_list sample_conv_kws = {ILH, { { "table_conn_cnt", sample_conv_table_conn_cnt, ARG1(1,TAB), NULL, SMP_T_ANY, SMP_T_SINT }, { "table_conn_cur", sample_conv_table_conn_cur, ARG1(1,TAB), NULL, SMP_T_ANY, SMP_T_SINT }, { "table_conn_rate", sample_conv_table_conn_rate, ARG1(1,TAB), NULL, SMP_T_ANY, SMP_T_SINT }, + { "table_expire", sample_conv_table_expire, ARG2(1,TAB,SINT), NULL, SMP_T_ANY, SMP_T_SINT }, { "table_gpt", sample_conv_table_gpt, ARG2(2,SINT,TAB), NULL, SMP_T_ANY, SMP_T_SINT }, { "table_gpt0", sample_conv_table_gpt0, ARG1(1,TAB), NULL, SMP_T_ANY, SMP_T_SINT }, { "table_gpc", sample_conv_table_gpc, ARG2(2,SINT,TAB), NULL, SMP_T_ANY, SMP_T_SINT }, @@ -5088,6 +5165,7 @@ static struct sample_conv_kw_list sample_conv_kws = {ILH, { { "table_http_fail_rate", sample_conv_table_http_fail_rate, ARG1(1,TAB), NULL, SMP_T_ANY, SMP_T_SINT }, { "table_http_req_cnt", sample_conv_table_http_req_cnt, ARG1(1,TAB), NULL, SMP_T_ANY, SMP_T_SINT }, { "table_http_req_rate", sample_conv_table_http_req_rate, ARG1(1,TAB), NULL, SMP_T_ANY, SMP_T_SINT }, + { "table_idle", sample_conv_table_idle, ARG2(1,TAB,SINT), NULL, SMP_T_ANY, SMP_T_SINT }, { "table_kbytes_in", sample_conv_table_kbytes_in, ARG1(1,TAB), NULL, SMP_T_ANY, SMP_T_SINT }, { "table_kbytes_out", sample_conv_table_kbytes_out, ARG1(1,TAB), NULL, SMP_T_ANY, SMP_T_SINT }, { "table_server_id", sample_conv_table_server_id, ARG1(1,TAB), NULL, SMP_T_ANY, SMP_T_SINT },