Skip to content
Snippets Groups Projects
Commit e67fb21d authored by Libor Peltan's avatar Libor Peltan Committed by Daniel Salzman
Browse files

zone: support for zone-in-journal

parent d5c5703e
No related branches found
No related tags found
No related merge requests found
......@@ -173,6 +173,40 @@ int zone_load_journal(conf_t *conf, zone_t *zone, zone_contents_t *contents)
return ret;
}
int zone_load_from_journal(conf_t *conf, zone_t *zone, zone_contents_t **contents)
{
if (conf == NULL || zone == NULL || contents == NULL) {
return KNOT_EINVAL;
}
list_t chgs;
init_list(&chgs);
int ret = zone_in_journal_load(conf, zone, &chgs);
if (ret != KNOT_EOK) {
changesets_free(&chgs);
return ret; // include ENOENT, which is normal operation
}
changeset_t *boo_ch = (changeset_t *)HEAD(chgs);
rem_node(&boo_ch->n);
*contents = changeset_to_contents(boo_ch);
apply_ctx_t a_ctx = { 0 };
apply_init_ctx(&a_ctx, *contents, 0);
ret = apply_changesets_directly(&a_ctx, &chgs);
if (ret == KNOT_EOK) {
log_zone_info(zone->name, "zone loaded from journal, serial %u",
zone_contents_serial(*contents));
} else {
log_zone_error(zone->name, "failed to load zone from journal (%s)",
knot_strerror(ret));
}
update_cleanup(&a_ctx);
changesets_free(&chgs);
return ret;
}
int zone_load_post(conf_t *conf, zone_t *zone, zone_contents_t *contents,
uint32_t *dnssec_refresh)
{
......
......@@ -42,6 +42,17 @@ int zone_load_contents(conf_t *conf, const knot_dname_t *zone_name,
*/
int zone_load_journal(conf_t *conf, zone_t *zone, zone_contents_t *contents);
/*!
* \brief Load zone contents from journal (headless).
*
* \param conf
* \param zone
* \param contents
* \return KNOT_EOK or an error
*/
int zone_load_from_journal(conf_t *conf, zone_t *zone,
zone_contents_t **contents);
/*!
* \brief Zone loading post-actions (zone resign, calculation of delta)
*
......
......@@ -313,6 +313,25 @@ int zone_changes_load(conf_t *conf, zone_t *zone, list_t *dst, uint32_t from)
return ret;
}
int zone_in_journal_load(conf_t *conf, zone_t *zone, list_t *dst)
{
if (conf == NULL || zone == NULL || dst == NULL) {
return KNOT_EINVAL;
}
int ret = KNOT_ENOENT;
if (journal_exists(zone->journal_db, zone->name)) {
ret = open_journal(zone);
}
if (ret == KNOT_EOK) {
ret = journal_load_bootstrap(zone->journal, dst);
}
return ret;
}
int zone_flush_journal(conf_t *conf, zone_t *zone)
{
if (conf == NULL || zone == NULL) {
......
......@@ -132,6 +132,7 @@ void zone_control_clear(zone_t *zone);
int zone_change_store(conf_t *conf, zone_t *zone, changeset_t *change);
int zone_changes_store(conf_t *conf, zone_t *zone, list_t *chgs);
int zone_changes_load(conf_t *conf, zone_t *zone, list_t *dst, uint32_t from);
int zone_in_journal_load(conf_t *conf, zone_t *zone, list_t *dst);
/*! \brief Synchronize zone file with journal. */
int zone_flush_journal(conf_t *conf, zone_t *zone);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment