summaryrefslogtreecommitdiffstats
path: root/src/crimson/os/seastore/journal.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/crimson/os/seastore/journal.h')
-rw-r--r--src/crimson/os/seastore/journal.h122
1 files changed, 122 insertions, 0 deletions
diff --git a/src/crimson/os/seastore/journal.h b/src/crimson/os/seastore/journal.h
new file mode 100644
index 000000000..18c0797a8
--- /dev/null
+++ b/src/crimson/os/seastore/journal.h
@@ -0,0 +1,122 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include <memory>
+
+#include "crimson/os/seastore/ordering_handle.h"
+#include "crimson/os/seastore/seastore_types.h"
+#include "crimson/os/seastore/segment_seq_allocator.h"
+
+namespace crimson::os::seastore {
+
+namespace random_block_device {
+class RBMDevice;
+}
+
+class SegmentManagerGroup;
+class SegmentProvider;
+class JournalTrimmer;
+
+class Journal {
+public:
+ virtual JournalTrimmer &get_trimmer() = 0;
+ /**
+ * initializes journal for mkfs writes -- must run prior to calls
+ * to submit_record.
+ */
+ using open_for_mkfs_ertr = crimson::errorator<
+ crimson::ct_error::input_output_error
+ >;
+ using open_for_mkfs_ret = open_for_mkfs_ertr::future<journal_seq_t>;
+ virtual open_for_mkfs_ret open_for_mkfs() = 0;
+
+ /**
+ * initializes journal for new writes -- must run prior to calls
+ * to submit_record. Should be called after replay if not a new
+ * Journal.
+ */
+ using open_for_mount_ertr = open_for_mkfs_ertr;
+ using open_for_mount_ret = open_for_mkfs_ret;
+ virtual open_for_mount_ret open_for_mount() = 0;
+
+ /// close journal
+ using close_ertr = crimson::errorator<
+ crimson::ct_error::input_output_error>;
+ virtual close_ertr::future<> close() = 0;
+
+ /**
+ * submit_record
+ *
+ * write record with the ordering handle
+ */
+ using submit_record_ertr = crimson::errorator<
+ crimson::ct_error::erange,
+ crimson::ct_error::input_output_error
+ >;
+ using submit_record_ret = submit_record_ertr::future<
+ record_locator_t
+ >;
+ virtual submit_record_ret submit_record(
+ record_t &&record,
+ OrderingHandle &handle
+ ) = 0;
+
+ /**
+ * flush
+ *
+ * Wait for all outstanding IOs on handle to commit.
+ * Note, flush() machinery must go through the same pipeline
+ * stages and locks as submit_record.
+ */
+ virtual seastar::future<> flush(OrderingHandle &handle) = 0;
+
+ /// sets write pipeline reference
+ virtual void set_write_pipeline(WritePipeline *_write_pipeline) = 0;
+
+ /**
+ * Read deltas and pass to delta_handler
+ *
+ * record_block_start (argument to delta_handler) is the start of the
+ * of the first block in the record
+ */
+ using replay_ertr = crimson::errorator<
+ crimson::ct_error::input_output_error,
+ crimson::ct_error::invarg,
+ crimson::ct_error::enoent,
+ crimson::ct_error::erange>;
+ using replay_ret = replay_ertr::future<>;
+ using delta_handler_t = std::function<
+ replay_ertr::future<bool>(
+ const record_locator_t&,
+ const delta_info_t&,
+ const journal_seq_t&, // dirty_tail
+ const journal_seq_t&, // alloc_tail
+ sea_time_point modify_time)>;
+ virtual replay_ret replay(
+ delta_handler_t &&delta_handler) = 0;
+
+ virtual seastar::future<> finish_commit(
+ transaction_type_t type) = 0;
+
+ virtual ~Journal() {}
+
+ virtual journal_type_t get_type() = 0;
+};
+using JournalRef = std::unique_ptr<Journal>;
+
+namespace journal {
+
+JournalRef make_segmented(
+ SegmentProvider &provider,
+ JournalTrimmer &trimmer);
+
+JournalRef make_circularbounded(
+ JournalTrimmer &trimmer,
+ crimson::os::seastore::random_block_device::RBMDevice* device,
+ std::string path);
+
+}
+
+}