Journal::initialize_segment_ertr::future<> Journal::initialize_segment(
Segment &segment)
{
- logger().debug("initialize_segment {}", segment.get_segment_id());
+ auto new_tail = segment_provider->get_journal_tail_target();
+ logger().debug(
+ "initialize_segment {} journal_tail_target {}",
+ segment.get_segment_id(),
+ new_tail);
// write out header
ceph_assert(segment.get_write_ptr() == 0);
bufferlist bl;
auto header = segment_header_t{
current_journal_segment_seq++,
segment.get_segment_id(),
- current_replay_point};
+ segment_provider->get_journal_tail_target()};
::encode(header, bl);
written_to = segment_manager.get_block_size();
- return segment.write(0, bl).handle_error(
+ return segment.write(0, bl).safe_then(
+ [=] {
+ segment_provider->update_journal_tail_committed(new_tail);
+ },
init_ertr::pass_further{},
crimson::ct_error::assert_all{ "TODO" });
}
rt.second.journal_segment_seq;
});
- auto replay_from = segments.rbegin()->second.journal_tail;
+ auto replay_from = segments.rbegin()->second.journal_tail.offset;
auto from = segments.begin();
if (replay_from != P_ADDR_NULL) {
from = std::find_if(
segment_seq_t journal_segment_seq;
segment_id_t physical_segment_id; // debugging
- paddr_t journal_tail;
+ journal_seq_t journal_tail;
DENC(segment_header_t, v, p) {
DENC_START(1, 1, p);
/* TODO: we'll want to use this to propogate information about segment contents */
virtual void put_segment(segment_id_t segment) = 0;
+ virtual journal_seq_t get_journal_tail_target() const = 0;
+ virtual void update_journal_tail_committed(journal_seq_t tail_committed) = 0;
+
virtual ~JournalSegmentProvider() {}
};
JournalSegmentProvider *segment_provider = nullptr;
SegmentManager &segment_manager;
- paddr_t current_replay_point;
-
segment_seq_t current_journal_segment_seq = 0;
SegmentRef current_journal_segment;
return;
}
+ journal_seq_t get_journal_tail_target() const final {
+ // TODO -- part of gc
+ return journal_seq_t{};
+ }
+ void update_journal_tail_committed(journal_seq_t committed) final {
+ // TODO -- part of gc
+ }
+
/// Writes initial metadata to disk
using mkfs_ertr = crimson::errorator<
crimson::ct_error::input_output_error
return;
}
+ journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }
+ void update_journal_tail_committed(journal_seq_t committed) final {}
+
auto submit_transaction(TransactionRef t)
{
auto record = cache.try_construct_record(*t);
return;
}
+ journal_seq_t get_journal_tail_target() const final { return journal_seq_t{}; }
+ void update_journal_tail_committed(journal_seq_t paddr) final {}
+
seastar::future<> set_up_fut() final {
journal.reset(new Journal(*segment_manager));
journal->set_segment_provider(this);