mirror of
https://github.com/ceph/ceph
synced 2025-02-21 01:47:25 +00:00
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:
parent
d83627c066
commit
1446c58acd
@ -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 {}, {}",
|
||||
|
@ -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 {
|
||||
|
@ -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);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -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;
|
||||
|
@ -549,8 +549,7 @@ public:
|
||||
device_type_t::SEGMENTED,
|
||||
std::make_unique<SegmentedAllocator>(
|
||||
*segment_cleaner,
|
||||
*sm,
|
||||
*journal));
|
||||
*sm));
|
||||
}
|
||||
|
||||
~TransactionManager();
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user