/**
* try_construct_record
*
- * First checks for conflicts. If a racing write has mutated/retired
- * an extent mutated by this transaction, nullopt will be returned.
- *
- * Otherwise, a record will be returned valid for use with Journal.
+ * Construct the record for Journal from transaction.
*/
- std::optional<record_t> try_construct_record(
+ record_t try_construct_record(
Transaction &t ///< [in, out] current transaction
);
).then_interruptible([this, FNAME, &tref]() mutable
-> submit_transaction_iertr::future<> {
auto record = cache->try_construct_record(tref);
- assert(record); // interruptible future would have already failed
tref.get_handle().maybe_release_collection_lock();
DEBUGT("about to submit to journal", tref);
- return journal->submit_record(std::move(*record), tref.get_handle()
+ return journal->submit_record(std::move(record), tref.get_handle()
).safe_then([this, FNAME, &tref](auto p) mutable {
auto [addr, journal_seq] = p;
DEBUGT("journal commit to {} seq {}", tref, addr, journal_seq);
seastar::future<> submit_transaction(TransactionRef t)
{
auto record = cache.try_construct_record(*t);
- if (!record) {
- ceph_assert(0 == "cannot fail");
- }
-
- return journal.submit_record(std::move(*record), t->get_handle()).safe_then(
+ return journal.submit_record(std::move(record), t->get_handle()).safe_then(
[this, t=std::move(t)](auto p) mutable {
auto [addr, seq] = p;
cache.complete_commit(*t, addr, seq);
: segment_manager(segment_manager::create_test_ephemeral()),
cache(*segment_manager) {}
- seastar::future<std::optional<paddr_t>> submit_transaction(
+ seastar::future<paddr_t> submit_transaction(
TransactionRef t) {
auto record = cache.try_construct_record(*t);
- if (!record) {
- return seastar::make_ready_future<std::optional<paddr_t>>(
- std::nullopt);
- }
bufferlist bl;
- for (auto &&block : record->extents) {
+ for (auto &&block : record.extents) {
bl.append(block.bl);
}
).safe_then(
[this, prev, t=std::move(t)]() mutable {
cache.complete_commit(*t, prev, seq /* TODO */);
- return seastar::make_ready_future<std::optional<paddr_t>>(prev);
+ return prev;
},
crimson::ct_error::all_same_way([](auto e) {
ASSERT_FALSE("failed to submit");
return cache.mkfs(*transaction).safe_then(
[this, &transaction] {
return submit_transaction(std::move(transaction)).then(
- [](auto p) {
- ASSERT_TRUE(p);
- });
+ [](auto p) {});
});
});
}).handle_error(
TestBlockPhysical::SIZE);
extent->set_contents('c');
csum = extent->get_crc32c();
- auto ret = submit_transaction(std::move(t)).get0();
- ASSERT_TRUE(ret);
+ submit_transaction(std::move(t)).get0();
addr = extent->get_paddr();
}
{
ASSERT_EQ(extent->get_version(), 0);
ASSERT_EQ(csum, extent->get_crc32c());
}
- auto ret = submit_transaction(std::move(t)).get0();
- ASSERT_TRUE(ret);
+ submit_transaction(std::move(t)).get0();
addr = extent->get_paddr();
}
{
ASSERT_EQ(csum2, extent->get_crc32c());
}
// submit transaction
- auto ret = submit_transaction(std::move(t)).get0();
- ASSERT_TRUE(ret);
+ submit_transaction(std::move(t)).get0();
ASSERT_TRUE(extent->is_dirty());
ASSERT_EQ(addr, extent->get_paddr());
ASSERT_EQ(extent->get_version(), 1);