Control: forwarded -1 https://gitlab.nic.cz/knot/knot-dns/-/issues/874
Forwarded upstream, for now that SHA can be reversed in Debian with no conflicts (cf. attached).
patch -p1 -R < 2decb9ea3da74d13f54316d86ad9e7f727254164.patch
--- knot-3.3.0.orig/src/knot/common/stats.c
+++ knot-3.3.0/src/knot/common/stats.c
@@ -36,20 +36,15 @@ typedef struct {
FILE *fd;
const list_t *query_modules;
const knot_dname_t *zone;
- unsigned threads;
- int level;
bool zone_emitted;
- bool zone_name_emitted;
- bool module_emitted;
} dump_ctx_t;
#define DUMP_STR(fd, level, name, ...) do { \
- fprintf(fd, "%-.*s"name":\n", level, " ", ##__VA_ARGS__); \
-} while (0)
-
-#define DUMP_CTR(fd, level, name, idx, val) do { \
- fprintf(fd, "%-.*s"name": %"PRIu64"\n", level, " ", idx, val); \
-} while (0)
+ fprintf(fd, "%-.*s"name": %s\n", level, " ", ##__VA_ARGS__); \
+ } while (0)
+#define DUMP_CTR(fd, level, name, ...) do { \
+ fprintf(fd, "%-.*s"name": %"PRIu64"\n", level, " ", ##__VA_ARGS__); \
+ } while (0)
static uint64_t server_zone_count(server_t *server)
{
@@ -86,78 +81,31 @@ uint64_t stats_get_counter(uint64_t **st
return res;
}
-static void dump_common(dump_ctx_t *ctx, knotd_mod_t *mod)
-{
- // Dump zone name.
- if (ctx->zone != NULL) {
- // Prevent from zone section override.
- if (!ctx->zone_emitted) {
- ctx->level = 0;
- DUMP_STR(ctx->fd, ctx->level++, "zone");
- ctx->zone_emitted = true;
- }
-
- if (!ctx->zone_name_emitted) {
- ctx->level = 1;
- knot_dname_txt_storage_t name;
- if (knot_dname_to_str(name, ctx->zone, sizeof(name)) ==
NULL) {
- return;
- }
- DUMP_STR(ctx->fd, ctx->level++, "\"%s\"", name);
- ctx->zone_name_emitted = true;
- }
- }
-
- if (!ctx->module_emitted) {
- DUMP_STR(ctx->fd, ctx->level++, "%s", mod->id->name + 1);
- ctx->module_emitted = true;
- }
-}
-
-static void dump_counter(dump_ctx_t *ctx, knotd_mod_t *mod, mod_ctr_t *ctr)
-{
- uint64_t counter = stats_get_counter(mod->stats_vals, ctr->offset,
ctx->threads);
- if (counter == 0) {
- // Skip empty counter.
- return;
- }
-
- dump_common(ctx, mod);
-
- DUMP_CTR(ctx->fd, ctx->level, "%s", ctr->name, counter);
-}
-
-static void dump_counters(dump_ctx_t *ctx, knotd_mod_t *mod, mod_ctr_t *ctr)
+static void dump_counters(FILE *fd, int level, mod_ctr_t *ctr, uint64_t
**stats_vals, unsigned threads)
{
- bool counter_emitted = false;
for (uint32_t j = 0; j < ctr->count; j++) {
- uint64_t counter = stats_get_counter(mod->stats_vals,
ctr->offset + j, ctx->threads);
+ uint64_t counter = stats_get_counter(stats_vals, ctr->offset +
j, threads);
+
+ // Skip empty counters.
if (counter == 0) {
- // Skip empty counter.
continue;
}
- dump_common(ctx, mod);
-
- if (!counter_emitted) {
- DUMP_STR(ctx->fd, ctx->level, "%s", ctr->name);
- counter_emitted = true;
- }
-
if (ctr->idx_to_str != NULL) {
char *str = ctr->idx_to_str(j, ctr->count);
if (str != NULL) {
- DUMP_CTR(ctx->fd, ctx->level + 1, "%s", str,
counter);
+ DUMP_CTR(fd, level, "%s", str, counter);
free(str);
}
} else {
- DUMP_CTR(ctx->fd, ctx->level + 1, "%u", j, counter);
+ DUMP_CTR(fd, level, "%u", j, counter);
}
}
}
static void dump_modules(dump_ctx_t *ctx)
{
+ int level = 0;
knotd_mod_t *mod;
WALK_LIST(mod, *ctx->query_modules) {
// Skip modules without statistics.
@@ -165,12 +113,28 @@ static void dump_modules(dump_ctx_t *ctx
continue;
}
- if (ctx->threads == 0) {
- ctx->threads = knotd_mod_threads(mod);
+ // Dump zone name.
+ if (ctx->zone != NULL) {
+ // Prevent from zone section override.
+ if (!ctx->zone_emitted) {
+ DUMP_STR(ctx->fd, 0, "zone", "");
+ ctx->zone_emitted = true;
+ }
+ level = 1;
+
+ knot_dname_txt_storage_t name;
+ if (knot_dname_to_str(name, ctx->zone, sizeof(name)) ==
NULL) {
+ return;
+ }
+ DUMP_STR(ctx->fd, level++, "\"%s\"", name, "");
+ } else {
+ level = 0;
}
+ unsigned threads = knotd_mod_threads(mod);
+
// Dump module counters.
- ctx->module_emitted = false;
+ DUMP_STR(ctx->fd, level, "%s", mod->id->name + 1, "");
for (int i = 0; i < mod->stats_count; i++) {
mod_ctr_t *ctr = mod->stats_info + i;
if (ctr->name == NULL) {
@@ -179,10 +143,13 @@ static void dump_modules(dump_ctx_t *ctx
}
if (ctr->count == 1) {
// Simple counter.
- dump_counter(ctx, mod, ctr);
+ uint64_t counter =
stats_get_counter(mod->stats_vals,
+
ctr->offset, threads);
+ DUMP_CTR(ctx->fd, level + 1, "%s", ctr->name,
counter);
} else {
// Array of counters.
- dump_counters(ctx, mod, ctr);
+ DUMP_STR(ctx->fd, level + 1, "%s", ctr->name,
"");
+ dump_counters(ctx->fd, level + 2, ctr,
mod->stats_vals, threads);
}
}
}
@@ -196,7 +163,6 @@ static void zone_stats_dump(zone_t *zone
ctx->query_modules = &zone->query_modules;
ctx->zone = zone->name;
- ctx->zone_name_emitted = false;
dump_modules(ctx);
}
@@ -221,17 +187,17 @@ static void dump_to_file(conf_t *conf, F
"identity: %s\n",
date, ident);
+ // Dump server statistics.
+ DUMP_STR(fd, 0, "server", "");
+ for (const stats_item_t *item = server_stats; item->name != NULL;
item++) {
+ DUMP_CTR(fd, 1, "%s", item->name, item->server_val(server));
+ }
+
dump_ctx_t ctx = {
.fd = fd,
.query_modules = conf->query_modules,
};
- // Dump server statistics.
- DUMP_STR(ctx.fd, ctx.level, "server");
- for (const stats_item_t *item = server_stats; item->name != NULL;
item++) {
- DUMP_CTR(ctx.fd, ctx.level + 1, "%s", item->name,
item->server_val(server));
- }
-
// Dump global statistics.
dump_modules(&ctx);
signature.asc
Description: PGP signature

