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 "kv/kv_types.h"
9#include "kv/version_v.h"
10
11#ifndef KV_STATE_RB
12# include "ds/champ_map.h"
13#else
14# include "ds/rb_map.h"
15#endif
16
17namespace ccf::kv::untyped
18{
20 using SerialisedKeyHasher = std::hash<SerialisedEntry>;
21
25
27
28#ifndef KV_STATE_RB
30#else
32#endif
33
34 // This is a map of keys and with a tuple of the key's write version and
35 // the version of last transaction which read the key and committed
36 // successfully
38 using Read = std::map<K, std::tuple<Version, LastReadVersion>>;
39
40 // This is a container for a write-set + dependencies. It can be applied to
41 // a given state, or used to track a set of operations on a state
43 {
44 protected:
46
47 public:
48 const size_t rollback_counter = {};
52
53 Version read_version = NoVersion;
56
58 size_t rollbacks,
59 ccf::kv::untyped::State& current_state,
60 ccf::kv::untyped::State& committed_state,
61 ccf::kv::untyped::Write changed_writes,
62 Version current_version) :
63 rollback_counter(rollbacks),
64 state(current_state),
65 committed(committed_state),
66 start_version(current_version),
67 writes(changed_writes)
68 {}
69
70 ChangeSet(ChangeSet&) = delete;
71
72 bool has_writes() const override
73 {
74 return !writes.empty();
75 }
76 };
77
78 using ChangeSetPtr = std::unique_ptr<ChangeSet>;
79
80 // This is a container for a snapshot. It has no dependencies as the snapshot
81 // obliterates the current state.
83 {
86
88 ccf::kv::untyped::State&& snapshot_state, Version version_) :
89 state(std::move(snapshot_state)),
90 version(version_)
91 {}
92
94
95 bool has_writes() const override
96 {
97 return true;
98 }
99 };
100}
101
102namespace map
103{
104 template <>
106 const ccf::kv::untyped::VersionV& data)
107 {
108 return sizeof(uint64_t) + sizeof(data.version) + data.value.size();
109 }
110
111 template <>
113 const ccf::kv::untyped::VersionV& t, uint8_t*& data, size_t& size)
114 {
115 uint64_t data_size = sizeof(t.version) + t.value.size();
117 data,
118 size,
119 reinterpret_cast<const uint8_t*>(&data_size),
120 sizeof(uint64_t));
122 data,
123 size,
124 reinterpret_cast<const uint8_t*>(&t.version),
125 sizeof(t.version));
127 data,
128 size,
129 reinterpret_cast<const uint8_t*>(t.value.data()),
130 t.value.size());
131 return sizeof(uint64_t) + sizeof(t.version) + t.value.size();
132 }
133
134 template <>
136 const uint8_t*& data, size_t& size)
137 {
139 uint64_t data_size = serialized::read<uint64_t>(data, size);
140 ccf::kv::Version version = serialized::read<ccf::kv::Version>(data, size);
141 ret.version = version;
142 data_size -= sizeof(ccf::kv::Version);
143 ret.value.append(data, data + data_size);
144 serialized::skip(data, size, data_size);
145 return ret;
146 }
147
148 template <>
151 {
152 return sizeof(uint64_t) + data.size();
153 }
154
155 template <>
157 const ccf::kv::untyped::SerialisedEntry& t, uint8_t*& data, size_t& size)
158 {
159 uint64_t data_size = t.size();
161 data,
162 size,
163 reinterpret_cast<const uint8_t*>(&data_size),
164 sizeof(uint64_t));
166 data, size, reinterpret_cast<const uint8_t*>(t.data()), data_size);
167 return sizeof(uint64_t) + data_size;
168 }
169
170 template <>
172 ccf::kv::untyped::SerialisedEntry>(const uint8_t*& data, size_t& size)
173 {
174 uint64_t data_size = serialized::read<uint64_t>(data, size);
176 ret.append(data, data + data_size);
177 serialized::skip(data, size, data_size);
178 return ret;
179 }
180}
Definition kv_types.h:590
Definition rb_map.h:19
Definition untyped.h:12
SerialisedEntry K
Definition untyped_change_set.h:22
ccf::ByteVector SerialisedEntry
Definition untyped_change_set.h:19
std::hash< SerialisedEntry > SerialisedKeyHasher
Definition untyped_change_set.h:20
SerialisedKeyHasher H
Definition untyped_change_set.h:24
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:78
SerialisedEntry V
Definition untyped_change_set.h:23
Version LastReadVersion
Definition untyped_change_set.h:37
std::map< K, std::tuple< Version, LastReadVersion > > Read
Definition untyped_change_set.h:38
uint64_t Version
Definition version.h:8
llvm_vecsmall::SmallVector< uint8_t, 8 > ByteVector
Definition byte_vector.h:14
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:112
size_t serialize< ccf::kv::untyped::SerialisedEntry >(const ccf::kv::untyped::SerialisedEntry &t, uint8_t *&data, size_t &size)
Definition untyped_change_set.h:156
size_t get_size< ccf::kv::untyped::VersionV >(const ccf::kv::untyped::VersionV &data)
Definition untyped_change_set.h:105
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:149
ccf::kv::untyped::VersionV deserialize< ccf::kv::untyped::VersionV >(const uint8_t *&data, size_t &size)
Definition untyped_change_set.h:135
void write(uint8_t *&data, size_t &size, const T &v)
Definition serialized.h:106
void skip(const uint8_t *&data, size_t &size, size_t skip)
Definition serialized.h:166
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:43
ccf::kv::untyped::Read reads
Definition untyped_change_set.h:54
const ccf::kv::untyped::State state
Definition untyped_change_set.h:49
const ccf::kv::untyped::State committed
Definition untyped_change_set.h:50
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:57
const size_t rollback_counter
Definition untyped_change_set.h:48
bool has_writes() const override
Definition untyped_change_set.h:72
Version read_version
Definition untyped_change_set.h:53
const Version start_version
Definition untyped_change_set.h:51
ChangeSet()
Definition untyped_change_set.h:45
ccf::kv::untyped::Write writes
Definition untyped_change_set.h:55
Definition untyped_change_set.h:83
SnapshotChangeSet(ccf::kv::untyped::State &&snapshot_state, Version version_)
Definition untyped_change_set.h:87
SnapshotChangeSet(SnapshotChangeSet &)=delete
const ccf::kv::untyped::State state
Definition untyped_change_set.h:84
bool has_writes() const override
Definition untyped_change_set.h:95
const Version version
Definition untyped_change_set.h:85