Tarantool development patches archive
 help / color / mirror / Atom feed
From: Vladimir Davydov <vdavydov.dev@gmail.com>
To: kostja@tarantool.org
Cc: tarantool-patches@freelists.org
Subject: [PATCH 2/4] vinyl: use rlist for iterating over objects recovered from vylog
Date: Tue, 27 Mar 2018 18:03:01 +0300	[thread overview]
Message-ID: <55b2af4c04bd950732973b4a3181db565fe42733.1522162296.git.vdavydov.dev@gmail.com> (raw)
In-Reply-To: <cover.1522162296.git.vdavydov.dev@gmail.com>
In-Reply-To: <cover.1522162296.git.vdavydov.dev@gmail.com>

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

  parent reply	other threads:[~2018-03-27 15:03 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-27 15:02 [PATCH 0/4] Introduce VY_LOG_PREPARE_LSM vylog record Vladimir Davydov
2018-03-27 15:03 ` [PATCH 1/4] index: add abort_create virtual method Vladimir Davydov
2018-03-27 15:03 ` Vladimir Davydov [this message]
2018-03-27 15:03 ` [PATCH 3/4] vinyl: fix discrepancy between vy_log.tx_size and actual tx len Vladimir Davydov
2018-03-27 15:03 ` [PATCH 4/4] vinyl: log new index before WAL write on DDL Vladimir Davydov

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55b2af4c04bd950732973b4a3181db565fe42733.1522162296.git.vdavydov.dev@gmail.com \
    --to=vdavydov.dev@gmail.com \
    --cc=kostja@tarantool.org \
    --cc=tarantool-patches@freelists.org \
    --subject='Re: [PATCH 2/4] vinyl: use rlist for iterating over objects recovered from vylog' \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox