std::move(delta_bl)
});
} else {
+ auto sseq = NULL_SEG_SEQ;
+ auto stype = segment_type_t::NULL_SEG;
+ if (cleaner != nullptr) {
+ auto sid = i->get_paddr().as_seg_paddr().get_segment_id();
+ auto &sinfo = cleaner->get_seg_info(sid);
+ sseq = sinfo.seq;
+ stype = sinfo.type;
+ }
record.push_back(
delta_info_t{
i->get_type(),
final_crc,
(seastore_off_t)i->get_length(),
i->get_version() - 1,
- cleaner
- ? cleaner->get_seq(i->get_paddr().as_seg_paddr().get_segment_id())
- : MAX_SEG_SEQ,
- cleaner
- ? cleaner->get_type(i->get_paddr().as_seg_paddr().get_segment_id())
- : segment_type_t::NULL_SEG,
+ sseq,
+ stype,
std::move(delta_bl)
});
i->last_committed_crc = final_crc;
new_segment_seq,
reinterpret_cast<const unsigned char *>(meta.seastore_id.bytes()),
sizeof(meta.seastore_id.uuid));
- auto new_segment_id = segment_provider.get_segment(new_segment_seq, type);
+ auto new_segment_id = segment_provider.allocate_segment(new_segment_seq, type);
ceph_assert(new_segment_id != NULL_SEG_ID);
return sm_group.open(new_segment_id
).handle_error(
DEBUG("{} rolled new segment id={}",
print_name, current_segment->get_segment_id());
ceph_assert(new_journal_seq.segment_seq ==
- segment_provider.get_seq(current_segment->get_segment_id()));
+ segment_provider.get_seg_info(current_segment->get_segment_id()).seq);
return new_journal_seq;
});
});
auto write_length = to_write.length();
auto write_start_offset = written_to;
auto write_start_seq = journal_seq_t{
- segment_provider.get_seq(current_segment->get_segment_id()),
+ segment_provider.get_seg_info(current_segment->get_segment_id()).seq,
paddr_t::make_seg_paddr(
current_segment->get_segment_id(), write_start_offset)
};
if (is_rolling) {
segment_provider.close_segment(close_segment_id);
}
- segment_seq_t cur_segment_seq =
- segment_provider.get_seq(seg_to_close->get_segment_id());
+ auto close_seg_info = segment_provider.get_seg_info(close_segment_id);
journal_seq_t cur_journal_tail;
if (type == segment_type_t::JOURNAL) {
cur_journal_tail = segment_provider.get_journal_tail_target();
cur_journal_tail = NO_DELTAS;
}
auto tail = segment_tail_t{
- segment_provider.get_seq(close_segment_id),
+ close_seg_info.seq,
close_segment_id,
cur_journal_tail,
current_segment_nonce,
type,
- segment_provider.get_last_modified(
- close_segment_id).time_since_epoch().count(),
- segment_provider.get_last_rewritten(
- close_segment_id).time_since_epoch().count()};
+ close_seg_info.last_modified.time_since_epoch().count(),
+ close_seg_info.last_rewritten.time_since_epoch().count()};
ceph::bufferlist bl;
encode(tail, bl);
INFO("{} close segment id={}, seq={}, written_to={}, nonce={}, journal_tail={}",
print_name,
close_segment_id,
- cur_segment_seq,
+ close_seg_info.seq,
written_to,
current_segment_nonce,
tail.journal_tail);
*/
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 delta_paddr_segment_type = segment_provider.get_type(seg_addr.get_segment_id());
+ auto& seg_info = segment_provider.get_seg_info(seg_addr.get_segment_id());
+ auto delta_paddr_segment_seq = seg_info.seq;
+ auto delta_paddr_segment_type = seg_info.type;
if (s_type == segment_type_t::NULL_SEG ||
(delta_paddr_segment_seq != delta.ext_seq ||
delta_paddr_segment_type != delta.seg_type)) {
});
}
-segment_id_t SegmentCleaner::get_segment(
+segment_id_t SegmentCleaner::allocate_segment(
segment_seq_t seq,
segment_type_t type)
{
- LOG_PREFIX(SegmentCleaner::get_segment);
+ LOG_PREFIX(SegmentCleaner::allocate_segment);
assert(seq != NULL_SEG_SEQ);
for (auto it = segments.begin();
it != segments.end();
*/
class SegmentProvider {
public:
- virtual segment_id_t get_segment(
- segment_seq_t seq, segment_type_t type) = 0;
-
- virtual void close_segment(segment_id_t) {}
-
virtual journal_seq_t get_journal_tail_target() const = 0;
- virtual void update_journal_tail_committed(journal_seq_t tail_committed) = 0;
-
- virtual segment_seq_t get_seq(segment_id_t id) { return 0; }
+ virtual const segment_info_t& get_seg_info(segment_id_t id) const = 0;
- virtual segment_type_t get_type(segment_id_t id) = 0;
+ virtual segment_id_t allocate_segment(
+ segment_seq_t seq, segment_type_t type) = 0;
- virtual seastar::lowres_system_clock::time_point get_last_modified(
- segment_id_t id) const = 0;
+ virtual void close_segment(segment_id_t) = 0;
- virtual seastar::lowres_system_clock::time_point get_last_rewritten(
- segment_id_t id) const = 0;
+ virtual void update_journal_tail_committed(journal_seq_t tail_committed) = 0;
virtual void update_segment_avail_bytes(paddr_t offset) = 0;
using mount_ret = mount_ertr::future<>;
mount_ret mount();
- segment_id_t get_segment(
+ /*
+ * SegmentProvider interfaces
+ */
+ journal_seq_t get_journal_tail_target() const final {
+ return journal_tail_target;
+ }
+
+ const segment_info_t& get_seg_info(segment_id_t id) const final {
+ return segments[id];
+ }
+
+ segment_id_t allocate_segment(
segment_seq_t seq, segment_type_t type) final;
void close_segment(segment_id_t segment) final;
- journal_seq_t get_journal_tail_target() const final {
- return journal_tail_target;
+ void update_journal_tail_committed(journal_seq_t committed) final;
+
+ void update_segment_avail_bytes(paddr_t offset) final {
+ segments.update_written_to(offset);
}
- void update_journal_tail_committed(journal_seq_t committed) final;
+ SegmentManagerGroup* get_segment_manager_group() final {
+ return sm_group.get();
+ }
void update_journal_tail_target(journal_seq_t target);
gc_process.maybe_wake_on_space_used();
}
- void update_segment_avail_bytes(paddr_t offset) final {
- segments.update_written_to(offset);
- }
-
- segment_seq_t get_seq(segment_id_t id) final {
- return segments[id].seq;
- }
-
- segment_type_t get_type(segment_id_t id) final {
- return segments[id].type;
- }
-
- SegmentManagerGroup* get_segment_manager_group() final {
- return sm_group.get();
- }
-
using release_ertr = SegmentManagerGroup::release_ertr;
release_ertr::future<> maybe_release_segment(Transaction &t);
assert(ret > 0);
}
- seastar::lowres_system_clock::time_point get_last_modified(
- segment_id_t id) const final {
- return segments[id].last_modified;
- }
-
- seastar::lowres_system_clock::time_point get_last_rewritten(
- segment_id_t id) const final {
- return segments[id].last_rewritten;
- }
-
void mark_space_free(
paddr_t addr,
extent_len_t len) {
std::map<segment_id_t, segment_seq_t> segment_seqs;
std::map<segment_id_t, segment_type_t> segment_types;
+ mutable segment_info_t tmp_info;
+
btree_test_base() = default;
- seastar::lowres_system_clock::time_point get_last_modified(
- segment_id_t id) const final {
- return seastar::lowres_system_clock::time_point();
- }
+ /*
+ * SegmentProvider interfaces
+ */
+ journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }
- seastar::lowres_system_clock::time_point get_last_rewritten(
- segment_id_t id) const final {
- return seastar::lowres_system_clock::time_point();
+ const segment_info_t& get_seg_info(segment_id_t id) const final {
+ tmp_info = {};
+ tmp_info.seq = segment_seqs.at(id);
+ tmp_info.type = segment_types.at(id);
+ return tmp_info;
}
- void update_segment_avail_bytes(paddr_t offset) final {}
- segment_id_t get_segment(
+ segment_id_t allocate_segment(
segment_seq_t seq,
segment_type_t type
) final {
return ret;
}
- journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }
+ void close_segment(segment_id_t) final {}
void update_journal_tail_committed(journal_seq_t committed) final {}
- SegmentManagerGroup* get_segment_manager_group() final { return sms.get(); }
-
- segment_seq_t get_seq(segment_id_t id) final {
- return segment_seqs[id];
- }
+ void update_segment_avail_bytes(paddr_t offset) final {}
- segment_type_t get_type(segment_id_t id) final {
- return segment_types[id];
- }
+ SegmentManagerGroup* get_segment_manager_group() final { return sms.get(); }
virtual void complete_commit(Transaction &t) {}
seastar::future<> submit_transaction(TransactionRef t)
std::map<segment_id_t, segment_seq_t> segment_seqs;
std::map<segment_id_t, segment_type_t> segment_types;
+ mutable segment_info_t tmp_info;
+
journal_test_t() = default;
- seastar::lowres_system_clock::time_point get_last_modified(
- segment_id_t id) const final {
- return seastar::lowres_system_clock::time_point();
- }
+ /*
+ * SegmentProvider interfaces
+ */
+ journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }
- seastar::lowres_system_clock::time_point get_last_rewritten(
- segment_id_t id) const final {
- return seastar::lowres_system_clock::time_point();
+ const segment_info_t& get_seg_info(segment_id_t id) const final {
+ tmp_info = {};
+ tmp_info.seq = segment_seqs.at(id);
+ tmp_info.type = segment_types.at(id);
+ return tmp_info;
}
- void update_segment_avail_bytes(paddr_t offset) final {}
-
- segment_id_t get_segment(
+ segment_id_t allocate_segment(
segment_seq_t seq,
segment_type_t type
) final {
return ret;
}
- journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }
+ void close_segment(segment_id_t) final {}
void update_journal_tail_committed(journal_seq_t paddr) final {}
- SegmentManagerGroup* get_segment_manager_group() final { return sms.get(); }
-
- segment_seq_t get_seq(segment_id_t id) final {
- return segment_seqs[id];
- }
+ void update_segment_avail_bytes(paddr_t offset) final {}
- segment_type_t get_type(segment_id_t id) final {
- return segment_types[id];
- }
+ SegmentManagerGroup* get_segment_manager_group() final { return sms.get(); }
seastar::future<> set_up_fut() final {
segment_manager = segment_manager::create_test_ephemeral();