[PATCH] xlog: get rid of xlog_meta::has_prev_vclock

Vladimir Davydov vdavydov.dev at gmail.com
Tue Jul 10 19:28:24 MSK 2018


Introduce vclock_is_set() helper and use it on xlog_meta::prev_vclock
instead.

Follow-up ac90b498d1b0 ("xlog: store prev vclock in xlog header").
---
https://github.com/tarantool/tarantool/commits/dv/wal-make-new-xlog-on-shutdown-follow-up

 src/box/recovery.cc |  2 +-
 src/box/vclock.h    | 21 +++++++++++++++
 src/box/vy_run.c    | 14 +++++-----
 src/box/xlog.c      | 78 +++++++++++++++++++++++++++++++----------------------
 src/box/xlog.h      | 14 ++++++++--
 5 files changed, 86 insertions(+), 43 deletions(-)

diff --git a/src/box/recovery.cc b/src/box/recovery.cc
index 2cab8308..f0b85a53 100644
--- a/src/box/recovery.cc
+++ b/src/box/recovery.cc
@@ -154,7 +154,7 @@ recovery_open_log(struct recovery *r, const struct vclock *vclock)
 	}
 
 	if (state != XLOG_CURSOR_NEW &&
-	    r->cursor.meta.has_prev_vclock &&
+	    vclock_is_set(&r->cursor.meta.prev_vclock) &&
 	    vclock_compare(&r->cursor.meta.prev_vclock, &meta.vclock) != 0) {
 		/*
 		 * WALs are missing between the last scanned WAL
diff --git a/src/box/vclock.h b/src/box/vclock.h
index 3cd60102..be835360 100644
--- a/src/box/vclock.h
+++ b/src/box/vclock.h
@@ -118,6 +118,27 @@ vclock_create(struct vclock *vclock)
 	memset(vclock, 0, sizeof(*vclock));
 }
 
+/**
+ * Reset a vclock object. After this function is called,
+ * vclock_is_set() will return false.
+ */
+static inline void
+vclock_clear(struct vclock *vclock)
+{
+	memset(vclock, 0, sizeof(*vclock));
+	vclock->signature = -1;
+}
+
+/**
+ * Returns false if the vclock was cleared with vclock_clear(),
+ * true otherwise.
+ */
+static inline bool
+vclock_is_set(const struct vclock *vclock)
+{
+	return vclock->signature >= 0;
+}
+
 static inline int64_t
 vclock_get(const struct vclock *vclock, uint32_t replica_id)
 {
diff --git a/src/box/vy_run.c b/src/box/vy_run.c
index dc837c2b..eae3e74d 100644
--- a/src/box/vy_run.c
+++ b/src/box/vy_run.c
@@ -1960,10 +1960,9 @@ vy_run_write_index(struct vy_run *run, const char *dirpath,
 	say_info("writing `%s'", path);
 
 	struct xlog index_xlog;
-	struct xlog_meta meta = {
-		.filetype = XLOG_META_TYPE_INDEX,
-		.instance_uuid = INSTANCE_UUID,
-	};
+	struct xlog_meta meta;
+	xlog_meta_create(&meta, XLOG_META_TYPE_INDEX, &INSTANCE_UUID,
+			 NULL, NULL);
 	if (xlog_create(&index_xlog, path, 0, &meta) < 0)
 		return -1;
 
@@ -2057,10 +2056,9 @@ vy_run_writer_create_xlog(struct vy_run_writer *writer)
 			    writer->space_id, writer->iid, writer->run->id,
 			    VY_FILE_RUN);
 	say_info("writing `%s'", path);
-	const struct xlog_meta meta = {
-		.filetype = XLOG_META_TYPE_RUN,
-		.instance_uuid = INSTANCE_UUID,
-	};
+	struct xlog_meta meta;
+	xlog_meta_create(&meta, XLOG_META_TYPE_RUN, &INSTANCE_UUID,
+			 NULL, NULL);
 	if (xlog_create(&writer->data_xlog, path, 0, &meta) != 0)
 		return -1;
 	writer->data_xlog.rate_limit = writer->run->env->snap_io_rate_limit;
diff --git a/src/box/xlog.c b/src/box/xlog.c
index 59459b25..5ed11fc8 100644
--- a/src/box/xlog.c
+++ b/src/box/xlog.c
@@ -98,6 +98,24 @@ enum {
 static const char v13[] = "0.13";
 static const char v12[] = "0.12";
 
+void
+xlog_meta_create(struct xlog_meta *meta, const char *filetype,
+		 const struct tt_uuid *instance_uuid,
+		 const struct vclock *vclock,
+		 const struct vclock *prev_vclock)
+{
+	snprintf(meta->filetype, sizeof(meta->filetype), "%s", filetype);
+	meta->instance_uuid = *instance_uuid;
+	if (vclock != NULL)
+		vclock_copy(&meta->vclock, vclock);
+	else
+		vclock_clear(&meta->vclock);
+	if (prev_vclock != NULL)
+		vclock_copy(&meta->prev_vclock, prev_vclock);
+	else
+		vclock_clear(&meta->prev_vclock);
+}
+
 /**
  * Format xlog metadata into @a buf of size @a size
  *
@@ -113,21 +131,26 @@ static const char v12[] = "0.12";
 static int
 xlog_meta_format(const struct xlog_meta *meta, char *buf, int size)
 {
-	char *vstr = vclock_to_string(&meta->vclock);
-	if (vstr == NULL)
-		return -1;
-	char *instance_uuid = tt_uuid_str(&meta->instance_uuid);
 	int total = 0;
 	SNPRINT(total, snprintf, buf, size,
 		"%s\n"
 		"%s\n"
 		VERSION_KEY ": %s\n"
-		INSTANCE_UUID_KEY ": %s\n"
-		VCLOCK_KEY ": %s\n",
-		meta->filetype, v13, PACKAGE_VERSION, instance_uuid, vstr);
-	free(vstr);
-	if (meta->has_prev_vclock) {
-		vstr = vclock_to_string(&meta->prev_vclock);
+		INSTANCE_UUID_KEY ": %s\n",
+		meta->filetype, v13, PACKAGE_VERSION,
+		tt_uuid_str(&meta->instance_uuid));
+	if (vclock_is_set(&meta->vclock)) {
+		char *vstr = vclock_to_string(&meta->vclock);
+		if (vstr == NULL)
+			return -1;
+		SNPRINT(total, snprintf, buf, size,
+			VCLOCK_KEY ": %s\n", vstr);
+		free(vstr);
+	}
+	if (vclock_is_set(&meta->prev_vclock)) {
+		char *vstr = vclock_to_string(&meta->prev_vclock);
+		if (vstr == NULL)
+			return -1;
 		SNPRINT(total, snprintf, buf, size,
 			PREV_VCLOCK_KEY ": %s\n", vstr);
 		free(vstr);
@@ -214,6 +237,9 @@ xlog_meta_parse(struct xlog_meta *meta, const char **data,
 		return -1;
 	}
 
+	vclock_clear(&meta->vclock);
+	vclock_clear(&meta->prev_vclock);
+
 	/*
 	 * Parse "key: value" pairs
 	 */
@@ -263,7 +289,6 @@ xlog_meta_parse(struct xlog_meta *meta, const char **data,
 			 */
 			if (parse_vclock(val, val_end, &meta->prev_vclock) != 0)
 				return -1;
-			meta->has_prev_vclock = true;
 		} else if (memcmp(key, VERSION_KEY, key_end - key) == 0) {
 			/* Ignore Version: for now */
 		} else {
@@ -748,7 +773,8 @@ xlog_create(struct xlog *xlog, const char *name, int flags,
 	int meta_len;
 
 	/*
-	 * Check that the file without .inprogress suffix doesn't exist.
+	 * Check whether a file with this name already exists.
+	 * We don't overwrite existing files.
 	 */
 	if (access(name, F_OK) == 0) {
 		errno = EEXIST;
@@ -905,35 +931,23 @@ int
 xdir_create_xlog(struct xdir *dir, struct xlog *xlog,
 		 const struct vclock *vclock)
 {
-	char *filename;
 	int64_t signature = vclock_sum(vclock);
-	struct xlog_meta meta;
 	assert(signature >= 0);
 	assert(!tt_uuid_is_nil(dir->instance_uuid));
 
 	/*
-	* Check whether a file with this name already exists.
-	* We don't overwrite existing files.
-	*/
-	filename = xdir_format_filename(dir, signature, NONE);
-
-	/* Setup inherited values */
-	snprintf(meta.filetype, sizeof(meta.filetype), "%s", dir->filetype);
-	meta.instance_uuid = *dir->instance_uuid;
-	vclock_copy(&meta.vclock, vclock);
-
-	/*
 	 * For WAL dir: store vclock of the previous xlog file
 	 * to check for gaps on recovery.
 	 */
-	if (dir->type == XLOG && !vclockset_empty(&dir->index)) {
-		vclock_copy(&meta.prev_vclock, vclockset_last(&dir->index));
-		meta.has_prev_vclock = true;
-	} else {
-		vclock_create(&meta.prev_vclock);
-		meta.has_prev_vclock = false;
-	}
+	const struct vclock *prev_vclock = NULL;
+	if (dir->type == XLOG && !vclockset_empty(&dir->index))
+		prev_vclock = vclockset_last(&dir->index);
+
+	struct xlog_meta meta;
+	xlog_meta_create(&meta, dir->filetype, dir->instance_uuid,
+			 vclock, prev_vclock);
 
+	char *filename = xdir_format_filename(dir, signature, NONE);
 	if (xlog_create(xlog, filename, dir->open_wflags, &meta) != 0)
 		return -1;
 
diff --git a/src/box/xlog.h b/src/box/xlog.h
index d27e38e6..476105c2 100644
--- a/src/box/xlog.h
+++ b/src/box/xlog.h
@@ -246,10 +246,20 @@ struct xlog_meta {
 	 * directory for missing WALs.
 	 */
 	struct vclock prev_vclock;
-	/** Set if @prev_vclock is present. */
-	bool has_prev_vclock;
 };
 
+/**
+ * Initialize xlog meta struct.
+ *
+ * @vclock and @prev_vclock are optional: if the value is NULL,
+ * the key won't be written to the xlog header.
+ */
+void
+xlog_meta_create(struct xlog_meta *meta, const char *filetype,
+		 const struct tt_uuid *instance_uuid,
+		 const struct vclock *vclock,
+		 const struct vclock *prev_vclock);
+
 /* }}} */
 
 /**
-- 
2.11.0




More information about the Tarantool-patches mailing list