From 69098070685d4cf96c48b5f7f62f5d9c0f8b7823 Mon Sep 17 00:00:00 2001 From: Vitaliy Filippov Date: Sat, 10 Apr 2021 02:23:55 +0300 Subject: [PATCH] Allow to start the OSD just to flush the journal completely --- src/blockstore_flush.cpp | 10 ++++++++-- src/blockstore_impl.cpp | 15 ++++++++++++++- src/blockstore_journal.h | 1 + src/blockstore_open.cpp | 7 ++++++- 4 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/blockstore_flush.cpp b/src/blockstore_flush.cpp index 15f3afa3..b3920a7f 100644 --- a/src/blockstore_flush.cpp +++ b/src/blockstore_flush.cpp @@ -17,8 +17,8 @@ journal_flusher_t::journal_flusher_t(blockstore_impl_t *bs) // FIXME: allow to configure flusher_start_threshold and journal_trim_interval flusher_start_threshold = bs->journal_block_size / sizeof(journal_entry_stable); journal_trim_interval = 512; - journal_trim_counter = 0; - trim_wanted = 0; + journal_trim_counter = bs->journal.flush_journal ? 1 : 0; + trim_wanted = bs->journal.flush_journal ? 1 : 0; journal_superblock = bs->journal.inmemory ? bs->journal.buffer : memalign_or_die(MEM_ALIGNMENT, bs->journal_block_size); co = new journal_flusher_co[max_flusher_count]; for (int i = 0; i < max_flusher_count; i++) @@ -626,6 +626,12 @@ resume_1: #endif flusher->trimming = false; } + if (bs->journal.flush_journal && !flusher->flush_queue.size()) + { + assert(bs->journal.used_start == bs->journal.next_free); + printf("Journal flushed\n"); + exit(0); + } } // All done flusher->active_flushers--; diff --git a/src/blockstore_impl.cpp b/src/blockstore_impl.cpp index 48fa8ea6..b129a1d5 100644 --- a/src/blockstore_impl.cpp +++ b/src/blockstore_impl.cpp @@ -92,10 +92,23 @@ void blockstore_impl_t::loop() { delete journal_init_reader; journal_init_reader = NULL; - initialized = 10; + if (journal.flush_journal) + initialized = 3; + else + initialized = 10; ringloop->wakeup(); } } + if (initialized == 3) + { + if (readonly) + { + printf("Can't flush the journal in readonly mode\n"); + exit(1); + } + flusher->loop(); + ringloop->submit(); + } } else { diff --git a/src/blockstore_journal.h b/src/blockstore_journal.h index 5f8913b5..b6600447 100644 --- a/src/blockstore_journal.h +++ b/src/blockstore_journal.h @@ -143,6 +143,7 @@ struct journal_t int fd; uint64_t device_size; bool inmemory = false; + bool flush_journal = false; void *buffer = NULL; uint64_t block_size; diff --git a/src/blockstore_open.cpp b/src/blockstore_open.cpp index fa1239db..4c70dac5 100644 --- a/src/blockstore_open.cpp +++ b/src/blockstore_open.cpp @@ -42,6 +42,11 @@ void blockstore_impl_t::parse_config(blockstore_config_t & config) { disable_flock = true; } + if (config["flush_journal"] == "true" || config["flush_journal"] == "1" || config["flush_journal"] == "yes") + { + // Only flush journal and exit + journal.flush_journal = true; + } if (config["immediate_commit"] == "all") { immediate_commit = IMMEDIATE_ALL; @@ -87,7 +92,7 @@ void blockstore_impl_t::parse_config(blockstore_config_t & config) { max_flusher_count = 256; } - if (!min_flusher_count) + if (!min_flusher_count || journal.flush_journal) { min_flusher_count = 1; }