mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-30 03:47:57 +00:00
Implement nested storage transactions (#6269)
* Add transactional storage functionality to OverlayChanges A collection already has a natural None state. No need to wrap it with an option. * Add storage transactions runtime interface * Add frame support for transactions * Fix committed typo * Rename 'changes' variable to 'overlay' * Fix renaming change * Fixed strange line break * Rename clear to clear_where * Add comment regarding delete value on mutation * Add comment which changes are covered by a transaction * Do force the arg to with_transaction return a Result * Use rust doc comments on every documentable place * Fix wording of insert_diry doc * Improve doc on start_transaction * Rename value to overlayed in close_transaction * Inline negation * Improve wording of close_transaction comments * Get rid of an expect by using get_or_insert_with * Remove trailing whitespace * Rename should to expected in tests * Rolling back a transaction must mark the overlay as dirty * Protect client initiated storage tx from being droped by runtime * Review nits * Return Err when entering or exiting runtime fails * Documentation fixup * Remove close type * Move enter/exit runtime to excute_aux in the state-machine * Rename Discard -> Rollback * Move child changeset creation to constructor * Move child spawning into the closure * Apply suggestions from code review Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com> * Fixup for code suggestion * Unify re-exports * Rename overlay_changes to mod.rs and move into subdir * Change proof wording * Adapt a new test from master to storage-tx * Suggestions from the latest round of review * Fix warning message Co-authored-by: Bastian Köcher <bkchr@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
6aa8965f33
commit
bb2df2122e
@@ -155,6 +155,46 @@ pub trait Storage {
|
||||
fn next_key(&mut self, key: &[u8]) -> Option<Vec<u8>> {
|
||||
self.next_storage_key(&key)
|
||||
}
|
||||
|
||||
/// Start a new nested transaction.
|
||||
///
|
||||
/// This allows to either commit or roll back all changes that are made after this call.
|
||||
/// For every transaction there must be a matching call to either `rollback_transaction`
|
||||
/// or `commit_transaction`. This is also effective for all values manipulated using the
|
||||
/// `DefaultChildStorage` API.
|
||||
///
|
||||
/// # Warning
|
||||
///
|
||||
/// This is a low level API that is potentially dangerous as it can easily result
|
||||
/// in unbalanced transactions. For example, FRAME users should use high level storage
|
||||
/// abstractions.
|
||||
fn start_transaction(&mut self) {
|
||||
self.storage_start_transaction();
|
||||
}
|
||||
|
||||
/// Rollback the last transaction started by `start_transaction`.
|
||||
///
|
||||
/// Any changes made during that transaction are discarded.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Will panic if there is no open transaction.
|
||||
fn rollback_transaction(&mut self) {
|
||||
self.storage_rollback_transaction()
|
||||
.expect("No open transaction that can be rolled back.");
|
||||
}
|
||||
|
||||
/// Commit the last transaction started by `start_transaction`.
|
||||
///
|
||||
/// Any changes made during that transaction are committed.
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// Will panic if there is no open transaction.
|
||||
fn commit_transaction(&mut self) {
|
||||
self.storage_commit_transaction()
|
||||
.expect("No open transaction that can be committed.");
|
||||
}
|
||||
}
|
||||
|
||||
/// Interface for accessing the child storage for default child trie,
|
||||
|
||||
Reference in New Issue
Block a user