src/
Coverage:
low: ≥ 0%
medium: ≥ 75.0%
high: ≥ 90.0%
Lines:
19 / 56
33.9%
Branches:
9 / 42
21.4%
Functions:
9 / 18
50.0%

storage/value_store/value_store.h
Line Branch Exec Source
1 #pragma once
2
3 #include <cstddef>
4 #include <cstdint>
5 #include <stdexcept>
6 #include <string>
7 #include <vector>
8
9 #include "storage/index/index.h"
10
11 class ValueStore {
12 public:
13 struct ReadResult {
14 std::vector<char> data;
15 };
16
17 struct WriteSpec {
18 const void* data;
19 size_t size;
20 };
21
22 struct DirectFixedRow {
23 const char* data = nullptr;
24 size_t size = 0;
25 bool missing = false;
26 };
27
28 1850 virtual ~ValueStore() = default;
29
30 virtual uint64_t Alloc(size_t size) = 0;
31 virtual void Write(uint64_t handle, const void* data, size_t size) = 0;
32 virtual uint64_t AllocAndWrite(const void* data, size_t size) = 0;
33 virtual size_t Read(uint64_t handle, void* out_buf, size_t buf_size) = 0;
34 virtual void Free(uint64_t handle) = 0;
35 83738 virtual void Retire(uint64_t handle) { Free(handle); }
36 73614 virtual const char* DirectPtr(uint64_t handle) const { return nullptr; }
37 ✗ virtual char* RDMABackingData() const { return nullptr; }
38 ✗ virtual size_t RDMABackingSize() const { return 0; }
39 virtual size_t SlotCapacity(uint64_t handle) const = 0;
40 ✗ virtual void BatchWrite(const std::vector<uint64_t>& handles,
41 const std::vector<WriteSpec>& specs) {
42
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ if (handles.size() != specs.size()) {
43
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ throw std::invalid_argument("BatchWrite size mismatch");
44 }
45
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ for (size_t i = 0; i < handles.size(); ++i) {
46
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ if (handles[i] == kValueHandleNone) {
47 ✗ continue;
48 }
49 ✗ Write(handles[i], specs[i].data, specs[i].size);
50 }
51 ✗ }
52
53 ✗ virtual void BatchRead(const std::vector<uint64_t>& handles,
54 std::vector<ReadResult>& out_results) {
55 ✗ out_results.resize(handles.size());
56
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ for (size_t i = 0; i < handles.size(); ++i) {
57
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ if (handles[i] == kValueHandleNone) {
58 ✗ out_results[i].data.clear();
59 ✗ continue;
60 }
61 ✗ const size_t cap = SlotCapacity(handles[i]);
62 ✗ out_results[i].data.resize(cap);
63 ✗ const size_t actual = Read(
64 ✗ handles[i], out_results[i].data.data(), out_results[i].data.size());
65 ✗ out_results[i].data.resize(actual);
66 }
67 ✗ }
68
69 4 virtual bool ReadFlatFixedRows(
70 const uint64_t* handles,
71 size_t num_rows,
72 void* out_buf,
73 size_t row_bytes,
74 uint64_t* missing_rows) const {
75 (void)handles;
76 (void)num_rows;
77 (void)out_buf;
78 (void)row_bytes;
79 (void)missing_rows;
80 4 return false;
81 }
82
83 ✗ virtual bool ReadFlatFixedRowSlices(
84 const uint64_t* handles,
85 size_t num_rows,
86 void* out_buf,
87 size_t stored_row_bytes,
88 size_t source_offset_bytes,
89 size_t output_row_bytes,
90 uint64_t* missing_rows) const {
91 (void)handles;
92 (void)num_rows;
93 (void)out_buf;
94 (void)stored_row_bytes;
95 (void)source_offset_bytes;
96 (void)output_row_bytes;
97 (void)missing_rows;
98 ✗ return false;
99 }
100
101 ✗ virtual bool GetDirectFixedRows(
102 const uint64_t* handles,
103 size_t num_rows,
104 size_t row_bytes,
105 DirectFixedRow* rows,
106 uint64_t* missing_rows) const {
107 (void)handles;
108 (void)num_rows;
109 (void)row_bytes;
110 (void)rows;
111 (void)missing_rows;
112 ✗ return false;
113 }
114
115 virtual std::vector<uint64_t>
116 272 BatchAllocAndWrite(const std::vector<WriteSpec>& specs) {
117 272 std::vector<uint64_t> handles;
118
1/2
✓ Branch 2 taken 272 times.
✗ Branch 3 not taken.
272 handles.reserve(specs.size());
119
2/2
✓ Branch 4 taken 1020 times.
✓ Branch 5 taken 272 times.
1292 for (const auto& spec : specs) {
120
2/4
✓ Branch 1 taken 1020 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1020 times.
✗ Branch 5 not taken.
1020 handles.push_back(AllocAndWrite(spec.data, spec.size));
121 }
122 272 return handles;
123 ✗ }
124
125 309024 virtual uint64_t AllocAndWrite(uint64_t key, const void* data, size_t size) {
126 (void)key;
127 309024 return AllocAndWrite(data, size);
128 }
129
130 380 virtual std::vector<uint64_t> BatchAllocAndWrite(
131 const std::vector<uint64_t>& keys, const std::vector<WriteSpec>& specs) {
132
1/2
✗ Branch 2 not taken.
✓ Branch 3 taken 380 times.
380 if (keys.size() != specs.size()) {
133
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ throw std::invalid_argument("BatchAllocAndWrite size mismatch");
134 }
135
2/4
✓ Branch 1 taken 380 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 380 times.
✗ Branch 5 not taken.
380 if (GetLayoutId().plain()) {
136
1/2
✓ Branch 1 taken 380 times.
✗ Branch 2 not taken.
380 return BatchAllocAndWrite(specs);
137 }
138 ✗ std::vector<uint64_t> handles;
139
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ handles.reserve(keys.size());
140
0/2
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ for (size_t i = 0; i < keys.size(); ++i) {
141
0/4
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 7 not taken.
✗ Branch 8 not taken.
✗ handles.push_back(AllocAndWrite(keys[i], specs[i].data, specs[i].size));
142 }
143 ✗ return handles;
144 ✗ }
145
146 struct LayoutId {
147 uint32_t strategy = 0;
148 uint64_t checksum = 0;
149 726 bool plain() const { return strategy == 0; }
150 };
151
152 754 virtual LayoutId GetLayoutId() const { return {}; }
153
154 ✗ virtual void ResetStats() {}
155
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ virtual std::string GetInfo() const { return "(no info)"; }
156
0/2
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ virtual std::string ExtraResultFields() const { return ""; }
157 };
158