From 4ed95b7020bc57eec9685009e67ccd83af5d41e9 Mon Sep 17 00:00:00 2001 From: Calle Wilund Date: Mon, 7 Sep 2015 15:29:05 +0200 Subject: [PATCH] Commitlog: Add sync_all_segments() For #293 - allows explicit flush to disk (not close!) of all active segments --- db/commitlog/commitlog.cc | 18 ++++++++++++++---- db/commitlog/commitlog.hh | 8 ++++++++ 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/db/commitlog/commitlog.cc b/db/commitlog/commitlog.cc index 1abe4cf3bb..32bd68946f 100644 --- a/db/commitlog/commitlog.cc +++ b/db/commitlog/commitlog.cc @@ -184,6 +184,7 @@ public: future new_segment(); future active_segment(); future<> clear(); + future<> sync_all_segments(); scollectd::registrations create_counters(); @@ -824,17 +825,22 @@ void db::commitlog::segment_manager::discard_unused_segments() { } } +future<> db::commitlog::segment_manager::sync_all_segments() { + return parallel_for_each(_segments, [this](sseg_ptr s) { + return s->sync().then([](sseg_ptr) {}); + }); +} + /* * Sync all segments, then clear them out. To ensure all ops are done. * (Assumes you have barriered adding ops!) + * Only use from tests. */ future<> db::commitlog::segment_manager::clear() { logger.debug("Clearing all segments"); flush_segments(true); - return do_until([this]() {return _segments.empty();}, [this]() { - auto s = _segments.front(); - _segments.erase(_segments.begin()); - return s->sync().then([](sseg_ptr) {}); + return sync_all_segments().then([this] { + _segments.clear(); }); } /** @@ -964,6 +970,10 @@ void db::commitlog::discard_completed_segments(const cf_id_type& id, _segment_manager->discard_completed_segments(id, pos); } +future<> db::commitlog::sync_all_segments() { + return _segment_manager->sync_all_segments(); +} + size_t db::commitlog::max_record_size() const { return _segment_manager->max_mutation_size - segment::entry_overhead_size; } diff --git a/db/commitlog/commitlog.hh b/db/commitlog/commitlog.hh index 1fad3811e6..ed3350e29f 100644 --- a/db/commitlog/commitlog.hh +++ b/db/commitlog/commitlog.hh @@ -222,6 +222,14 @@ public: const config& active_config() const; + /** + * Issues disk sync on all (allocating) segments. I.e. ensures that + * all data written up until this call is indeed on disk. + * _However_, if you issue new "add" ops while this is executing, + * those can/will be missed. + */ + future<> sync_all_segments(); + future> list_existing_descriptors() const; future> list_existing_descriptors(const sstring& dir) const;