Use TimedCache to avoid OOM (#39)
* use TimedCache to avoid OOM * add comment
This commit is contained in:
parent
c220497ffb
commit
2e85190a22
|
@ -26,3 +26,4 @@ multiaddr = "0.18"
|
||||||
sha2 = "0.10"
|
sha2 = "0.10"
|
||||||
uuid = { version = "1", features = ["fast-rng", "v4"] }
|
uuid = { version = "1", features = ["fast-rng", "v4"] }
|
||||||
tracing-appender = "0.2"
|
tracing-appender = "0.2"
|
||||||
|
cached = "0.54.0"
|
||||||
|
|
|
@ -76,7 +76,7 @@ pub fn config_tracing(
|
||||||
}
|
}
|
||||||
|
|
||||||
tracing_subscriber::registry()
|
tracing_subscriber::registry()
|
||||||
.with(LevelFilter::from(Level::DEBUG))
|
.with(LevelFilter::from(Level::INFO))
|
||||||
.with(layers)
|
.with(layers)
|
||||||
.init();
|
.init();
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ pub mod state;
|
||||||
pub mod stream_wrapper;
|
pub mod stream_wrapper;
|
||||||
|
|
||||||
use crate::node::mix::consensus_streams::{Epoch, Slot};
|
use crate::node::mix::consensus_streams::{Epoch, Slot};
|
||||||
|
use cached::{Cached, TimedCache};
|
||||||
use crossbeam::channel;
|
use crossbeam::channel;
|
||||||
use futures::Stream;
|
use futures::Stream;
|
||||||
use lottery::StakeLottery;
|
use lottery::StakeLottery;
|
||||||
|
@ -35,7 +36,7 @@ use scheduler::{Interval, TemporalRelease};
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use sha2::{Digest, Sha256};
|
use sha2::{Digest, Sha256};
|
||||||
use state::MixnodeState;
|
use state::MixnodeState;
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::HashMap;
|
||||||
use std::{pin::pin, task::Poll, time::Duration};
|
use std::{pin::pin, task::Poll, time::Duration};
|
||||||
use stream_wrapper::CrossbeamReceiverStream;
|
use stream_wrapper::CrossbeamReceiverStream;
|
||||||
|
|
||||||
|
@ -70,7 +71,7 @@ pub struct MixNode {
|
||||||
state: MixnodeState,
|
state: MixnodeState,
|
||||||
settings: MixnodeSettings,
|
settings: MixnodeSettings,
|
||||||
network_interface: InMemoryNetworkInterface<MixMessage>,
|
network_interface: InMemoryNetworkInterface<MixMessage>,
|
||||||
message_cache: HashSet<Sha256Hash>,
|
message_cache: TimedCache<Sha256Hash, ()>,
|
||||||
|
|
||||||
data_msg_lottery_update_time_sender: channel::Sender<Duration>,
|
data_msg_lottery_update_time_sender: channel::Sender<Duration>,
|
||||||
data_msg_lottery_interval: Interval,
|
data_msg_lottery_interval: Interval,
|
||||||
|
@ -185,7 +186,9 @@ impl MixNode {
|
||||||
Self {
|
Self {
|
||||||
id,
|
id,
|
||||||
network_interface,
|
network_interface,
|
||||||
message_cache: HashSet::new(),
|
// We're not coupling this lifespan with the steps now, but it's okay
|
||||||
|
// We expected that a message will be delivered to most of nodes within 60s.
|
||||||
|
message_cache: TimedCache::with_lifespan(60),
|
||||||
settings,
|
settings,
|
||||||
state: MixnodeState {
|
state: MixnodeState {
|
||||||
node_id: id,
|
node_id: id,
|
||||||
|
@ -210,7 +213,11 @@ impl MixNode {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn forward(&mut self, message: MixMessage, exclude_node: Option<NodeId>) {
|
fn forward(&mut self, message: MixMessage, exclude_node: Option<NodeId>) {
|
||||||
if !self.message_cache.insert(Self::sha256(&message.0)) {
|
if self
|
||||||
|
.message_cache
|
||||||
|
.cache_set(Self::sha256(&message.0), ())
|
||||||
|
.is_some()
|
||||||
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
for node_id in self
|
for node_id in self
|
||||||
|
@ -229,7 +236,11 @@ impl MixNode {
|
||||||
.receive_messages()
|
.receive_messages()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
// Retain only messages that have not been seen before
|
// Retain only messages that have not been seen before
|
||||||
.filter(|msg| self.message_cache.insert(Self::sha256(&msg.payload().0)))
|
.filter(|msg| {
|
||||||
|
self.message_cache
|
||||||
|
.cache_set(Self::sha256(&msg.payload().0), ())
|
||||||
|
.is_none()
|
||||||
|
})
|
||||||
.collect()
|
.collect()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue