]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson: always handle returned future
authorKefu Chai <kchai@redhat.com>
Wed, 2 Jun 2021 06:13:04 +0000 (14:13 +0800)
committerKefu Chai <kchai@redhat.com>
Wed, 2 Jun 2021 06:17:24 +0000 (14:17 +0800)
to ignore a future without good reason could lead to catastrophic
issues. see also b127fa3cdd405c71cf09875f61f107c23af6b8cf

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/os/seastore/segment_manager/ephemeral.cc
src/crimson/os/seastore/transaction_manager.cc
src/crimson/osd/pg.cc

index 7d494f2bfb24cd34b97fda31c4b201c2e1b2450d..7e3a5a06029d68d376f3ff076b31b8cff40096cd 100644 (file)
@@ -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));
   });
 }
index 105d3f040928f4799a09a1595240268f6dd1d8be..46038e3b7825dedb9866f66fd815859d6e952198 100644 (file)
@@ -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(
index 945e4033e931aa89bd02e813be1844e5629216d3..4d1445aa2bdca4fc93c829880afc48e0f4649e45 100644 (file)
@@ -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<State>(
       [clone=std::move(clone), func=std::move(func)] {
-      std::move(func)(std::move(clone));
+      return std::move(func)(std::move(clone));
     });
   });
 }