[PATCH 2/4] vinyl: use rlist for iterating over objects recovered from vylog

Vladimir Davydov vdavydov.dev at gmail.com
Tue Mar 27 18:03:01 MSK 2018


Currently, we use mh_foreach, but each object is on an rlist, which
suits better for iteration.
---
 src/box/vy_log.c | 52 ++++++++++++++++++++++++----------------------------
 1 file changed, 24 insertions(+), 28 deletions(-)

diff --git a/src/box/vy_log.c b/src/box/vy_log.c
index 626ce122..720c9491 100644
--- a/src/box/vy_log.c
+++ b/src/box/vy_log.c
@@ -1942,39 +1942,37 @@ vy_recovery_new(int64_t signature, bool only_checkpoint)
 	return recovery;
 }
 
-/** Helper to delete mh_i64ptr_t along with all its records. */
-static void
-vy_recovery_delete_hash(struct mh_i64ptr_t *h)
-{
-	mh_int_t i;
-	mh_foreach(h, i)
-		free(mh_i64ptr_node(h, i)->val);
-	mh_i64ptr_delete(h);
-}
-
 void
 vy_recovery_delete(struct vy_recovery *recovery)
 {
-	if (recovery->index_id_hash != NULL) {
-		mh_int_t i;
-		mh_foreach(recovery->index_id_hash, i) {
-			struct vy_lsm_recovery_info *lsm;
-			lsm = mh_i64ptr_node(recovery->index_id_hash, i)->val;
-			free(lsm->key_parts);
-			free(lsm);
+	struct vy_lsm_recovery_info *lsm, *next_lsm;
+	struct vy_range_recovery_info *range, *next_range;
+	struct vy_slice_recovery_info *slice, *next_slice;
+	struct vy_run_recovery_info *run, *next_run;
+
+	rlist_foreach_entry_safe(lsm, &recovery->lsms, in_recovery, next_lsm) {
+		rlist_foreach_entry_safe(range, &lsm->ranges,
+					 in_lsm, next_range) {
+			rlist_foreach_entry_safe(slice, &range->slices,
+						 in_range, next_slice)
+				free(slice);
+			free(range);
 		}
-		mh_i64ptr_delete(recovery->index_id_hash);
+		rlist_foreach_entry_safe(run, &lsm->runs, in_lsm, next_run)
+			free(run);
+		free(lsm->key_parts);
+		free(lsm);
 	}
-	if (recovery->lsm_hash != NULL) {
-		/* Hash entries were deleted along with index_id_hash. */
+	if (recovery->index_id_hash != NULL)
+		mh_i64ptr_delete(recovery->index_id_hash);
+	if (recovery->lsm_hash != NULL)
 		mh_i64ptr_delete(recovery->lsm_hash);
-	}
 	if (recovery->range_hash != NULL)
-		vy_recovery_delete_hash(recovery->range_hash);
+		mh_i64ptr_delete(recovery->range_hash);
 	if (recovery->run_hash != NULL)
-		vy_recovery_delete_hash(recovery->run_hash);
+		mh_i64ptr_delete(recovery->run_hash);
 	if (recovery->slice_hash != NULL)
-		vy_recovery_delete_hash(recovery->slice_hash);
+		mh_i64ptr_delete(recovery->slice_hash);
 	TRASH(recovery);
 	free(recovery);
 }
@@ -2096,10 +2094,8 @@ vy_log_create(const struct vclock *vclock, struct vy_recovery *recovery)
 	struct xlog xlog;
 	xlog_clear(&xlog);
 
-	mh_int_t i;
-	mh_foreach(recovery->index_id_hash, i) {
-		struct vy_lsm_recovery_info *lsm;
-		lsm = mh_i64ptr_node(recovery->index_id_hash, i)->val;
+	struct vy_lsm_recovery_info *lsm;
+	rlist_foreach_entry(lsm, &recovery->lsms, in_recovery) {
 		/*
 		 * Purge dropped LSM trees that are not referenced by runs
 		 * (and thus not needed for garbage collection) from the
-- 
2.11.0




More information about the Tarantool-patches mailing list