From: Kefu Chai Date: Wed, 2 Jun 2021 06:13:04 +0000 (+0800) Subject: crimson: always handle returned future X-Git-Tag: v17.1.0~1782^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=895f99a62d684b2ae01d3ed1fb34bffab65dce9f;p=ceph.git crimson: always handle returned future to ignore a future without good reason could lead to catastrophic issues. see also b127fa3cdd405c71cf09875f61f107c23af6b8cf Signed-off-by: Kefu Chai --- diff --git a/src/crimson/os/seastore/segment_manager/ephemeral.cc b/src/crimson/os/seastore/segment_manager/ephemeral.cc index 7d494f2bfb2..7e3a5a06029 100644 --- a/src/crimson/os/seastore/segment_manager/ephemeral.cc +++ b/src/crimson/os/seastore/segment_manager/ephemeral.cc @@ -40,8 +40,7 @@ segment_off_t EphemeralSegment::get_write_capacity() const Segment::close_ertr::future<> EphemeralSegment::close() { - manager.segment_close(id); - return close_ertr::now().safe_then([] { + return manager.segment_close(id).safe_then([] { return seastar::sleep(std::chrono::milliseconds(1)); }); } diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 105d3f04092..46038e3b782 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -247,18 +247,20 @@ TransactionManager::submit_transaction_direct( DEBUGT("journal commit to {} seq {}", tref, addr, journal_seq); segment_cleaner->set_journal_head(journal_seq); cache->complete_commit(tref, addr, journal_seq, segment_cleaner.get()); - lba_manager->complete_transaction(tref); - segment_cleaner->update_journal_tail_target( - cache->get_oldest_dirty_from().value_or(journal_seq)); - auto to_release = tref.get_segment_to_release(); - if (to_release != NULL_SEG_ID) { - return segment_manager.release(to_release - ).safe_then([this, to_release] { - segment_cleaner->mark_segment_released(to_release); - }); - } else { - return SegmentManager::release_ertr::now(); - } + return lba_manager->complete_transaction(tref).safe_then( + [&tref, journal_seq=journal_seq, this] { + segment_cleaner->update_journal_tail_target( + cache->get_oldest_dirty_from().value_or(journal_seq)); + auto to_release = tref.get_segment_to_release(); + if (to_release != NULL_SEG_ID) { + return segment_manager.release(to_release + ).safe_then([this, to_release] { + segment_cleaner->mark_segment_released(to_release); + }); + } else { + return SegmentManager::release_ertr::now(); + } + }); }).safe_then([&tref] { return tref.handle.complete(); }).handle_error( diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index 945e4033e93..4d1445aa2bd 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -974,7 +974,7 @@ PG::with_existing_clone_obc(ObjectContextRef clone, with_obc_func_t&& func) assert(head == clone->get_head_obc()); return clone->template with_lock( [clone=std::move(clone), func=std::move(func)] { - std::move(func)(std::move(clone)); + return std::move(func)(std::move(clone)); }); }); }