summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid VaĊĦek <david.vasek@nic.cz>2023-10-10 12:55:16 +0200
committerDaniel Salzman <daniel.salzman@nic.cz>2024-06-17 13:40:36 +0200
commit25e80d6f9541efed058296f5027e882bd1cac775 (patch)
treeb42864fb133ec1ea3d190dc438b807365797b42d /src
parenttests-extra: zone/backup -- fix the recently added testing (diff)
downloadknot-25e80d6f9541efed058296f5027e882bd1cac775.tar.xz
knot-25e80d6f9541efed058296f5027e882bd1cac775.zip
refresh: log remote zone serials immediately after incoming transfers are received
Diffstat (limited to 'src')
-rw-r--r--src/knot/events/handlers/refresh.c24
-rw-r--r--src/knot/nameserver/axfr.c2
-rw-r--r--src/knot/nameserver/ixfr.c2
-rw-r--r--src/knot/nameserver/xfr.h6
4 files changed, 27 insertions, 7 deletions
diff --git a/src/knot/events/handlers/refresh.c b/src/knot/events/handlers/refresh.c
index d53683e2b..a0747f667 100644
--- a/src/knot/events/handlers/refresh.c
+++ b/src/knot/events/handlers/refresh.c
@@ -118,7 +118,7 @@ struct refresh_data {
int ret; //!< Error code.
enum state state; //!< Event processing state.
- enum xfr_type xfr_type; //!< Transer type (mostly IXFR versus AXFR).
+ enum xfr_type xfr_type; //!< Transfer type (mostly IXFR versus AXFR).
bool axfr_style_ixfr; //!< Master responded with AXFR-style-IXFR.
knot_rrset_t *initial_soa_copy; //!< Copy of the received initial SOA.
struct xfr_stats stats; //!< Transfer statistics.
@@ -1196,13 +1196,33 @@ static int transfer_consume(knot_layer_t *layer, knot_pkt_t *pkt)
// Transfer completed
if (next == KNOT_STATE_DONE) {
// Log transfer even if we still can fail
+ uint32_t serial;
+ switch (data->xfr_type) {
+ case XFR_TYPE_AXFR:
+ serial = zone_contents_serial(data->axfr.zone);
+ break;
+ case XFR_TYPE_IXFR:
+ serial = knot_soa_serial(data->ixfr.final_soa->rrs.rdata);
+ break;
+ case XFR_TYPE_UPTODATE:
+ if (slave_zone_serial(data->zone, data->conf, &serial) == KNOT_EOK) {
+ break;
+ }
+ // FALLTHROUGH
+ default:
+ serial = 0;
+ }
+ char serial_log[32];
+ (void)snprintf(serial_log, sizeof(serial_log),
+ " remote serial %u,", serial);
xfr_log_finished(data->zone->name,
data->xfr_type == XFR_TYPE_IXFR ||
data->xfr_type == XFR_TYPE_UPTODATE ?
LOG_OPERATION_IXFR : LOG_OPERATION_AXFR,
LOG_DIRECTION_IN, &data->remote->addr,
flags2proto(layer->flags),
- data->remote->key.name, &data->stats);
+ data->remote->key.name,
+ serial_log, &data->stats);
/*
* TODO: Move finialization into finish
diff --git a/src/knot/nameserver/axfr.c b/src/knot/nameserver/axfr.c
index dcd62e9ab..a35a3ae89 100644
--- a/src/knot/nameserver/axfr.c
+++ b/src/knot/nameserver/axfr.c
@@ -121,7 +121,7 @@ static void axfr_answer_finished(knotd_qdata_t *qdata, knot_pkt_t *pkt, int stat
xfr_stats_add(&xfr->stats, pkt->size);
xfr_stats_end(&xfr->stats);
xfr_log_finished(ZONE_NAME(qdata), LOG_OPERATION_AXFR, LOG_DIRECTION_OUT,
- REMOTE(qdata), PROTO(qdata), KEY(qdata), &xfr->stats);
+ REMOTE(qdata), PROTO(qdata), KEY(qdata), "", &xfr->stats);
break;
default:
break;
diff --git a/src/knot/nameserver/ixfr.c b/src/knot/nameserver/ixfr.c
index b57759c45..8a4dd37e8 100644
--- a/src/knot/nameserver/ixfr.c
+++ b/src/knot/nameserver/ixfr.c
@@ -174,7 +174,7 @@ static void ixfr_answer_finished(knotd_qdata_t *qdata, knot_pkt_t *pkt, int stat
xfr_stats_add(&xfr->stats, pkt->size);
xfr_stats_end(&xfr->stats);
xfr_log_finished(ZONE_NAME(qdata), LOG_OPERATION_IXFR, LOG_DIRECTION_OUT,
- REMOTE(qdata), PROTO(qdata), KEY(qdata), &xfr->stats);
+ REMOTE(qdata), PROTO(qdata), KEY(qdata), "", &xfr->stats);
break;
default:
break;
diff --git a/src/knot/nameserver/xfr.h b/src/knot/nameserver/xfr.h
index e6d06b6c1..fe8a7a861 100644
--- a/src/knot/nameserver/xfr.h
+++ b/src/knot/nameserver/xfr.h
@@ -38,12 +38,12 @@ static inline
void xfr_log_finished(const knot_dname_t *zone, log_operation_t op,
log_direction_t dir, const struct sockaddr_storage *remote,
knotd_query_proto_t proto, const knot_dname_t *key_name,
- const struct xfr_stats *stats)
+ const char *serial_log, const struct xfr_stats *stats)
{
ns_log(LOG_INFO, zone, op, dir, remote, proto, false, key_name,
- "%sfinished, %0.2f seconds, %u messages, %u bytes",
+ "%sfinished,%s %0.2f seconds, %u messages, %u bytes",
(proto == KNOTD_QUERY_PROTO_QUIC && dir == LOG_DIRECTION_OUT ? "buffering " : ""),
- time_diff_ms(&stats->begin, &stats->end) / 1000.0,
+ serial_log, time_diff_ms(&stats->begin, &stats->end) / 1000.0,
stats->messages, stats->bytes);
}