]> git.ipfire.org Git - thirdparty/knot-dns.git/commitdiff
journal: preserve occupation computation when purging zone while writing it
authorLibor Peltan <libor.peltan@nic.cz>
Tue, 27 Jul 2021 11:52:27 +0000 (13:52 +0200)
committerLibor Peltan <libor.peltan@nic.cz>
Tue, 27 Jul 2021 11:52:27 +0000 (13:52 +0200)
src/knot/journal/journal_metadata.c
src/knot/journal/journal_metadata.h
src/knot/journal/journal_write.c

index 3834a1e94e7cc093a1200322d6b765ac77283c19..213ae510e21009f860349d6720829e75f9994d8c 100644 (file)
@@ -286,6 +286,14 @@ void journal_metadata_after_extra(journal_metadata_t *md, uint32_t serial, uint3
        md->flags |= (JOURNAL_MERGED_SERIAL_VALID | JOURNAL_LAST_FLUSHED_VALID);
 }
 
+void journal_del_zone_txn(knot_lmdb_txn_t *txn, const knot_dname_t *zone)
+{
+       uint64_t md_occupied = 0;
+       (void)get_metadata64(txn, zone, "occupied", &md_occupied);
+       journal_del_zone(txn, zone);
+       set_metadata(txn, zone, "occupied", &md_occupied, sizeof(md_occupied), true);
+}
+
 int journal_scrape_with_md(zone_journal_t j, bool check_existence)
 {
        if (check_existence && !journal_is_existing(j)) {
index 6400b9cd79655d5e9b3883b27daa35ebf687d4dc..246d89973e2799662115aa8cf3f24174f42de06c 100644 (file)
@@ -111,6 +111,14 @@ void journal_metadata_after_insert(journal_metadata_t *md, uint32_t serial, uint
  */
 void journal_metadata_after_extra(journal_metadata_t *md, uint32_t serial, uint32_t serial_to);
 
+/*!
+ * \brief Delete all zone records in a txn that will later write to the same zone.
+ *
+ * \note The difference against journal_del_zone(), which purges even metadata, incl "occupied".
+ * \note This preserves keeping track of space occupied/freed by this zone.
+ */
+void journal_del_zone_txn(knot_lmdb_txn_t *txn, const knot_dname_t *zone);
+
 /*!
  * \brief Completely delete all journal records belonging to this zone, including metadata.
  *
index 70ea209756216ebd3aa2b393ca68455c022c9054..86cb281aef6ab1dac0efca62f4fe77e4b1167f42 100644 (file)
@@ -225,7 +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);
-       journal_del_zone(&txn, j.zone);
+       journal_del_zone_txn(&txn, j.zone);
 
        journal_write_zone(&txn, z);
 
@@ -281,7 +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 {
-                       journal_del_zone(&txn, j.zone);
+                       journal_del_zone_txn(&txn, j.zone);
                        memset(&md, 0, sizeof(md));
                }
        }