From 4f8d428861604bf32a48ab255e7d1b2991c0e87c Mon Sep 17 00:00:00 2001
From: Libor Peltan <libor.peltan@nic.cz>
Date: Thu, 6 Jan 2022 12:12:11 +0100
Subject: [PATCH] timers: remove unneeded last nsec3 resalt

---
 scripts/timerdb-info.py                |  2 +-
 src/knot/dnssec/kasp/kasp_db.c         | 24 ++++++++++++-----------
 src/knot/events/handlers/dnssec.c      |  4 ----
 src/knot/events/handlers/nsec3resalt.c |  1 -
 src/knot/events/replan.c               |  9 +++++++--
 src/knot/zone/timers.c                 | 27 ++++++++++++--------------
 src/knot/zone/timers.h                 |  3 +--
 tests/knot/test_zone_timers.c          |  4 +---
 8 files changed, 35 insertions(+), 39 deletions(-)

diff --git a/scripts/timerdb-info.py b/scripts/timerdb-info.py
index cc503fddb6..419c850d08 100755
--- a/scripts/timerdb-info.py
+++ b/scripts/timerdb-info.py
@@ -48,7 +48,7 @@ class TimerDBInfo:
                 0x82: ("last_refresh",   cls.format_timestamp),
                 0x83: ("next_refresh",   cls.format_timestamp),
                 # knot >= 2.6
-                0x84: ("last_resalt",    cls.format_timestamp),
+                0x84: ("legacy_resalt",  cls.format_timestamp),
                 0x85: ("next_ds_check",  cls.format_timestamp),
                 # knot >= 2.8
                 0x86: ("next_ds_push",   cls.format_timestamp),
diff --git a/src/knot/dnssec/kasp/kasp_db.c b/src/knot/dnssec/kasp/kasp_db.c
index e8877fc723..c39f503e14 100644
--- a/src/knot/dnssec/kasp/kasp_db.c
+++ b/src/knot/dnssec/kasp/kasp_db.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2022 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -376,24 +376,26 @@ int kasp_db_load_nsec3salt(knot_lmdb_db_t *db, const knot_dname_t *zone_name,
 {
 	MDB_val key = make_key_str(KASPDBKEY_NSEC3SALT, zone_name, NULL);
 	knot_lmdb_txn_t txn = { 0 };
-	memset(nsec3salt, 0, sizeof(*nsec3salt));
 	knot_lmdb_begin(db, &txn, false);
-	if (knot_lmdb_find(&txn, &key, KNOT_LMDB_EXACT | KNOT_LMDB_FORCE)) {
-		nsec3salt->size = txn.cur_val.mv_size;
-		nsec3salt->data = malloc(txn.cur_val.mv_size + 1); // +1 because it can be zero
-		if (nsec3salt->data == NULL) {
-			txn.ret = KNOT_ENOMEM;
-		} else {
-			memcpy(nsec3salt->data, txn.cur_val.mv_data, txn.cur_val.mv_size);
+	if (nsec3salt != NULL) {
+		memset(nsec3salt, 0, sizeof(*nsec3salt));
+		if (knot_lmdb_find(&txn, &key, KNOT_LMDB_EXACT | KNOT_LMDB_FORCE)) {
+			nsec3salt->size = txn.cur_val.mv_size;
+			nsec3salt->data = malloc(txn.cur_val.mv_size + 1); // +1 because it can be zero
+			if (nsec3salt->data == NULL) {
+				txn.ret = KNOT_ENOMEM;
+			} else {
+				memcpy(nsec3salt->data, txn.cur_val.mv_data, txn.cur_val.mv_size);
+			}
 		}
-		*(uint8_t *)key.mv_data = KASPDBKEY_NSEC3TIME;
 	}
+	*(uint8_t *)key.mv_data = KASPDBKEY_NSEC3TIME;
 	if (knot_lmdb_find(&txn, &key, KNOT_LMDB_EXACT | KNOT_LMDB_FORCE)) {
 		knot_lmdb_unmake_curval(&txn, "L", salt_created);
 	}
 	knot_lmdb_abort(&txn);
 	free(key.mv_data);
-	if (txn.ret != KNOT_EOK) {
+	if (txn.ret != KNOT_EOK && nsec3salt != NULL) {
 		free(nsec3salt->data);
 	}
 	return txn.ret;
diff --git a/src/knot/events/handlers/dnssec.c b/src/knot/events/handlers/dnssec.c
index 4b2d9e3fc2..68df1be4f7 100644
--- a/src/knot/events/handlers/dnssec.c
+++ b/src/knot/events/handlers/dnssec.c
@@ -54,10 +54,6 @@ void event_dnssec_reschedule(conf_t *conf, zone_t *zone,
 		zone->timers.next_ds_check = now;
 	}
 
-	if (refresh->last_nsec3resalt) {
-		zone->timers.last_resalt = refresh->last_nsec3resalt;
-	}
-
 	zone_events_schedule_at(zone,
 		ZONE_EVENT_DNSSEC, refresh_at ? (time_t)refresh_at : ignore,
 		ZONE_EVENT_DS_CHECK, refresh->plan_ds_check ? now : ignore,
diff --git a/src/knot/events/handlers/nsec3resalt.c b/src/knot/events/handlers/nsec3resalt.c
index 6375ad0174..5c01d2edfd 100644
--- a/src/knot/events/handlers/nsec3resalt.c
+++ b/src/knot/events/handlers/nsec3resalt.c
@@ -32,7 +32,6 @@ int event_nsec3resalt(conf_t *conf, zone_t *zone)
 	ret = knot_dnssec_nsec3resalt(&kctx, true, &salt_changed, &next_resalt);
 	if (ret == KNOT_EOK && salt_changed != 0) {
 		zone_events_schedule_now(zone, ZONE_EVENT_DNSSEC);
-		zone->timers.last_resalt = kctx.now;
 	}
 
 	kdnssec_ctx_deinit(&kctx);
diff --git a/src/knot/events/replan.c b/src/knot/events/replan.c
index 4c562e1952..7211e2ec5f 100644
--- a/src/knot/events/replan.c
+++ b/src/knot/events/replan.c
@@ -16,6 +16,7 @@
 
 #include <assert.h>
 
+#include "knot/dnssec/kasp/kasp_db.h"
 #include "knot/events/replan.h"
 
 #define TIME_CANCEL 0
@@ -126,12 +127,16 @@ void replan_from_timers(conf_t *conf, zone_t *zone)
 		conf_id_fix_default(&policy);
 		val = conf_id_get(conf, C_POLICY, C_NSEC3, &policy);
 		if (conf_bool(&val)) {
-			if (zone->timers.last_resalt == 0) {
+			knot_time_t last_resalt = 0;
+			if (knot_lmdb_open(zone_kaspdb(zone)) == KNOT_EOK) {
+				(void)kasp_db_load_nsec3salt(zone_kaspdb(zone), zone->name, NULL, &last_resalt);
+			}
+			if (last_resalt == 0) {
 				resalt = now;
 			} else {
 				val = conf_id_get(conf, C_POLICY, C_NSEC3_SALT_LIFETIME, &policy);
 				if (conf_int(&val) > 0) {
-					resalt = zone->timers.last_resalt + conf_int(&val);
+					resalt = last_resalt + conf_int(&val);
 				}
 			}
 		}
diff --git a/src/knot/zone/timers.c b/src/knot/zone/timers.c
index 3c46d78f30..38f6d4e913 100644
--- a/src/knot/zone/timers.c
+++ b/src/knot/zone/timers.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2022 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -48,17 +48,16 @@
  * Valid ID starts with '1' in MSB to avoid conflicts with "old timers".
  */
 enum timer_id {
-	TIMER_INVALID = 0,
-	TIMER_SOA_EXPIRE = 0x80,
-	TIMER_LAST_FLUSH,
-	TIMER_LAST_REFRESH,
-	TIMER_NEXT_REFRESH,
-	TIMER_LAST_RESALT,
-	TIMER_NEXT_DS_CHECK,
-	TIMER_NEXT_DS_PUSH,
-	TIMER_CATALOG_MEMBER,
-	TIMER_LAST_NOTIFIED,
-	TIMER_LAST_REFR_OK,
+	TIMER_INVALID        = 0,
+	TIMER_SOA_EXPIRE     = 0x80,
+	TIMER_LAST_FLUSH     = 0x81,
+	TIMER_LAST_REFRESH   = 0x82,
+	TIMER_NEXT_REFRESH   = 0x83,
+	TIMER_NEXT_DS_CHECK  = 0x85,
+	TIMER_NEXT_DS_PUSH   = 0x86,
+	TIMER_CATALOG_MEMBER = 0x87,
+	TIMER_LAST_NOTIFIED  = 0x88,
+	TIMER_LAST_REFR_OK   = 0x89,
 };
 
 #define TIMER_SIZE (sizeof(uint8_t) + sizeof(uint64_t))
@@ -88,7 +87,6 @@ static int deserialize_timers(zone_timers_t *timers_ptr,
 		case TIMER_NEXT_REFRESH:   timers.next_refresh = value; break;
 		case TIMER_LAST_REFR_OK:   timers.last_refresh_ok = value; break;
 		case TIMER_LAST_NOTIFIED:  timers.last_notified_serial = value; break;
-		case TIMER_LAST_RESALT:    timers.last_resalt = value; break;
 		case TIMER_NEXT_DS_CHECK:  timers.next_ds_check = value; break;
 		case TIMER_NEXT_DS_PUSH:   timers.next_ds_push = value; break;
 		case TIMER_CATALOG_MEMBER: timers.catalog_member = value; break;
@@ -110,14 +108,13 @@ static void txn_write_timers(knot_lmdb_txn_t *txn, const knot_dname_t *zone,
                              const zone_timers_t *timers)
 {
 	MDB_val k = { knot_dname_size(zone), (void *)zone };
-	MDB_val v = knot_lmdb_make_key("BLBLBLBLBLBLBLBLBLBL",
+	MDB_val v = knot_lmdb_make_key("BLBLBLBLBLBLBLBLBL",
 		TIMER_SOA_EXPIRE,    (uint64_t)timers->soa_expire,
 		TIMER_LAST_FLUSH,    (uint64_t)timers->last_flush,
 		TIMER_LAST_REFRESH,  (uint64_t)timers->last_refresh,
 		TIMER_NEXT_REFRESH,  (uint64_t)timers->next_refresh,
 		TIMER_LAST_REFR_OK,  (uint64_t)timers->last_refresh_ok,
 		TIMER_LAST_NOTIFIED, timers->last_notified_serial,
-		TIMER_LAST_RESALT,   (uint64_t)timers->last_resalt,
 		TIMER_NEXT_DS_CHECK, (uint64_t)timers->next_ds_check,
 		TIMER_NEXT_DS_PUSH,  (uint64_t)timers->next_ds_push,
 		TIMER_CATALOG_MEMBER,(uint64_t)timers->catalog_member);
diff --git a/src/knot/zone/timers.h b/src/knot/zone/timers.h
index 0fb619fcb2..aff31959f4 100644
--- a/src/knot/zone/timers.h
+++ b/src/knot/zone/timers.h
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2022 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -33,7 +33,6 @@ struct zone_timers {
 	time_t next_refresh;           //!< Next zone refresh attempt.
 	bool last_refresh_ok;          //!< Last zone refresh attempt was successful.
 	uint64_t last_notified_serial; //!< SOA serial of last successful NOTIFY; (1<<32) if none.
-	time_t last_resalt;            //!< Last NSEC3 resalt.
 	time_t next_ds_check;          //!< Next parent DS check.
 	time_t next_ds_push;           //!< Next DDNS to parent zone with updated DS record.
 	time_t catalog_member;         //!< This catalog member zone created.
diff --git a/tests/knot/test_zone_timers.c b/tests/knot/test_zone_timers.c
index 0c137ac6d8..06637757fd 100644
--- a/tests/knot/test_zone_timers.c
+++ b/tests/knot/test_zone_timers.c
@@ -1,4 +1,4 @@
-/*  Copyright (C) 2021 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
+/*  Copyright (C) 2022 CZ.NIC, z.s.p.o. <knot-dns@labs.nic.cz>
 
     This program is free software: you can redistribute it and/or modify
     it under the terms of the GNU General Public License as published by
@@ -31,7 +31,6 @@ static const zone_timers_t MOCK_TIMERS = {
 	.next_refresh = 1474559960,
 	.last_notified_serial = 0,
 	.last_flush = 1,
-	.last_resalt = 2,
 	.next_ds_check = 1474559961,
 	.next_ds_push = 1474559962,
 	.catalog_member = 1474559963,
@@ -44,7 +43,6 @@ static bool timers_eq(const zone_timers_t *a, const zone_timers_t *b)
 	       a->next_refresh == b->next_refresh &&
 	       a->last_notified_serial == b->last_notified_serial &&
 	       a->last_flush == b->last_flush &&
-	       a->last_resalt == b->last_resalt &&
 	       a->next_ds_check == b->next_ds_check &&
 	       a->next_ds_push == b->next_ds_push &&
 	       a->catalog_member == b->catalog_member;
-- 
GitLab