From 94ad27de1f8c13b837582019247de31182cd26a4 Mon Sep 17 00:00:00 2001
From: Jan Kadlec <jan.kadlec@nic.cz>
Date: Tue, 8 Apr 2014 16:50:40 +0200
Subject: [PATCH] new_node: Added more comments for changeset processing.

---
 src/knot/updates/xfr-in.c | 27 +++++++++++++++++++++++----
 1 file changed, 23 insertions(+), 4 deletions(-)

diff --git a/src/knot/updates/xfr-in.c b/src/knot/updates/xfr-in.c
index a74fdcfda..f218ca071 100644
--- a/src/knot/updates/xfr-in.c
+++ b/src/knot/updates/xfr-in.c
@@ -44,6 +44,11 @@
 
 static void rrs_list_clear(list_t *l, mm_ctx_t *mm)
 {
+	/*
+	 * Frees data that are in the tree that will not be used, these are:
+	 *  - actual data inside knot_rrs_t. (the rest is part of the node)
+	 *  - arrays allocated for additional nodes. (nodes are kept)
+	 */
 	ptrnode_t *n;
 	node_t *nxt;
 	WALK_LIST_DELSAFE(n, nxt, *l) {
@@ -670,6 +675,7 @@ void xfrin_rollback_update(knot_changesets_t *chgs,
 static int xfrin_replace_rrs_with_copy(knot_node_t *node,
                                        uint16_t type)
 {
+	// Find data to copy.
 	struct rr_data *data = NULL;
 	for (uint16_t i = 0; i < node->rrset_count; ++i) {
 		if (node->rrs[i].type == type) {
@@ -677,6 +683,8 @@ static int xfrin_replace_rrs_with_copy(knot_node_t *node,
 		}
 	}
 	assert(data);
+
+	// Create new data.
 	knot_rrs_t *rrs = &data->rrs;
 	void *copy = malloc(knot_rrs_size(rrs));
 	if (copy == NULL) {
@@ -685,8 +693,12 @@ static int xfrin_replace_rrs_with_copy(knot_node_t *node,
 
 	memcpy(copy, rrs->data, knot_rrs_size(rrs));
 
-	// Clear additional from node in new tree.
+	/*
+	 * Clear additional array from node in new tree. It's callers
+	 * responsibility to store it for cleanup.
+	 */
 	data->additional = NULL;
+	// Store new data into node RRS.
 	rrs->data = copy;
 
 	return KNOT_EOK;
@@ -703,10 +715,12 @@ static void clear_new_rrs(knot_node_t *node, uint16_t type)
 static bool can_remove(const knot_node_t *node, const knot_rrset_t *rr)
 {
 	if (node == NULL) {
+		// Node does not exist, cannot remove anything.
 		return false;
 	}
 	const knot_rrs_t *node_rrs = knot_node_rrs(node, rr->type);
 	if (node_rrs == NULL) {
+		// Node does not have this type at all.
 		return false;
 	}
 
@@ -714,9 +728,12 @@ static bool can_remove(const knot_node_t *node, const knot_rrset_t *rr)
 	for (uint16_t i = 0; i < rr->rrs.rr_count; ++i) {
 		knot_rr_t *rr_cmp = knot_rrs_rr(&rr->rrs, i);
 		if (knot_rrs_member(node_rrs, rr_cmp, compare_ttls)) {
+			// At least one RR matches.
 			return true;
 		}
 	}
+
+	// Node does have the type, but no RRs match.
 	return false;
 }
 
@@ -766,6 +783,7 @@ static int remove_rr(knot_node_t *node, const knot_rrset_t *rr,
 	}
 
 	knot_rrs_t *changed_rrs = knot_node_get_rrs(node, rr->type);
+	// Subtract changeset RRS from node RRS.
 	ret = knot_rrs_subtract(changed_rrs, &rr->rrs, NULL);
 	if (ret != KNOT_EOK) {
 		clear_new_rrs(node, rr->type);
@@ -773,13 +791,14 @@ static int remove_rr(knot_node_t *node, const knot_rrset_t *rr,
 	}
 
 	if (changed_rrs->rr_count > 0) {
+		// Subtraction left some data in RRSet, store it for rollback.
 		ret = add_new_data(chset, changed_rrs->data);
 		if (ret != KNOT_EOK) {
 			knot_rrs_clear(changed_rrs, NULL);
 			return ret;
 		}
 	} else {
-		// Removed last RR in RRSet, remove it from node.
+		// RRSet is empty now, remove it from node, all data freed.
 		knot_node_remove_rrset(node, rr->type);
 	}
 
@@ -823,7 +842,7 @@ static int add_rr(knot_node_t *node, const knot_rrset_t *rr,
 			return ret;
 		}
 
-		// Store old RRS for cleanup.
+		// Store old RRS and additional for cleanup.
 		ret = add_old_data(chset, old_data, old_additional);
 		if (ret != KNOT_EOK) {
 			clear_new_rrs(node, rr->type);
@@ -845,8 +864,8 @@ static int add_rr(knot_node_t *node, const knot_rrset_t *rr,
 		}
 	}
 
+	// Get changed RRS and store for possible rollback.
 	knot_rrs_t *rrs = knot_node_get_rrs(node, rr->type);
-	// Store new RRS for rollback
 	int ret = add_new_data(chset, rrs->data);
 	if (ret != KNOT_EOK) {
 		knot_rrs_clear(rrs, NULL);
-- 
GitLab