mirror of
https://github.com/pezkuwichain/pezkuwi-subxt.git
synced 2026-04-26 18:07:58 +00:00
ProofRecorder: Implement transactional support (#13769)
* TrieRecorder: Start adding support for transactions * Adds `transactions` functions and some test * More tests * Docs * Ensure that we rollback failed transactions in the storage proof * FMT * Update primitives/trie/src/recorder.rs Co-authored-by: Dmitry Markin <dmitry@markin.tech> * Review comments * Update primitives/trie/src/recorder.rs Co-authored-by: Sebastian Kunert <skunert49@gmail.com> * ".git/.scripts/commands/fmt/fmt.sh" * For the holy clippy! * Update primitives/trie/src/recorder.rs Co-authored-by: Anton <anton.kalyaev@gmail.com> --------- Co-authored-by: Dmitry Markin <dmitry@markin.tech> Co-authored-by: Sebastian Kunert <skunert49@gmail.com> Co-authored-by: command-bot <> Co-authored-by: Anton <anton.kalyaev@gmail.com>
This commit is contained in:
@@ -243,7 +243,8 @@ fn generate_runtime_api_base_structures() -> Result<TokenStream> {
|
||||
&self,
|
||||
call: F,
|
||||
) -> R where Self: Sized {
|
||||
#crate_::OverlayedChanges::start_transaction(&mut std::cell::RefCell::borrow_mut(&self.changes));
|
||||
self.start_transaction();
|
||||
|
||||
*std::cell::RefCell::borrow_mut(&self.commit_on_success) = false;
|
||||
let res = call(self);
|
||||
*std::cell::RefCell::borrow_mut(&self.commit_on_success) = true;
|
||||
@@ -347,18 +348,51 @@ fn generate_runtime_api_base_structures() -> Result<TokenStream> {
|
||||
transactions; qed";
|
||||
if *std::cell::RefCell::borrow(&self.commit_on_success) {
|
||||
let res = if commit {
|
||||
#crate_::OverlayedChanges::commit_transaction(
|
||||
let res = if let Some(recorder) = &self.recorder {
|
||||
#crate_::ProofRecorder::<Block>::commit_transaction(&recorder)
|
||||
} else {
|
||||
Ok(())
|
||||
};
|
||||
|
||||
let res2 = #crate_::OverlayedChanges::commit_transaction(
|
||||
&mut std::cell::RefCell::borrow_mut(&self.changes)
|
||||
)
|
||||
);
|
||||
|
||||
// Will panic on an `Err` below, however we should call commit
|
||||
// on the recorder and the changes together.
|
||||
std::result::Result::and(res, std::result::Result::map_err(res2, drop))
|
||||
} else {
|
||||
#crate_::OverlayedChanges::rollback_transaction(
|
||||
let res = if let Some(recorder) = &self.recorder {
|
||||
#crate_::ProofRecorder::<Block>::rollback_transaction(&recorder)
|
||||
} else {
|
||||
Ok(())
|
||||
};
|
||||
|
||||
let res2 = #crate_::OverlayedChanges::rollback_transaction(
|
||||
&mut std::cell::RefCell::borrow_mut(&self.changes)
|
||||
)
|
||||
);
|
||||
|
||||
// Will panic on an `Err` below, however we should call commit
|
||||
// on the recorder and the changes together.
|
||||
std::result::Result::and(res, std::result::Result::map_err(res2, drop))
|
||||
};
|
||||
|
||||
std::result::Result::expect(res, proof);
|
||||
}
|
||||
}
|
||||
|
||||
fn start_transaction(&self) {
|
||||
if !*std::cell::RefCell::borrow(&self.commit_on_success) {
|
||||
return
|
||||
}
|
||||
|
||||
#crate_::OverlayedChanges::start_transaction(
|
||||
&mut std::cell::RefCell::borrow_mut(&self.changes)
|
||||
);
|
||||
if let Some(recorder) = &self.recorder {
|
||||
#crate_::ProofRecorder::<Block>::start_transaction(&recorder);
|
||||
}
|
||||
}
|
||||
}
|
||||
))
|
||||
}
|
||||
@@ -450,11 +484,7 @@ impl<'a> ApiRuntimeImplToApiRuntimeApiImpl<'a> {
|
||||
params: std::vec::Vec<u8>,
|
||||
fn_name: &dyn Fn(#crate_::RuntimeVersion) -> &'static str,
|
||||
) -> std::result::Result<std::vec::Vec<u8>, #crate_::ApiError> {
|
||||
if *std::cell::RefCell::borrow(&self.commit_on_success) {
|
||||
#crate_::OverlayedChanges::start_transaction(
|
||||
&mut std::cell::RefCell::borrow_mut(&self.changes)
|
||||
);
|
||||
}
|
||||
self.start_transaction();
|
||||
|
||||
let res = (|| {
|
||||
let version = #crate_::CallApiAt::<__SrApiBlock__>::runtime_version_at(
|
||||
|
||||
Reference in New Issue
Block a user