From: Vladimir Davydov <vdavydov.dev@gmail.com> To: kostja@tarantool.org Cc: tarantool-patches@freelists.org Subject: [PATCH] xlog: get rid of xlog_meta::has_prev_vclock Date: Tue, 10 Jul 2018 19:28:24 +0300 [thread overview] Message-ID: <34c89840acc5e479cf6a63b34e756116f6a12c29.1531239323.git.vdavydov.dev@gmail.com> (raw) In-Reply-To: <20180705112228.GA23856@chai> 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
next prev parent reply other threads:[~2018-07-10 16:28 UTC|newest] Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-06-29 16:48 [PATCH v2 0/6] Create empty xlog on shutdown Vladimir Davydov 2018-06-29 16:48 ` [PATCH v2 1/6] xlog: store prev vclock in xlog header Vladimir Davydov 2018-07-05 6:49 ` Konstantin Osipov 2018-07-05 6:52 ` Konstantin Osipov 2018-07-05 8:23 ` Vladimir Davydov 2018-07-05 11:22 ` Konstantin Osipov 2018-07-10 16:28 ` Vladimir Davydov [this message] 2018-06-29 16:48 ` [PATCH v2 2/6] xlog: differentiate between closed and never opened cursor Vladimir Davydov 2018-06-29 16:48 ` [PATCH v2 3/6] recovery: make LSN gap check more thorough Vladimir Davydov 2018-06-29 16:48 ` [PATCH v2 4/6] recovery: promote recovery clock even if the WAL is empty Vladimir Davydov 2018-06-29 16:48 ` [PATCH v2 5/6] wal: create empty xlog on shutdown Vladimir Davydov 2018-06-29 16:48 ` [PATCH v2 6/6] error: move XlogGapError to box/error.h 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=34c89840acc5e479cf6a63b34e756116f6a12c29.1531239323.git.vdavydov.dev@gmail.com \ --to=vdavydov.dev@gmail.com \ --cc=kostja@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='Re: [PATCH] xlog: get rid of xlog_meta::has_prev_vclock' \ /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