Просмотр исходного кода

darkfid/task/unknown_proposal: purge peer fork new sled trees on failures

skoupidi 7 месяцев назад
Родитель
Сommit
b38512a982
2 измененных файлов с 20 добавлено и 1 удалено
  1. 11 0
      bin/darkfid/src/task/unknown_proposal.rs
  2. 9 1
      src/validator/consensus.rs

+ 11 - 0
bin/darkfid/src/task/unknown_proposal.rs

@@ -484,6 +484,7 @@ async fn handle_reorg(
         Ok(i) => i,
         Err(e) => {
             error!(target: "darkfid::task::handle_reorg", "Retrieving state inverse diffs failed: {e}");
+            peer_fork.purge_new_trees();
             return false
         }
     };
@@ -492,6 +493,7 @@ async fn handle_reorg(
             peer_fork.overlay.lock().unwrap().overlay.lock().unwrap().add_diff(inverse_diff)
         {
             error!(target: "darkfid::task::handle_reorg", "Applying inverse diff failed: {e}");
+            peer_fork.purge_new_trees();
             return false
         }
     }
@@ -499,6 +501,7 @@ async fn handle_reorg(
     // Rebuild fork contracts states monotree
     if let Err(e) = peer_fork.compute_monotree() {
         error!(target: "darkfid::task::handle_reorg", "Rebuilding peer fork monotree failed: {e}");
+        peer_fork.purge_new_trees();
         return false
     }
 
@@ -519,6 +522,7 @@ async fn handle_reorg(
         let request = ForkProposalsRequest { headers: batch.clone(), fork_header: proposal.hash };
         if let Err(e) = channel.send(&request).await {
             debug!(target: "darkfid::task::handle_reorg", "Channel send failed: {e}");
+            peer_fork.purge_new_trees();
             return true
         };
 
@@ -530,6 +534,7 @@ async fn handle_reorg(
             Ok(r) => r,
             Err(e) => {
                 debug!(target: "darkfid::task::handle_reorg", "Asking peer for proposals sequence failed: {e}");
+                peer_fork.purge_new_trees();
                 return true
             }
         };
@@ -538,6 +543,7 @@ async fn handle_reorg(
         // Response sequence must be the same length as the one requested
         if response.proposals.len() != batch.len() {
             debug!(target: "darkfid::task::handle_reorg", "Peer responded with a different proposals sequence length");
+            peer_fork.purge_new_trees();
             return true
         }
 
@@ -548,6 +554,7 @@ async fn handle_reorg(
             // Validate its the proposal we requested
             if peer_proposal.hash != batch[peer_proposal_index] {
                 error!(target: "darkfid::task::handle_reorg", "Peer responded with a differend proposal: {} - {}", batch[peer_proposal_index], peer_proposal.hash);
+                peer_fork.purge_new_trees();
                 return true
             }
 
@@ -562,6 +569,7 @@ async fn handle_reorg(
             // Append proposal
             if let Err(e) = peer_fork.append_proposal(peer_proposal).await {
                 error!(target: "darkfid::task::handle_reorg", "Appending proposal failed: {e}");
+                peer_fork.purge_new_trees();
                 return true
             }
         }
@@ -582,6 +590,7 @@ async fn handle_reorg(
     // Append trigger proposal
     if let Err(e) = peer_fork.append_proposal(proposal).await {
         error!(target: "darkfid::task::handle_reorg", "Appending proposal failed: {e}");
+        peer_fork.purge_new_trees();
         return true
     }
 
@@ -591,6 +600,7 @@ async fn handle_reorg(
         Ok(i) => i,
         Err(e) => {
             debug!(target: "darkfid::task::handle_reorg", "Retrieving best fork index failed: {e}");
+            peer_fork.purge_new_trees();
             return false
         }
     };
@@ -600,6 +610,7 @@ async fn handle_reorg(
             peer_fork.hashes_rank <= best_fork.hashes_rank)
     {
         info!(target: "darkfid::task::handle_reorg", "Peer fork ranks lower than our current best fork, skipping...");
+        peer_fork.purge_new_trees();
         drop(forks);
         return true
     }

+ 9 - 1
src/validator/consensus.rs

@@ -27,7 +27,7 @@ use darkfi_serial::{async_trait, SerialDecodable, SerialEncodable};
 use num_bigint::BigUint;
 use sled_overlay::database::SledDbOverlayStateDiff;
 use smol::lock::RwLock;
-use tracing::{debug, info, warn};
+use tracing::{debug, error, info, warn};
 
 use crate::{
     blockchain::{
@@ -1005,4 +1005,12 @@ impl Fork {
 
         Ok(())
     }
+
+    /// Auxiliary function to purge all new trees from the fork
+    /// overlay.
+    pub fn purge_new_trees(&self) {
+        if let Err(e) = self.overlay.lock().unwrap().overlay.lock().unwrap().purge_new_trees() {
+            error!(target: "validator::consensus::fork::purge_new_trees", "Purging new trees in the overlay failed: {e}");
+        }
+    }
 }