16 using MapCollection = std::map<std::string, std::shared_ptr<AbstractMap>>;
31 bool tx_contains_new_map)>;
33 static inline std::optional<Version> apply_changes(
38 const std::optional<Version>& new_maps_conflict_version,
39 bool track_deletes_on_missing_keys,
40 const std::optional<Version>& expected_rollback_count = std::nullopt)
47 bool has_writes =
false;
49 std::map<std::string, std::unique_ptr<AbstractCommitter>> views;
50 for (
const auto& [map_name, mc] : changes)
52 views[map_name] = mc.map->create_committer(mc.changeset.get());
55 for (
auto it = changes.begin(); it != changes.end(); ++it)
57 has_writes |= it->second.changeset->has_writes();
58 it->second.map->lock();
63 if (expected_rollback_count.has_value() && !changes.empty())
68 auto store = changes.begin()->second.map->get_store();
78 ok = store->check_rollback_count(expected_rollback_count.value());
84 for (
auto it = views.begin(); it != views.end(); ++it)
86 if (!it->second->prepare())
94 for (
const auto& [map_name, map_ptr] : new_maps)
102 auto store = map_ptr->get_store();
107 if (new_maps_conflict_version.has_value())
109 current_v = *new_maps_conflict_version;
113 current_v = store->current_version();
116 if (store->get_map_unsafe(current_v, map_name) !=
nullptr)
123 if (ok && has_writes)
127 std::tie(version, version_last_new_map) =
128 version_resolver_fn(!new_maps.empty());
132 for (
const auto& [map_name, map_ptr] : new_maps)
134 const auto it = views.find(map_name);
135 if (it != views.end() && it->second->has_writes())
137 map_ptr->get_store()->add_dynamic_map(version, map_ptr);
141 for (
auto it = views.begin(); it != views.end(); ++it)
143 it->second->commit(version, track_deletes_on_missing_keys);
147 for (
auto it = views.begin(); it != views.end(); ++it)
149 auto hook_ptr = it->second->post_commit();
150 if (hook_ptr !=
nullptr)
152 hooks.push_back(std::move(hook_ptr));
157 for (
auto it = changes.begin(); it != changes.end(); ++it)
159 it->second.map->unlock();
Definition app_interface.h:19
uint64_t Term
Definition kv_types.h:48
uint64_t Version
Definition version.h:8
std::function< std::tuple< Version, VersionLastNewMap >(bool tx_contains_new_map)> VersionResolver
Definition apply_changes.h:31
Version VersionLastNewMap
Definition apply_changes.h:29
std::map< std::string, std::shared_ptr< AbstractMap > > MapCollection
Definition apply_changes.h:16
std::map< std::string, MapChanges > OrderedChanges
Definition tx.h:41
std::vector< ConsensusHookPtr > ConsensusHookPtrs
Definition hooks.h:22
Definition apply_changes.h:19
virtual ~AbstractChangeContainer()=default
virtual void set_change_list(OrderedChanges &&change_list, Term term)=0