mirror of
https://github.com/mimblewimble/grin.git
synced 2025-02-08 12:21:09 +03:00
no need for write lock on txhashset for chain.is_unspent() (#2066)
* no need for write lock on txhashset * commit
This commit is contained in:
parent
8bad93c8c9
commit
a24d613b05
3 changed files with 19 additions and 5 deletions
|
@ -438,7 +438,7 @@ impl Chain {
|
||||||
/// current chain state, specifically the current winning (valid, most
|
/// current chain state, specifically the current winning (valid, most
|
||||||
/// work) fork.
|
/// work) fork.
|
||||||
pub fn is_unspent(&self, output_ref: &OutputIdentifier) -> Result<Hash, Error> {
|
pub fn is_unspent(&self, output_ref: &OutputIdentifier) -> Result<Hash, Error> {
|
||||||
let mut txhashset = self.txhashset.write();
|
let txhashset = self.txhashset.read();
|
||||||
let res = txhashset.is_unspent(output_ref);
|
let res = txhashset.is_unspent(output_ref);
|
||||||
match res {
|
match res {
|
||||||
Err(e) => Err(e),
|
Err(e) => Err(e),
|
||||||
|
@ -1096,7 +1096,7 @@ impl Chain {
|
||||||
output_ref: &OutputIdentifier,
|
output_ref: &OutputIdentifier,
|
||||||
) -> Result<BlockHeader, Error> {
|
) -> Result<BlockHeader, Error> {
|
||||||
let pos = {
|
let pos = {
|
||||||
let mut txhashset = self.txhashset.write();
|
let txhashset = self.txhashset.read();
|
||||||
let (_, pos) = txhashset.is_unspent(output_ref)?;
|
let (_, pos) = txhashset.is_unspent(output_ref)?;
|
||||||
pos
|
pos
|
||||||
};
|
};
|
||||||
|
|
|
@ -160,11 +160,11 @@ impl TxHashSet {
|
||||||
/// Check if an output is unspent.
|
/// Check if an output is unspent.
|
||||||
/// We look in the index to find the output MMR pos.
|
/// We look in the index to find the output MMR pos.
|
||||||
/// Then we check the entry in the output MMR and confirm the hash matches.
|
/// Then we check the entry in the output MMR and confirm the hash matches.
|
||||||
pub fn is_unspent(&mut self, output_id: &OutputIdentifier) -> Result<(Hash, u64), Error> {
|
pub fn is_unspent(&self, output_id: &OutputIdentifier) -> Result<(Hash, u64), Error> {
|
||||||
match self.commit_index.get_output_pos(&output_id.commit) {
|
match self.commit_index.get_output_pos(&output_id.commit) {
|
||||||
Ok(pos) => {
|
Ok(pos) => {
|
||||||
let output_pmmr: PMMR<Output, _> =
|
let output_pmmr: ReadonlyPMMR<Output, _> =
|
||||||
PMMR::at(&mut self.output_pmmr_h.backend, self.output_pmmr_h.last_pos);
|
ReadonlyPMMR::at(&self.output_pmmr_h.backend, self.output_pmmr_h.last_pos);
|
||||||
if let Some(hash) = output_pmmr.get_hash(pos) {
|
if let Some(hash) = output_pmmr.get_hash(pos) {
|
||||||
if hash == output_id.hash_with_index(pos - 1) {
|
if hash == output_id.hash_with_index(pos - 1) {
|
||||||
Ok((hash, pos))
|
Ok((hash, pos))
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
use std::marker;
|
use std::marker;
|
||||||
|
|
||||||
|
use core::hash::Hash;
|
||||||
use core::pmmr::{is_leaf, Backend};
|
use core::pmmr::{is_leaf, Backend};
|
||||||
use ser::PMMRable;
|
use ser::PMMRable;
|
||||||
|
|
||||||
|
@ -70,4 +71,17 @@ where
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Get the hash at provided position in the MMR.
|
||||||
|
pub fn get_hash(&self, pos: u64) -> Option<Hash> {
|
||||||
|
if pos > self.last_pos {
|
||||||
|
None
|
||||||
|
} else if is_leaf(pos) {
|
||||||
|
// If we are a leaf then get hash from the backend.
|
||||||
|
self.backend.get_hash(pos)
|
||||||
|
} else {
|
||||||
|
// If we are not a leaf get hash ignoring the remove log.
|
||||||
|
self.backend.get_from_file(pos)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue