]> git.proxmox.com Git - ceph.git/blame - ceph/src/crimson/os/seastore/onode_manager/staged-fltree/node_extent_manager/test_replay.h
import quincy beta 17.1.0
[ceph.git] / ceph / src / crimson / os / seastore / onode_manager / staged-fltree / node_extent_manager / test_replay.h
CommitLineData
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
15namespace crimson::os::seastore::onode {
16
17class 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}