crimson/os/seastore: cleanup dependency between epm and journal

OOL segments won't contain deltas and don't need to replay. There is no
need to assign segment sequence from journal.

Signed-off-by: Yingxin Cheng <yingxin.cheng@intel.com>
This commit is contained in:
Yingxin Cheng 2022-01-28 15:12:57 +08:00
parent d83627c066
commit 1446c58acd
7 changed files with 23 additions and 34 deletions

View File

@ -17,11 +17,9 @@ namespace crimson::os::seastore {
SegmentedAllocator::SegmentedAllocator(
SegmentProvider& sp,
SegmentManager& sm,
Journal& journal)
SegmentManager& sm)
: segment_provider(sp),
segment_manager(sm),
journal(journal)
segment_manager(sm)
{
std::generate_n(
std::back_inserter(writers),
@ -30,8 +28,7 @@ SegmentedAllocator::SegmentedAllocator(
[&] {
return Writer{
segment_provider,
segment_manager,
journal};
segment_manager};
});
}
@ -201,7 +198,7 @@ SegmentedAllocator::Writer::init_segment(Segment& segment) {
segment_manager.get_block_size()));
bp.zero();
auto header =segment_header_t{
journal.get_segment_seq(),
OOL_SEG_SEQ,
segment.get_segment_id(),
NO_DELTAS, 0, true};
logger().debug("SegmentedAllocator::Writer::init_segment: initting {}, {}",

View File

@ -7,7 +7,6 @@
#include "crimson/common/condition_variable.h"
#include "crimson/os/seastore/cached_extent.h"
#include "crimson/os/seastore/journal.h"
#include "crimson/os/seastore/logging.h"
#include "crimson/os/seastore/segment_manager.h"
#include "crimson/os/seastore/transaction.h"
@ -183,11 +182,9 @@ class SegmentedAllocator : public ExtentAllocator {
public:
Writer(
SegmentProvider& sp,
SegmentManager& sm,
Journal& journal)
SegmentManager& sm)
: segment_provider(sp),
segment_manager(sm),
journal(journal)
segment_manager(sm)
{}
Writer(Writer &&) = default;
@ -225,7 +222,6 @@ class SegmentedAllocator : public ExtentAllocator {
open_segment_wrapper_ref current_segment;
std::list<open_segment_wrapper_ref> open_segments;
seastore_off_t allocated_to = 0;
Journal& journal;
crimson::condition_variable segment_rotation_guard;
seastar::gate writer_guard;
bool rolling_segment = false;
@ -233,8 +229,7 @@ class SegmentedAllocator : public ExtentAllocator {
public:
SegmentedAllocator(
SegmentProvider& sp,
SegmentManager& sm,
Journal& journal);
SegmentManager& sm);
Writer &get_writer(placement_hint_t hint) {
return writers[std::rand() % writers.size()];
@ -269,7 +264,6 @@ private:
SegmentProvider& segment_provider;
SegmentManager& segment_manager;
std::vector<Writer> writers;
Journal& journal;
};
class ExtentPlacementManager {

View File

@ -202,18 +202,18 @@ Journal::replay_segment(
* sequence number > the current journal segment seq. We can
* safetly skip these deltas because the extent must already
* have been rewritten.
*
* Note, this comparison exploits the fact that
* SEGMENT_SEQ_NULL is a large number.
*/
auto& seg_addr = delta.paddr.as_seg_paddr();
if (delta.paddr != P_ADDR_NULL &&
(segment_provider->get_seq(seg_addr.get_segment_id()) >
locator.write_result.start_seq.segment_seq)) {
return replay_ertr::now();
} else {
return handler(locator, delta);
if (delta.paddr != P_ADDR_NULL) {
auto& seg_addr = delta.paddr.as_seg_paddr();
auto delta_paddr_segment_seq = segment_provider->get_seq(seg_addr.get_segment_id());
auto locator_segment_seq = locator.write_result.start_seq.segment_seq;
if (delta_paddr_segment_seq == NULL_SEG_SEQ ||
(delta_paddr_segment_seq <= MAX_VALID_SEG_SEQ &&
delta_paddr_segment_seq > locator_segment_seq)) {
return replay_ertr::now();
}
}
return handler(locator, delta);
});
});
});

View File

@ -191,10 +191,11 @@ std::ostream &offset_to_stream(std::ostream &, const seastore_off_t &t);
/* Monotonically increasing segment seq, uniquely identifies
* the incarnation of a segment */
using segment_seq_t = uint32_t;
static constexpr segment_seq_t NULL_SEG_SEQ =
std::numeric_limits<segment_seq_t>::max();
static constexpr segment_seq_t MAX_SEG_SEQ =
std::numeric_limits<segment_seq_t>::max();
static constexpr segment_seq_t NULL_SEG_SEQ = MAX_SEG_SEQ;
static constexpr segment_seq_t OOL_SEG_SEQ = MAX_SEG_SEQ - 1;
static constexpr segment_seq_t MAX_VALID_SEG_SEQ = MAX_SEG_SEQ - 2;
// Offset of delta within a record
using record_delta_idx_t = uint32_t;

View File

@ -549,8 +549,7 @@ public:
device_type_t::SEGMENTED,
std::make_unique<SegmentedAllocator>(
*segment_cleaner,
*sm,
*journal));
*sm));
}
~TransactionManager();

View File

@ -149,8 +149,7 @@ void TMDriver::init()
device_type_t::SEGMENTED,
std::make_unique<SegmentedAllocator>(
*segment_cleaner,
*segment_manager,
*journal));
*segment_manager));
journal->set_segment_provider(&*segment_cleaner);

View File

@ -88,8 +88,7 @@ auto get_transaction_manager(
device_type_t::SEGMENTED,
std::make_unique<SegmentedAllocator>(
*segment_cleaner,
segment_manager,
*journal));
segment_manager));
journal->set_segment_provider(&*segment_cleaner);