42 std::string& commit_evidence,
44 bool include_reads =
false)
47 throw std::logic_error(
"Transaction not yet committed");
50 throw std::logic_error(
"Transaction aborted");
52 if (claims_digest_.
empty())
53 throw std::logic_error(
"Missing claims");
56 const bool any_changes =
58 return it.second.changeset->has_writes();
66 auto e =
pimpl->store->get_encryptor();
72 auto commit_nonce = e->get_commit_nonce({
pimpl->commit_view,
version});
73 commit_evidence = fmt::format(
77 ccf::ds::to_hex(commit_nonce));
80 commit_evidence_digest = tx_commit_evidence_digest;
93 tx_commit_evidence_digest,
101 const auto&
map = it.second.map;
102 const auto& changeset = it.second.changeset;
103 if (
map->get_security_domain() == domain && changeset->has_writes())
105 map->serialise_changes(
106 changeset.get(), replicated_serialiser, include_reads);
112 return replicated_serialiser.get_raw_data();
133 std::function<std::tuple<Version, Version>(
bool has_new_map)>
134 version_resolver =
nullptr,
136 const std::vector<uint8_t>& write_set,
137 const std::string& commit_evidence)> write_set_observer =
nullptr)
140 throw std::logic_error(
"Transaction already committed");
151 const bool maps_created = !
pimpl->created_maps.empty();
154 this->
pimpl->store->lock_map_set();
159 std::optional<Version> new_maps_conflict_version = std::nullopt;
161 bool track_deletes_on_missing_keys =
false;
162 auto c = apply_changes(
164 version_resolver ==
nullptr ?
165 [&](
bool has_new_map) {
166 return pimpl->store->next_version(has_new_map);
171 new_maps_conflict_version,
172 track_deletes_on_missing_keys);
176 this->
pimpl->store->unlock_map_set();
179 success = c.has_value();
185 LOG_TRACE_FMT(
"Could not commit transaction due to conflict");
195 auto chunker =
pimpl->store->get_chunker();
198 chunker->force_end_of_chunk(
version);
204 pimpl->store->set_flag(
221 std::string commit_evidence;
223 serialise(commit_evidence_digest, commit_evidence, claims);
230 if (write_set_observer !=
nullptr)
232 write_set_observer(data, commit_evidence);
235 auto claims_ = claims;
237 return pimpl->store->commit(
239 std::make_unique<MovePendingTx>(
242 std::move(commit_evidence_digest),
246 catch (
const std::exception& e)
270 throw std::logic_error(
"Transaction not yet committed");
273 throw std::logic_error(
"Transaction aborted");
288 throw std::logic_error(
"Transaction not yet committed");
291 throw std::logic_error(
"Transaction aborted");
293 return pimpl->commit_view;
309 throw std::logic_error(
"Transaction not yet committed");
312 if (!
pimpl->read_txid.has_value())
323 return pimpl->read_txid.value();
337 pimpl->commit_view = term_;
342 pimpl->commit_view = view_;
357 if (
pimpl->read_txid.has_value())
359 throw std::logic_error(
"Read TxID already set");
361 pimpl->read_txid = tx_id;
362 pimpl->commit_view = commit_view_;
377 flags &= ~static_cast<TxFlags>(flag);
402 const TxID& reserved_tx_id,
407 pimpl->commit_view = reserved_tx_id.
term;
409 rollback_count = rollback_count_;
416 throw std::logic_error(
"Transaction already committed");
419 throw std::logic_error(
"Reserved transaction cannot be empty");
421 std::vector<ConsensusHookPtr> hooks;
422 bool track_deletes_on_missing_keys =
false;
423 auto c = apply_changes(
429 track_deletes_on_missing_keys,
434 throw std::logic_error(
"Failed to commit reserved transaction");
437 std::string commit_evidence;
442 if (
pimpl->store->should_create_ledger_chunk_unsafe(
version))
446 "Ending ledger chunk with signature at {}.{}",
450 auto chunker =
pimpl->store->get_chunker();
453 chunker->produced_chunk_at(
version);
458 auto claims = ccf::empty_claims();
459 auto data =
serialise(commit_evidence_digest, commit_evidence, claims);
465 std::move(commit_evidence_digest),
Definition claims_digest.h:10
bool empty() const
Definition claims_digest.h:33
Definition sha256_hash.h:16
Definition kv_types.h:680
@ SNAPSHOT_AT_NEXT_SIGNATURE
OrderedChanges all_changes
Definition tx.h:51
std::optional< ccf::crypto::Sha256Hash > root_at_read_version
Definition tx.h:53
std::unique_ptr< PrivateImpl > pimpl
Definition tx.h:49
Definition committable_tx.h:18
SerialisedEntryFlags entry_flags
Definition committable_tx.h:38
Version get_version()
Definition committable_tx.h:300
std::vector< uint8_t > serialise(ccf::crypto::Sha256Hash &commit_evidence_digest, std::string &commit_evidence, const ccf::ClaimsDigest &claims_digest_, bool include_reads=false)
Definition committable_tx.h:40
bool success
Definition committable_tx.h:31
std::optional< TxID > get_txid()
Definition committable_tx.h:305
bool committed
Definition committable_tx.h:30
Version version
Definition committable_tx.h:33
virtual void unset_tx_flag(TxFlag flag)
Definition committable_tx.h:375
void set_read_txid(const TxID &tx_id, Term commit_view_)
Definition committable_tx.h:355
TxFlag
Definition committable_tx.h:23
@ LEDGER_CHUNK_AT_NEXT_SIGNATURE
@ SNAPSHOT_AT_NEXT_SIGNATURE
@ LEDGER_CHUNK_BEFORE_THIS_TX
virtual bool tx_flag_enabled(TxFlag f) const
Definition committable_tx.h:380
const ccf::kv::TxHistory::RequestID & get_req_id()
Definition committable_tx.h:350
CommitResult commit(const ccf::ClaimsDigest &claims=ccf::empty_claims(), std::function< std::tuple< Version, Version >(bool has_new_map)> version_resolver=nullptr, std::function< void(const std::vector< uint8_t > &write_set, const std::string &commit_evidence)> write_set_observer=nullptr)
Definition committable_tx.h:131
uint8_t TxFlags
Definition committable_tx.h:20
void set_root_at_read_version(const ccf::crypto::Sha256Hash &r)
Definition committable_tx.h:365
void set_view(ccf::View view_)
Definition committable_tx.h:340
CommittableTx(AbstractStore *_store)
Definition committable_tx.h:116
TxFlags flags
Definition committable_tx.h:37
ccf::kv::TxHistory::RequestID req_id
Definition committable_tx.h:35
Version commit_version()
Definition committable_tx.h:267
void set_change_list(OrderedChanges &&change_list_, Term term_) override
Definition committable_tx.h:332
Version commit_term()
Definition committable_tx.h:285
void set_req_id(const ccf::kv::TxHistory::RequestID &req_id_)
Definition committable_tx.h:345
virtual void set_tx_flag(TxFlag flag)
Definition committable_tx.h:370
Definition generic_serialise_wrapper.h:20
Definition kv_types.h:354
Definition committable_tx.h:394
ReservedTx(AbstractStore *_store, Term read_term, const TxID &reserved_tx_id, Version rollback_count_)
Definition committable_tx.h:399
PendingTxInfo commit_reserved()
Definition committable_tx.h:413
std::tuple< size_t, size_t > RequestID
Definition kv_types.h:372
#define LOG_TRACE_FMT
Definition logger.h:356
#define LOG_DEBUG_FMT
Definition logger.h:357
#define LOG_FAIL_FMT
Definition logger.h:363
Definition app_interface.h:19
uint64_t Term
Definition kv_types.h:48
@ PRIVATE
Definition kv_types.h:257
@ PUBLIC
Definition kv_types.h:256
@ WriteSetWithCommitEvidenceAndClaims
uint64_t Version
Definition version.h:8
CommitResult
Definition kv_types.h:248
@ SUCCESS
Definition kv_types.h:249
@ FAIL_CONFLICT
Definition kv_types.h:250
uint8_t SerialisedEntryFlags
Definition serialised_entry_format.h:12
@ FORCE_LEDGER_CHUNK_BEFORE
Definition serialised_entry_format.h:17
@ FORCE_LEDGER_CHUNK_AFTER
Definition serialised_entry_format.h:16
std::map< std::string, MapChanges > OrderedChanges
Definition tx.h:41
std::vector< ConsensusHookPtr > ConsensusHookPtrs
Definition hooks.h:22
uint64_t View
Definition tx_id.h:23
Definition map_serializers.h:11
Definition apply_changes.h:19
Definition kv_types.h:487
Version version
Definition kv_types.h:54
Term term
Definition kv_types.h:53