]> git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/test_replay.h
update source to Ceph Pacific 16.2.2
[ceph.git] / ceph / src / crimson / os / seastore / onode_manager / staged-fltree / node_extent_manager / test_replay.h
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
3
4 #pragma once
5
6 #include "crimson/os/seastore/onode_manager/staged-fltree/node_delta_recorder.h"
7 #include "crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager.h"
8
9 /** test_replay.h
10 *
11 * A special version of NodeExtent to help verify delta encode, decode and
12 * replay in recorder_t under debug build.
13 */
14
15 namespace crimson::os::seastore::onode {
16
17 class TestReplayExtent final: public NodeExtent {
18 public:
19 using Ref = crimson::os::seastore::TCachedExtentRef<TestReplayExtent>;
20
21 void prepare_replay(NodeExtentRef from_extent) {
22 assert(get_length() == from_extent->get_length());
23 auto mut = do_get_mutable();
24 std::memcpy(mut.get_write(), from_extent->get_read(), get_length());
25 }
26
27 void replay_and_verify(NodeExtentRef replayed_extent) {
28 assert(get_length() == replayed_extent->get_length());
29 auto mut = do_get_mutable();
30 auto bl = recorder->get_delta();
31 assert(bl.length());
32 auto p = bl.cbegin();
33 recorder->apply_delta(p, mut);
34 assert(p == bl.end());
35 auto cmp = std::memcmp(get_read(), replayed_extent->get_read(), get_length());
36 ceph_assert(cmp == 0 && "replay mismatch!");
37 }
38
39 static Ref create(extent_len_t length, DeltaRecorderURef&& recorder) {
40 auto r = ceph::buffer::create_aligned(length, 4096);
41 auto bp = ceph::bufferptr(std::move(r));
42 return new TestReplayExtent(std::move(bp), std::move(recorder));
43 }
44
45 protected:
46 NodeExtentRef mutate(context_t, DeltaRecorderURef&&) override {
47 ceph_abort("impossible path"); }
48 DeltaRecorder* get_recorder() const override {
49 ceph_abort("impossible path"); }
50 CachedExtentRef duplicate_for_write() override {
51 ceph_abort("impossible path"); }
52 extent_types_t get_type() const override {
53 return extent_types_t::TEST_BLOCK; }
54 ceph::bufferlist get_delta() override {
55 ceph_abort("impossible path"); }
56 void apply_delta(const ceph::bufferlist&) override {
57 ceph_abort("impossible path"); }
58
59 private:
60 TestReplayExtent(ceph::bufferptr&& ptr, DeltaRecorderURef&& recorder)
61 : NodeExtent(std::move(ptr)), recorder(std::move(recorder)) {
62 state = extent_state_t::MUTATION_PENDING;
63 }
64 DeltaRecorderURef recorder;
65 };
66
67 }