]>
Commit | Line | Data |
---|---|---|
f67539c2 TL |
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(); | |
20effc67 | 33 | recorder->apply_delta(p, mut, *this); |
f67539c2 TL |
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 | } |