GCC Code Coverage Report


Directory: src/
Coverage: low: ≥ 0% medium: ≥ 75.0% high: ≥ 90.0%
Coverage Exec / Excl / Total
Lines: 23.7% 9 / 0 / 38
Functions: 33.3% 4 / 0 / 12
Branches: 20.8% 5 / 0 / 24

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 1664 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 83618 virtual void Retire(uint64_t handle) { Free(handle); }
36 73934 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 if (handles.size() != specs.size()) {
43 throw std::invalid_argument("BatchWrite size mismatch");
44 }
45 for (size_t i = 0; i < handles.size(); ++i) {
46 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 for (size_t i = 0; i < handles.size(); ++i) {
57 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 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 return false;
81 }
82
83 virtual bool GetDirectFixedRows(
84 const uint64_t* handles,
85 size_t num_rows,
86 size_t row_bytes,
87 DirectFixedRow* rows,
88 uint64_t* missing_rows) const {
89 (void)handles;
90 (void)num_rows;
91 (void)row_bytes;
92 (void)rows;
93 (void)missing_rows;
94 return false;
95 }
96
97 virtual std::vector<uint64_t>
98 238 BatchAllocAndWrite(const std::vector<WriteSpec>& specs) {
99 238 std::vector<uint64_t> handles;
100
1/2
✓ Branch 2 taken 238 times.
✗ Branch 3 not taken.
238 handles.reserve(specs.size());
101
2/2
✓ Branch 4 taken 794 times.
✓ Branch 5 taken 238 times.
1032 for (const auto& spec : specs) {
102
2/4
✓ Branch 1 taken 794 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 794 times.
✗ Branch 5 not taken.
794 handles.push_back(AllocAndWrite(spec.data, spec.size));
103 }
104 238 return handles;
105 }
106
107 virtual std::string GetInfo() const { return "(no info)"; }
108 virtual std::string ExtraResultFields() const { return ""; }
109 };
110