From 7429aa9569eca5ea2d4a5af229552324ddbe0955 Mon Sep 17 00:00:00 2001
From: Mark Karpilovskij <mark.karpilovskij@nic.cz>
Date: Mon, 21 Aug 2017 13:42:32 +0200
Subject: [PATCH] journal: refactored boostrap changeset handling

---
 src/knot/journal/journal.c       | 25 ++++------------
 src/knot/journal/serialization.c | 51 +++++---------------------------
 2 files changed, 13 insertions(+), 63 deletions(-)

diff --git a/src/knot/journal/journal.c b/src/knot/journal/journal.c
index 0f36a9a1eb..dfdbdf6e56 100644
--- a/src/knot/journal/journal.c
+++ b/src/knot/journal/journal.c
@@ -768,7 +768,7 @@ static int normal_iterkeycb(iteration_ctx_t *ctx)
 
 /*! \brief Deserialize changeset from chunks (in vals) */
 static int vals_to_changeset(knot_db_val_t *vals, int nvals,
-                             const knot_dname_t *zone_name, changeset_t **ch, bool is_bootstrap)
+                             const knot_dname_t *zone_name, changeset_t **ch)
 {
 	local_array(uint8_t *, valps, nvals)
 	local_array(size_t, vallens, nvals)
@@ -790,8 +790,7 @@ static int vals_to_changeset(knot_db_val_t *vals, int nvals,
 		return KNOT_ENOMEM;
 	}
 
-	int ret = is_bootstrap ? changeset_deserialize_bootstrap(t_ch, valps, vallens, nvals)
-	                       : changeset_deserialize(t_ch, valps, vallens, nvals);
+	int ret = changeset_deserialize(t_ch, valps, vallens, nvals);
 
 	local_array_free(valps)
 	local_array_free(vallens)
@@ -810,7 +809,7 @@ static int load_one_itercb(iteration_ctx_t *ctx)
 		return KNOT_EINVAL;
 	}
 
-	int ret = vals_to_changeset(ctx->val, ctx->chunk_count, ctx->txn->j->zone, &ch, false);
+	int ret = vals_to_changeset(ctx->val, ctx->chunk_count, ctx->txn->j->zone, &ch);
 	if (ret == KNOT_EOK) *targ = ch;
 	return ret;
 }
@@ -820,7 +819,7 @@ static int load_list_itercb(iteration_ctx_t *ctx)
 	changeset_t *ch = NULL;
 	list_t *chlist = *(list_t **) ctx->iter_context;
 
-	int ret = vals_to_changeset(ctx->val, ctx->chunk_count, ctx->txn->j->zone, &ch, false);
+	int ret = vals_to_changeset(ctx->val, ctx->chunk_count, ctx->txn->j->zone, &ch);
 
 	if (ret == KNOT_EOK) {
 		add_tail(chlist, &ch->n);
@@ -888,23 +887,11 @@ int load_bootstrap_iterkeycb(iteration_ctx_t *ctx)
 	return KNOT_EOK;
 }
 
-static int load_bootstrap_itercb(iteration_ctx_t *ctx)
-{
-	changeset_t *ch = NULL, **targ = ctx->iter_context;
-	if (*targ != NULL) {
-		return KNOT_EINVAL;
-	}
-
-	int ret = vals_to_changeset(ctx->val, ctx->chunk_count, ctx->txn->j->zone, &ch, true);
-	if (ret == KNOT_EOK) *targ = ch;
-	return ret;
-}
-
 static int load_bootstrap_changeset(journal_t *j, txn_t *_txn, changeset_t **ch)
 {
 	reuse_txn(txn, j, _txn, false);
 	changeset_t *rch = NULL;
-	iterate(j, txn, load_bootstrap_itercb, JOURNAL_ITERATION_CHANGESETS, &rch,
+	iterate(j, txn, load_one_itercb, JOURNAL_ITERATION_CHANGESETS, &rch,
 	        0, 0, load_bootstrap_iterkeycb);
 	unreuse_txn(txn, _txn);
 	if (txn->ret == KNOT_EOK) {
@@ -1176,7 +1163,7 @@ static int merge_itercb(iteration_ctx_t *ctx)
 {
 	changeset_t *ch = NULL, *mch = *(changeset_t **)ctx->iter_context;
 
-	int ret = vals_to_changeset(ctx->val, ctx->chunk_count, ctx->txn->j->zone, &ch, false);
+	int ret = vals_to_changeset(ctx->val, ctx->chunk_count, ctx->txn->j->zone, &ch);
 	if (ret == KNOT_EOK) {
 		ret = changeset_merge(mch, ch);
 		changeset_free(ch);
diff --git a/src/knot/journal/serialization.c b/src/knot/journal/serialization.c
index 5e10ab8f3b..4370865b39 100644
--- a/src/knot/journal/serialization.c
+++ b/src/knot/journal/serialization.c
@@ -336,50 +336,13 @@ int changeset_deserialize(changeset_t *ch, uint8_t *src_chunks[],
 		}
 	}
 
-	return wire.error;
-}
-
-int changeset_deserialize_bootstrap(changeset_t *ch, uint8_t *src_chunks[],
-                                    const size_t *chunks_sizes, size_t chunks_count)
-{
-	if (ch == NULL || src_chunks == NULL || chunks_sizes == NULL ||
-	    chunks_count == 0) {
-		return KNOT_EINVAL;
-	}
-
-	size_t cur_chunk = 0;
-	wire_ctx_t wire = wire_ctx_init_const(src_chunks[0], chunks_sizes[0]);
-
-	// Deserialize SOA 'to'.
-	knot_rrset_t rrset;
-	int ret = deserialize_rrset_chunks(&wire, &rrset, src_chunks, chunks_sizes,
-	                                   chunks_count, &cur_chunk);
-	if (ret != KNOT_EOK) {
-		return ret;
-	}
-	assert(rrset.type == KNOT_RRTYPE_SOA);
-
-	ch->soa_from = NULL;
-	ch->soa_to = knot_rrset_copy(&rrset, NULL);
-	knot_rrset_clear(&rrset, NULL);
-	if (ch->soa_to == NULL) {
-		return KNOT_ENOMEM;
-	}
-
-	// Read remaining RRSets.
-	while (cur_chunk < chunks_count - 1 || wire_ctx_available(&wire) > 0) {
-		// Parse next RRSet.
-		ret = deserialize_rrset_chunks(&wire, &rrset, src_chunks, chunks_sizes,
-		                               chunks_count, &cur_chunk);
-		if (ret != KNOT_EOK) {
-			break;
-		}
-		assert(rrset.type != KNOT_RRTYPE_SOA);
-		ret = changeset_add_addition(ch, &rrset, 0);
-		knot_rrset_clear(&rrset, NULL);
-		if (ret != KNOT_EOK) {
-			return ret;
-		}
+	// If there was only one SOA record, we are in the bootstrap changeset.
+	if (in_remove_section) {
+		ch->soa_to = ch->soa_from;
+		ch->soa_from = NULL;
+		zone_contents_t *tmp = ch->add;
+		ch->add = ch->remove;
+		ch->remove = tmp;
 	}
 
 	return wire.error;
-- 
GitLab