Skip to content

Commit

Permalink
Fix significant drop in match scrutinee
Browse files Browse the repository at this point in the history
  • Loading branch information
teor2345 committed Jun 7, 2022
1 parent 00aa64a commit 3b895cd
Show file tree
Hide file tree
Showing 4 changed files with 15 additions and 6 deletions.
3 changes: 2 additions & 1 deletion zebra-chain/src/orchard/tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -335,7 +335,8 @@ impl NoteCommitmentTree {
.cached_root
.write()
.expect("a thread that previously held exclusive lock access panicked");
match *write_root {
let read_root = write_root.as_ref().cloned();
match read_root {
// Another thread got write access first, return cached root.
Some(root) => root,
None => {
Expand Down
3 changes: 2 additions & 1 deletion zebra-chain/src/sapling/tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,8 @@ impl NoteCommitmentTree {
.cached_root
.write()
.expect("a thread that previously held exclusive lock access panicked");
match *write_root {
let read_root = write_root.as_ref().cloned();
match read_root {
// Another thread got write access first, return cached root.
Some(root) => root,
None => {
Expand Down
3 changes: 2 additions & 1 deletion zebra-chain/src/sprout/tree.rs
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,8 @@ impl NoteCommitmentTree {
.cached_root
.write()
.expect("a thread that previously held exclusive lock access panicked");
match *write_root {
let read_root = write_root.as_ref().cloned();
match read_root {
// Another thread got write access first, return cached root.
Some(root) => root,
None => {
Expand Down
12 changes: 9 additions & 3 deletions zebra-state/src/service/chain_tip.rs
Original file line number Diff line number Diff line change
Expand Up @@ -195,12 +195,18 @@ impl ChainTipSender {
// a read-lock being created and living beyond the `self.sender.send(..)` call. If that
// happens, the `send` method will attempt to obtain a write-lock and will dead-lock.
// Without the binding, the guard is dropped at the end of the expression.
let needs_update = match (new_tip.as_ref(), self.sender.borrow().as_ref()) {
let active_hash = self
.sender
.borrow()
.as_ref()
.map(|active_value| active_value.hash);

let needs_update = match (new_tip.as_ref(), active_hash) {
// since the blocks have been contextually validated,
// we know their hashes cover all the block data
(Some(new_tip), Some(active_value)) => new_tip.hash != active_value.hash,
(Some(new_tip), Some(active_hash)) => new_tip.hash != active_hash,
(Some(_new_tip), None) => true,
(None, _active_value) => false,
(None, _active_value_hash) => false,
};

if needs_update {
Expand Down

0 comments on commit 3b895cd

Please sign in to comment.