From: Vladimir Davydov <vdavydov.dev@gmail.com> To: kostja@tarantool.org Cc: tarantool-patches@freelists.org Subject: [PATCH v2 09/10] wal: pass struct instead of vclock to checkpoint methods Date: Sat, 8 Dec 2018 18:48:13 +0300 [thread overview] Message-ID: <d9a03417f2fff40b5481e5861c911ca50731ccb6.1544282224.git.vdavydov.dev@gmail.com> (raw) In-Reply-To: <cover.1544282224.git.vdavydov.dev@gmail.com> In-Reply-To: <cover.1544282224.git.vdavydov.dev@gmail.com> Currently, we only need to pass a vclock between TX and WAL during checkpointing. However, in order to implement auto-checkpointing triggered when WAL size exceeds a certain threshold, we will need to pass some extra info so that we can properly reset the counter accounting the WAL size in the WAL thread. To make it possible, let's move wal_checkpoint struct, which is used internally by WAL to pass a checkpoint vclock, to the header and require the caller to pass it to wal_begin/commit_checkpoint instead of just a vclock. --- src/box/gc.c | 10 +++++----- src/box/wal.c | 22 ++++++---------------- src/box/wal.h | 20 +++++++++++++++----- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/box/gc.c b/src/box/gc.c index e8074078..6a7e371f 100644 --- a/src/box/gc.c +++ b/src/box/gc.c @@ -355,7 +355,7 @@ static int gc_do_checkpoint(void) { int rc; - struct vclock vclock; + struct wal_checkpoint checkpoint; assert(!gc.checkpoint_is_in_progress); gc.checkpoint_is_in_progress = true; @@ -373,19 +373,19 @@ gc_do_checkpoint(void) rc = engine_begin_checkpoint(); if (rc != 0) goto out; - rc = wal_begin_checkpoint(&vclock); + rc = wal_begin_checkpoint(&checkpoint); if (rc != 0) goto out; - rc = engine_commit_checkpoint(&vclock); + rc = engine_commit_checkpoint(&checkpoint.vclock); if (rc != 0) goto out; - wal_commit_checkpoint(&vclock); + wal_commit_checkpoint(&checkpoint); /* * Finally, track the newly created checkpoint in the garbage * collector state. */ - gc_add_checkpoint(&vclock); + gc_add_checkpoint(&checkpoint.vclock); out: if (rc != 0) engine_abort_checkpoint(); diff --git a/src/box/wal.c b/src/box/wal.c index 644f58c8..8e56e6ae 100644 --- a/src/box/wal.c +++ b/src/box/wal.c @@ -497,12 +497,6 @@ wal_sync(void) cbus_flush(&wal_thread.wal_pipe, &wal_thread.tx_prio_pipe, NULL); } -struct wal_checkpoint -{ - struct cbus_call_msg base; - struct vclock vclock; -}; - static int wal_begin_checkpoint_f(struct cbus_call_msg *data) { @@ -534,11 +528,11 @@ wal_begin_checkpoint_f(struct cbus_call_msg *data) } int -wal_begin_checkpoint(struct vclock *vclock) +wal_begin_checkpoint(struct wal_checkpoint *checkpoint) { struct wal_writer *writer = &wal_writer_singleton; if (writer->wal_mode == WAL_NONE) { - vclock_copy(vclock, &writer->vclock); + vclock_copy(&checkpoint->vclock, &writer->vclock); return 0; } if (!stailq_empty(&writer->rollback)) { @@ -552,15 +546,13 @@ wal_begin_checkpoint(struct vclock *vclock) diag_set(ClientError, ER_CHECKPOINT_ROLLBACK); return -1; } - struct wal_checkpoint msg; bool cancellable = fiber_set_cancellable(false); int rc = cbus_call(&wal_thread.wal_pipe, &wal_thread.tx_prio_pipe, - &msg.base, wal_begin_checkpoint_f, NULL, + &checkpoint->base, wal_begin_checkpoint_f, NULL, TIMEOUT_INFINITY); fiber_set_cancellable(cancellable); if (rc != 0) return -1; - vclock_copy(vclock, &msg.vclock); return 0; } @@ -574,18 +566,16 @@ wal_commit_checkpoint_f(struct cbus_call_msg *data) } void -wal_commit_checkpoint(const struct vclock *vclock) +wal_commit_checkpoint(struct wal_checkpoint *checkpoint) { struct wal_writer *writer = &wal_writer_singleton; if (writer->wal_mode == WAL_NONE) { - vclock_copy(&writer->checkpoint_vclock, vclock); + vclock_copy(&writer->checkpoint_vclock, &checkpoint->vclock); return; } - struct wal_checkpoint msg; - vclock_copy(&msg.vclock, vclock); bool cancellable = fiber_set_cancellable(false); cbus_call(&wal_thread.wal_pipe, &wal_thread.tx_prio_pipe, - &msg.base, wal_commit_checkpoint_f, NULL, + &checkpoint->base, wal_commit_checkpoint_f, NULL, TIMEOUT_INFINITY); fiber_set_cancellable(cancellable); } diff --git a/src/box/wal.h b/src/box/wal.h index 3d616353..2564f718 100644 --- a/src/box/wal.h +++ b/src/box/wal.h @@ -160,16 +160,26 @@ wal_mode(); void wal_sync(void); +struct wal_checkpoint { + struct cbus_call_msg base; + /** + * VClock of the last record written to the rotated WAL. + * This is the vclock that is supposed to be used to + * identify the new checkpoint. + */ + struct vclock vclock; +}; + /** * Prepare WAL for checkpointing. * * This function flushes all pending changes and rotates the - * current WAL. The vclock of the last record written to the - * rotated WAL is returned in @vclock. This is the vclock that - * is supposed to be used to identify the new checkpoint. + * current WAL. Checkpoint info is returned in @checkpoint. + * It is supposed to be passed to wal_commit_checkpoint() + * upon successful checkpoint creation. */ int -wal_begin_checkpoint(struct vclock *vclock); +wal_begin_checkpoint(struct wal_checkpoint *checkpoint); /** * This function is called upon successful checkpoint creation. @@ -177,7 +187,7 @@ wal_begin_checkpoint(struct vclock *vclock); * vclock. */ void -wal_commit_checkpoint(const struct vclock *vclock); +wal_commit_checkpoint(struct wal_checkpoint *checkpoint); /** * Remove WAL files that are not needed by consumers reading -- 2.11.0
next prev parent reply other threads:[~2018-12-08 15:48 UTC|newest] Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top 2018-12-08 15:48 [PATCH v2 00/10] Allow to limit size of WAL files Vladimir Davydov 2018-12-08 15:48 ` [PATCH v2 01/10] gc: do not use WAL watcher API for deactivating stale consumers Vladimir Davydov 2018-12-08 21:41 ` Konstantin Osipov 2018-12-08 15:48 ` [PATCH v2 02/10] wal: simplify watcher API Vladimir Davydov 2018-12-08 21:41 ` Konstantin Osipov 2018-12-08 15:48 ` [PATCH v2 03/10] box: fix certain cfg options initialized twice on recovery Vladimir Davydov 2018-12-08 21:42 ` Konstantin Osipov 2018-12-08 15:48 ` [PATCH v2 04/10] box: don't use box_checkpoint_is_in_progress outside box.cc Vladimir Davydov 2018-12-08 21:43 ` Konstantin Osipov 2018-12-08 15:48 ` [PATCH v2 05/10] box: move checkpointing to gc module Vladimir Davydov 2018-12-08 21:44 ` Konstantin Osipov 2018-12-08 15:48 ` [PATCH v2 06/10] gc: some renames Vladimir Davydov 2018-12-08 21:44 ` Konstantin Osipov 2018-12-08 15:48 ` [PATCH v2 07/10] Introduce checkpoint schedule module Vladimir Davydov 2018-12-08 21:45 ` Konstantin Osipov 2018-12-08 15:48 ` [PATCH v2 08/10] Rewrite checkpoint daemon in C Vladimir Davydov 2018-12-08 21:45 ` Konstantin Osipov 2018-12-08 15:48 ` Vladimir Davydov [this message] 2018-12-08 21:46 ` [PATCH v2 09/10] wal: pass struct instead of vclock to checkpoint methods Konstantin Osipov 2018-12-08 15:48 ` [PATCH v2 10/10] wal: trigger checkpoint if there are too many WALs Vladimir Davydov 2018-12-08 21:48 ` Konstantin Osipov 2018-12-09 11:20 ` [PATCH v2 00/10] Allow to limit size of WAL files 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=d9a03417f2fff40b5481e5861c911ca50731ccb6.1544282224.git.vdavydov.dev@gmail.com \ --to=vdavydov.dev@gmail.com \ --cc=kostja@tarantool.org \ --cc=tarantool-patches@freelists.org \ --subject='Re: [PATCH v2 09/10] wal: pass struct instead of vclock to checkpoint methods' \ /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