]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
journal: bugfix: avoid deleting zero-byte prefix...
authorLibor Peltan <libor.peltan@nic.cz>
Mon, 26 Jul 2021 18:22:01 +0000 (20:22 +0200)
committerLibor Peltan <libor.peltan@nic.cz>
Mon, 26 Jul 2021 18:22:01 +0000 (20:22 +0200)
...when deleting rootzone-related records
because it also deletes global metadata

src/knot/journal/journal_basic.c
src/knot/journal/journal_basic.h
src/knot/journal/journal_metadata.c
src/knot/journal/journal_write.c

index 9874574eab816ccd6bb35e6813dbb0f0ce7b2692..0285630ed34a7c59db55e1f2148e94dc61274bec 100644 (file)
@@ -36,6 +36,19 @@ MDB_val journal_changeset_to_chunk_key(const changeset_t *ch, uint32_t chunk_id)
        }
 }
 
+MDB_val journal_zone_prefix(const knot_dname_t *zone)
+{
+       return knot_lmdb_make_key("NI", zone, (uint32_t)0);
+}
+
+void journal_del_zone(knot_lmdb_txn_t *txn, const knot_dname_t *zone)
+{
+       assert(txn->is_rw);
+       MDB_val prefix = journal_zone_prefix(zone);
+       knot_lmdb_del_prefix(txn, &prefix);
+       free(prefix.mv_data);
+}
+
 void journal_make_header(void *chunk, uint32_t ch_serial_to)
 {
        knot_lmdb_make_key_part(chunk, JOURNAL_HEADER_SIZE, "IILLL", ch_serial_to,
index 02ca5ddf6498d82fefad8a1a56ddee24e42e3e10..11e5f47f62381849f1edfe36bdd8d27e17ee0515 100644 (file)
@@ -58,6 +58,16 @@ MDB_val journal_changeset_id_to_key(bool zone_in_journal, uint32_t serial, const
  */
 MDB_val journal_changeset_to_chunk_key(const changeset_t *ch, uint32_t chunk_id);
 
+/*!
+ * \brief Return a key prefix to operate with all zone-related records.
+ */
+MDB_val journal_zone_prefix(const knot_dname_t *zone);
+
+/*!
+ * \brief Delete all zone-related records from journal with open read-write txn.
+ */
+void journal_del_zone(knot_lmdb_txn_t *txn, const knot_dname_t *zone);
+
 /*!
  * \brief Initialise chunk header.
  *
index 4b468cd87ad375c02444aecd6e68b0cec8432095..3834a1e94e7cc093a1200322d6b765ac77283c19 100644 (file)
@@ -295,8 +295,7 @@ int journal_scrape_with_md(zone_journal_t j, bool check_existence)
        knot_lmdb_begin(j.db, &txn, true);
 
        update_last_inserter(&txn, NULL);
-       MDB_val prefix = { knot_dname_size(j.zone), (void *)j.zone };
-       knot_lmdb_del_prefix(&txn, &prefix);
+       journal_del_zone(&txn, j.zone);
 
        knot_lmdb_commit(&txn);
        return txn.ret;
@@ -313,8 +312,9 @@ int journal_copy_with_md(knot_lmdb_db_t *from, knot_lmdb_db_t *to, const knot_dn
        knot_lmdb_begin(from, &tr, true);
        knot_lmdb_begin(to, &tw, true);
        update_last_inserter(&tr, NULL);
-       MDB_val prefix = { knot_dname_size(zone), (void *)zone };
+       MDB_val prefix = journal_zone_prefix(zone);
        knot_lmdb_copy_prefix(&tr, &tw, &prefix);
+       free(prefix.mv_data);
        knot_lmdb_commit(&tw);
        knot_lmdb_commit(&tr);
 done:
index 7e211c1c30b649a8828c2dc14cf7238d0b060e6e..70ea209756216ebd3aa2b393ca68455c022c9054 100644 (file)
@@ -225,8 +225,7 @@ int journal_insert_zone(zone_journal_t j, const zone_contents_t *z)
        knot_lmdb_begin(j.db, &txn, true);
 
        update_last_inserter(&txn, j.zone);
-       MDB_val prefix = { knot_dname_size(j.zone), (void *)j.zone };
-       knot_lmdb_del_prefix(&txn, &prefix);
+       journal_del_zone(&txn, j.zone);
 
        journal_write_zone(&txn, z);
 
@@ -282,8 +281,7 @@ int journal_insert(zone_journal_t j, const changeset_t *ch, const changeset_t *e
                if (journal_contains(&txn, true, 0, j.zone)) {
                        txn.ret = KNOT_ESEMCHECK;
                } else {
-                       MDB_val prefix = { knot_dname_size(j.zone), (void *)j.zone };
-                       knot_lmdb_del_prefix(&txn, &prefix);
+                       journal_del_zone(&txn, j.zone);
                        memset(&md, 0, sizeof(md));
                }
        }