CCF
Loading...
Searching...
No Matches
untyped_change_set.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation. All rights reserved.
2// Licensed under the Apache 2.0 License.
3#pragma once
4
5#include "ccf/byte_vector.h"
6#include "ccf/kv/hooks.h"
7#include "ccf/kv/untyped.h"
8#include "ds/champ_map.h"
9#include "kv/kv_types.h"
10#include "kv/version_v.h"
11
12namespace ccf::kv::untyped
13{
15 using SerialisedKeyHasher = std::hash<SerialisedEntry>;
16
20
22
24
25 // This is a map of keys and with a tuple of the key's write version and
26 // the version of last transaction which read the key and committed
27 // successfully
29 using Read = std::map<K, std::tuple<Version, LastReadVersion>>;
30
31 // This is a container for a write-set + dependencies. It can be applied to
32 // a given state, or used to track a set of operations on a state
34 {
35 protected:
36 ChangeSet() = default;
37
38 public:
39 const size_t rollback_counter = {};
43
44 Version read_version = NoVersion;
47
49 size_t rollbacks,
50 ccf::kv::untyped::State& current_state,
51 ccf::kv::untyped::State& committed_state,
52 ccf::kv::untyped::Write changed_writes,
53 Version current_version) :
54 rollback_counter(rollbacks),
55 state(current_state),
56 committed(committed_state),
57 start_version(current_version),
58 writes(std::move(changed_writes))
59 {}
60
61 ChangeSet(ChangeSet&) = delete;
62
63 [[nodiscard]] bool has_writes() const override
64 {
65 return !writes.empty();
66 }
67 };
68
69 using ChangeSetPtr = std::unique_ptr<ChangeSet>;
70
71 // This is a container for a snapshot. It has no dependencies as the snapshot
72 // obliterates the current state.
74 {
77
79 ccf::kv::untyped::State&& snapshot_state, Version version_) :
80 state(std::move(snapshot_state)),
81 version(version_)
82 {}
83
85
86 [[nodiscard]] bool has_writes() const override
87 {
88 return true;
89 }
90 };
91}
92
93namespace map
94{
95 template <>
98 {
99 return sizeof(uint64_t) + sizeof(data.version) + data.value.size();
100 }
101
102 template <>
104 const ccf::kv::untyped::VersionV& t, uint8_t*& data, size_t& size)
105 {
106 uint64_t data_size = sizeof(t.version) + t.value.size();
108 data,
109 size,
110 reinterpret_cast<const uint8_t*>(&data_size),
111 sizeof(uint64_t));
113 data,
114 size,
115 reinterpret_cast<const uint8_t*>(&t.version),
116 sizeof(t.version));
118 data,
119 size,
120 reinterpret_cast<const uint8_t*>(t.value.data()),
121 t.value.size());
122 return sizeof(uint64_t) + sizeof(t.version) + t.value.size();
123 }
124
125 template <>
127 const uint8_t*& data, size_t& size)
128 {
130 auto data_size = serialized::read<uint64_t>(data, size);
131 auto version = serialized::read<ccf::kv::Version>(data, size);
132 ret.version = version;
133 data_size -= sizeof(ccf::kv::Version);
134 ret.value.append(data, data + data_size);
135 serialized::skip(data, size, data_size);
136 return ret;
137 }
138
139 template <>
142 {
143 return sizeof(uint64_t) + data.size();
144 }
145
146 template <>
148 const ccf::kv::untyped::SerialisedEntry& t, uint8_t*& data, size_t& size)
149 {
150 uint64_t data_size = t.size();
152 data,
153 size,
154 reinterpret_cast<const uint8_t*>(&data_size),
155 sizeof(uint64_t));
157 data, size, reinterpret_cast<const uint8_t*>(t.data()), data_size);
158 return sizeof(uint64_t) + data_size;
159 }
160
161 template <>
163 ccf::kv::untyped::SerialisedEntry>(const uint8_t*& data, size_t& size)
164 {
165 auto data_size = serialized::read<uint64_t>(data, size);
167 ret.append(data, data + data_size);
168 serialized::skip(data, size, data_size);
169 return ret;
170 }
171}
Definition kv_types.h:542
Definition untyped.h:12
SerialisedEntry K
Definition untyped_change_set.h:17
ccf::ByteVector SerialisedEntry
Definition untyped_change_set.h:14
std::hash< SerialisedEntry > SerialisedKeyHasher
Definition untyped_change_set.h:15
SerialisedKeyHasher H
Definition untyped_change_set.h:19
std::map< ccf::kv::serialisers::SerialisedEntry, std::optional< ccf::kv::serialisers::SerialisedEntry > > Write
Definition untyped.h:16
std::unique_ptr< ChangeSet > ChangeSetPtr
Definition untyped_change_set.h:69
SerialisedEntry V
Definition untyped_change_set.h:18
Version LastReadVersion
Definition untyped_change_set.h:28
std::map< K, std::tuple< Version, LastReadVersion > > Read
Definition untyped_change_set.h:29
uint64_t Version
Definition version.h:10
llvm_vecsmall::SmallVector< uint8_t, CHAR_BIT > ByteVector
Definition byte_vector.h:15
Definition map_serializers.h:11
size_t serialize< ccf::kv::untyped::VersionV >(const ccf::kv::untyped::VersionV &t, uint8_t *&data, size_t &size)
Definition untyped_change_set.h:103
size_t serialize< ccf::kv::untyped::SerialisedEntry >(const ccf::kv::untyped::SerialisedEntry &t, uint8_t *&data, size_t &size)
Definition untyped_change_set.h:147
size_t get_size< ccf::kv::untyped::VersionV >(const ccf::kv::untyped::VersionV &data)
Definition untyped_change_set.h:96
T deserialize(const uint8_t *&data, size_t &size)
Definition map_serializers.h:62
size_t get_size< ccf::kv::untyped::SerialisedEntry >(const ccf::kv::untyped::SerialisedEntry &data)
Definition untyped_change_set.h:140
ccf::kv::untyped::VersionV deserialize< ccf::kv::untyped::VersionV >(const uint8_t *&data, size_t &size)
Definition untyped_change_set.h:126
void write(uint8_t *&data, size_t &size, const T &v)
Definition serialized.h:105
void skip(const uint8_t *&data, size_t &size, size_t skip)
Definition serialized.h:165
STL namespace.
Definition version_v.h:11
V value
Definition version_v.h:14
Version version
Definition version_v.h:12
Definition untyped_change_set.h:34
ccf::kv::untyped::Read reads
Definition untyped_change_set.h:45
const ccf::kv::untyped::State state
Definition untyped_change_set.h:40
const ccf::kv::untyped::State committed
Definition untyped_change_set.h:41
ChangeSet(ChangeSet &)=delete
ChangeSet(size_t rollbacks, ccf::kv::untyped::State &current_state, ccf::kv::untyped::State &committed_state, ccf::kv::untyped::Write changed_writes, Version current_version)
Definition untyped_change_set.h:48
const size_t rollback_counter
Definition untyped_change_set.h:39
bool has_writes() const override
Definition untyped_change_set.h:63
Version read_version
Definition untyped_change_set.h:44
const Version start_version
Definition untyped_change_set.h:42
ccf::kv::untyped::Write writes
Definition untyped_change_set.h:46
Definition untyped_change_set.h:74
SnapshotChangeSet(ccf::kv::untyped::State &&snapshot_state, Version version_)
Definition untyped_change_set.h:78
SnapshotChangeSet(SnapshotChangeSet &)=delete
const ccf::kv::untyped::State state
Definition untyped_change_set.h:75
bool has_writes() const override
Definition untyped_change_set.h:86
const Version version
Definition untyped_change_set.h:76