Merge branch 'fix_journal_rootzone' into 'master'

two journal bugfixes

See merge request knot/knot-dns!1332
This commit is contained in:
Daniel Salzman 2021-07-27 14:28:10 +00:00
commit 81dce74aa5
5 changed files with 44 additions and 7 deletions

View 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,

View 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.
*

View 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)) {
@ -295,8 +303,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 +320,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:

View 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.
*

View 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(&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(&txn, j.zone);
memset(&md, 0, sizeof(md));
}
}