From c5855b69f6baf4a0dcc8c2a13266e36670a8511d Mon Sep 17 00:00:00 2001 From: Ilia Petrov Date: Mon, 4 May 2026 22:24:41 +0300 Subject: [PATCH 1/4] kv: add flb_kv_get_all_key_values (with a single call items from the mk_list) Signed-off-by: Ilia Petrov --- include/fluent-bit/flb_kv.h | 6 ++++++ src/flb_kv.c | 33 +++++++++++++++++++++++++++++++++ tests/internal/kv.c | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 75 insertions(+) diff --git a/include/fluent-bit/flb_kv.h b/include/fluent-bit/flb_kv.h index 0c4ad82ce1f..8e7c2319eec 100644 --- a/include/fluent-bit/flb_kv.h +++ b/include/fluent-bit/flb_kv.h @@ -30,6 +30,11 @@ struct flb_kv { struct mk_list _head; }; +struct flb_kv_pair { + flb_sds_t key; + flb_sds_t val; +}; + void flb_kv_init(struct mk_list *list); struct flb_kv *flb_kv_item_create_len(struct mk_list *list, char *k_buf, size_t k_len, @@ -41,5 +46,6 @@ struct flb_kv *flb_kv_item_set(struct mk_list *list, void flb_kv_item_destroy(struct flb_kv *kv); void flb_kv_release(struct mk_list *list); const char *flb_kv_get_key_value(const char *key, struct mk_list *list); +struct flb_kv_pair **flb_kv_get_all_key_values(struct mk_list *list); #endif diff --git a/src/flb_kv.c b/src/flb_kv.c index fc3c3545fad..a2a3fecb611 100644 --- a/src/flb_kv.c +++ b/src/flb_kv.c @@ -160,3 +160,36 @@ const char *flb_kv_get_key_value(const char *key, struct mk_list *list) return NULL; } + +struct flb_kv_pair **flb_kv_get_all_key_values(struct mk_list *list) +{ + int count; + int i = 0; + struct mk_list *head; + struct flb_kv *kv; + struct flb_kv_pair **arr; + + if (!list) { + return NULL; + } + + count = mk_list_size(list); + if (count == 0) { + return NULL; + } + + arr = flb_calloc(count, sizeof(struct flb_kv_pair *)); + if (!arr) { + flb_errno(); + return NULL; + } + + mk_list_foreach(head, list) { + kv = mk_list_entry(head, struct flb_kv, _head); + arr[i]->key = kv->key; + arr[i]->val = kv->val; + i++; + } + + return arr; +} diff --git a/tests/internal/kv.c b/tests/internal/kv.c index e20d5184692..88c14dd5c6c 100644 --- a/tests/internal/kv.c +++ b/tests/internal/kv.c @@ -1,6 +1,7 @@ /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ #include +#include #include "flb_tests_internal.h" static void test_kv_item_set_duplicate() @@ -28,7 +29,42 @@ static void test_kv_item_set_duplicate() flb_kv_release(&list); } +static void test_kv_get_all_key_values() +{ + struct mk_list list; + struct flb_kv_pair **pairs; + + flb_kv_init(&list); + + pairs = flb_kv_get_all_key_values(&list); + TEST_CHECK(pairs == NULL); + + flb_kv_item_set(&list, "host", "localhost"); + flb_kv_item_set(&list, "port", "8080"); + flb_kv_item_set(&list, "path", "/api"); + + pairs = flb_kv_get_all_key_values(&list); + TEST_CHECK(pairs != NULL); + + if (pairs) { + TEST_CHECK(pairs[0] != NULL); + TEST_CHECK(strcmp(pairs[0]->key, "host") == 0); + TEST_CHECK(strcmp(pairs[0]->val, "localhost") == 0); + + TEST_CHECK(pairs[1] != NULL); + TEST_CHECK(strcmp(pairs[1]->key, "port") == 0); + TEST_CHECK(strcmp(pairs[1]->val, "8080") == 0); + + TEST_CHECK(pairs[2] != NULL); + TEST_CHECK(strcmp(pairs[2]->key, "path") == 0); + TEST_CHECK(strcmp(pairs[2]->val, "/api") == 0); + } + + flb_kv_release(&list); +} + TEST_LIST = { {"kv_item_set_duplicate", test_kv_item_set_duplicate}, + {"kv_get_all_key_values", test_kv_get_all_key_values}, {0} }; From d57b710ed80e64c1356ba228f0e9174ffe413966 Mon Sep 17 00:00:00 2001 From: Ilia Petrov Date: Tue, 5 May 2026 10:28:05 +0300 Subject: [PATCH 2/4] kv: rm struct flb_kv_pair and use the flb_kv Signed-off-by: Ilia Petrov --- include/fluent-bit/flb_kv.h | 7 +------ src/flb_kv.c | 7 +++---- tests/internal/kv.c | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/include/fluent-bit/flb_kv.h b/include/fluent-bit/flb_kv.h index 8e7c2319eec..84aaabe0c41 100644 --- a/include/fluent-bit/flb_kv.h +++ b/include/fluent-bit/flb_kv.h @@ -30,11 +30,6 @@ struct flb_kv { struct mk_list _head; }; -struct flb_kv_pair { - flb_sds_t key; - flb_sds_t val; -}; - void flb_kv_init(struct mk_list *list); struct flb_kv *flb_kv_item_create_len(struct mk_list *list, char *k_buf, size_t k_len, @@ -46,6 +41,6 @@ struct flb_kv *flb_kv_item_set(struct mk_list *list, void flb_kv_item_destroy(struct flb_kv *kv); void flb_kv_release(struct mk_list *list); const char *flb_kv_get_key_value(const char *key, struct mk_list *list); -struct flb_kv_pair **flb_kv_get_all_key_values(struct mk_list *list); +struct flb_kv **flb_kv_get_all_key_values(struct mk_list *list); #endif diff --git a/src/flb_kv.c b/src/flb_kv.c index a2a3fecb611..61883e320ac 100644 --- a/src/flb_kv.c +++ b/src/flb_kv.c @@ -161,13 +161,13 @@ const char *flb_kv_get_key_value(const char *key, struct mk_list *list) return NULL; } -struct flb_kv_pair **flb_kv_get_all_key_values(struct mk_list *list) +struct flb_kv **flb_kv_get_all_key_values(struct mk_list *list) { int count; int i = 0; struct mk_list *head; struct flb_kv *kv; - struct flb_kv_pair **arr; + struct flb_kv **arr; if (!list) { return NULL; @@ -186,8 +186,7 @@ struct flb_kv_pair **flb_kv_get_all_key_values(struct mk_list *list) mk_list_foreach(head, list) { kv = mk_list_entry(head, struct flb_kv, _head); - arr[i]->key = kv->key; - arr[i]->val = kv->val; + arr[i] = kv; i++; } diff --git a/tests/internal/kv.c b/tests/internal/kv.c index 88c14dd5c6c..42dd554a90e 100644 --- a/tests/internal/kv.c +++ b/tests/internal/kv.c @@ -32,7 +32,7 @@ static void test_kv_item_set_duplicate() static void test_kv_get_all_key_values() { struct mk_list list; - struct flb_kv_pair **pairs; + struct flb_kv **pairs; flb_kv_init(&list); From 80587697f3a3c451da1a5a5211e49abde57ee223 Mon Sep 17 00:00:00 2001 From: Ilia Petrov Date: Tue, 5 May 2026 10:34:59 +0300 Subject: [PATCH 3/4] kv: missed use of flb_kv_pairn Signed-off-by: Ilia Petrov --- src/flb_kv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/flb_kv.c b/src/flb_kv.c index 61883e320ac..08aa5946a09 100644 --- a/src/flb_kv.c +++ b/src/flb_kv.c @@ -178,7 +178,7 @@ struct flb_kv **flb_kv_get_all_key_values(struct mk_list *list) return NULL; } - arr = flb_calloc(count, sizeof(struct flb_kv_pair *)); + arr = flb_calloc(count, sizeof(struct flb_kv *)); if (!arr) { flb_errno(); return NULL; From e1603f80326367c8eedea366a4e36928b97a9c72 Mon Sep 17 00:00:00 2001 From: Ilia Petrov Date: Tue, 5 May 2026 18:17:06 +0300 Subject: [PATCH 4/4] tests: add flb_free as suggested from codex Signed-off-by: Ilia Petrov --- tests/internal/kv.c | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/internal/kv.c b/tests/internal/kv.c index 42dd554a90e..b95ba198e90 100644 --- a/tests/internal/kv.c +++ b/tests/internal/kv.c @@ -61,6 +61,7 @@ static void test_kv_get_all_key_values() } flb_kv_release(&list); + flb_free(pairs); } TEST_LIST = {