punish by node id
This commit is contained in:
@@ -90,6 +90,9 @@ pub struct BucketEntryInner {
|
||||
/// The accounting for the transfer statistics
|
||||
#[serde(skip)]
|
||||
transfer_stats_accounting: TransferStatsAccounting,
|
||||
/// If the entry is being punished and should be considered dead
|
||||
#[serde(skip)]
|
||||
is_punished: bool,
|
||||
/// Tracking identifier for NodeRef debugging
|
||||
#[cfg(feature = "tracking")]
|
||||
#[serde(skip)]
|
||||
@@ -403,6 +406,10 @@ impl BucketEntryInner {
|
||||
|
||||
// Stores a connection descriptor in this entry's table of last connections
|
||||
pub fn set_last_connection(&mut self, last_connection: ConnectionDescriptor, timestamp: Timestamp) {
|
||||
if self.is_punished {
|
||||
// Don't record connection if this entry is currently punished
|
||||
return;
|
||||
}
|
||||
let key = self.descriptor_to_key(last_connection);
|
||||
self.last_connections
|
||||
.insert(key, (last_connection, timestamp));
|
||||
@@ -531,6 +538,9 @@ impl BucketEntryInner {
|
||||
}
|
||||
|
||||
pub fn state(&self, cur_ts: Timestamp) -> BucketEntryState {
|
||||
if self.is_punished {
|
||||
return BucketEntryState::Dead;
|
||||
}
|
||||
if self.check_reliable(cur_ts) {
|
||||
BucketEntryState::Reliable
|
||||
} else if self.check_dead(cur_ts) {
|
||||
@@ -539,6 +549,12 @@ impl BucketEntryInner {
|
||||
BucketEntryState::Unreliable
|
||||
}
|
||||
}
|
||||
pub fn set_punished(&mut self, punished: bool) {
|
||||
self.is_punished = punished;
|
||||
if punished {
|
||||
self.clear_last_connections();
|
||||
}
|
||||
}
|
||||
|
||||
pub fn peer_stats(&self) -> &PeerStats {
|
||||
&self.peer_stats
|
||||
@@ -845,6 +861,7 @@ impl BucketEntry {
|
||||
},
|
||||
latency_stats_accounting: LatencyStatsAccounting::new(),
|
||||
transfer_stats_accounting: TransferStatsAccounting::new(),
|
||||
is_punished: false,
|
||||
#[cfg(feature = "tracking")]
|
||||
next_track_id: 0,
|
||||
#[cfg(feature = "tracking")]
|
||||
|
@@ -1 +1,29 @@
|
||||
use super::*;
|
||||
|
||||
pub mod test_serialize_routing_table;
|
||||
|
||||
pub(crate) fn mock_routing_table() -> routing_table::RoutingTable {
|
||||
let veilid_config = VeilidConfig::new();
|
||||
#[cfg(feature = "unstable-blockstore")]
|
||||
let block_store = BlockStore::new(veilid_config.clone());
|
||||
let protected_store = ProtectedStore::new(veilid_config.clone());
|
||||
let table_store = TableStore::new(veilid_config.clone(), protected_store.clone());
|
||||
let crypto = Crypto::new(veilid_config.clone(), table_store.clone());
|
||||
let storage_manager = storage_manager::StorageManager::new(
|
||||
veilid_config.clone(),
|
||||
crypto.clone(),
|
||||
table_store.clone(),
|
||||
#[cfg(feature = "unstable-blockstore")]
|
||||
block_store.clone(),
|
||||
);
|
||||
let network_manager = network_manager::NetworkManager::new(
|
||||
veilid_config.clone(),
|
||||
storage_manager,
|
||||
protected_store.clone(),
|
||||
table_store.clone(),
|
||||
#[cfg(feature = "unstable-blockstore")]
|
||||
block_store.clone(),
|
||||
crypto.clone(),
|
||||
);
|
||||
RoutingTable::new(network_manager)
|
||||
}
|
||||
|
@@ -1,35 +1,8 @@
|
||||
use crate::*;
|
||||
use routing_table::*;
|
||||
|
||||
fn fake_routing_table() -> routing_table::RoutingTable {
|
||||
let veilid_config = VeilidConfig::new();
|
||||
#[cfg(feature = "unstable-blockstore")]
|
||||
let block_store = BlockStore::new(veilid_config.clone());
|
||||
let protected_store = ProtectedStore::new(veilid_config.clone());
|
||||
let table_store = TableStore::new(veilid_config.clone(), protected_store.clone());
|
||||
let crypto = Crypto::new(veilid_config.clone(), table_store.clone());
|
||||
let storage_manager = storage_manager::StorageManager::new(
|
||||
veilid_config.clone(),
|
||||
crypto.clone(),
|
||||
table_store.clone(),
|
||||
#[cfg(feature = "unstable-blockstore")]
|
||||
block_store.clone(),
|
||||
);
|
||||
let network_manager = network_manager::NetworkManager::new(
|
||||
veilid_config.clone(),
|
||||
storage_manager,
|
||||
protected_store.clone(),
|
||||
table_store.clone(),
|
||||
#[cfg(feature = "unstable-blockstore")]
|
||||
block_store.clone(),
|
||||
crypto.clone(),
|
||||
);
|
||||
RoutingTable::new(network_manager)
|
||||
}
|
||||
use super::*;
|
||||
|
||||
pub async fn test_routingtable_buckets_round_trip() {
|
||||
let original = fake_routing_table();
|
||||
let copy = fake_routing_table();
|
||||
let original = mock_routing_table();
|
||||
let copy = mock_routing_table();
|
||||
original.init().await.unwrap();
|
||||
copy.init().await.unwrap();
|
||||
|
||||
|
Reference in New Issue
Block a user