use prometrics::metrics::MetricBuilder;
use std::time::Duration;
use super::long_queue_policy::LongQueuePolicy;
use super::thread::DeviceThread;
use super::{Device, DeviceHandle};
use nvm::NonVolatileMemory;
use slog::{Discard, Logger};
use storage::Storage;
use Result;
#[derive(Debug, Clone)]
pub struct DeviceBuilder {
pub(crate) metrics: MetricBuilder,
pub(crate) idle_threshold: Duration,
pub(crate) max_queue_len: usize,
pub(crate) max_keep_busy_duration: Duration,
pub(crate) busy_threshold: usize,
pub(crate) logger: Logger,
pub(crate) long_queue_policy: LongQueuePolicy,
}
impl DeviceBuilder {
pub fn new() -> Self {
DeviceBuilder {
metrics: MetricBuilder::new(),
idle_threshold: Duration::from_millis(100),
max_queue_len: 100_000,
max_keep_busy_duration: Duration::from_secs(600),
busy_threshold: 1_000,
logger: Logger::root(Discard, o!()),
long_queue_policy: LongQueuePolicy::default(),
}
}
pub fn metrics(&mut self, metrics: MetricBuilder) -> &mut Self {
self.metrics = metrics;
self
}
pub fn idle_threshold(&mut self, duration: Duration) -> &mut Self {
self.idle_threshold = duration;
self
}
pub fn max_queue_len(&mut self, n: usize) -> &mut Self {
self.max_queue_len = n;
self
}
pub fn max_keep_busy_duration(&mut self, duration: Duration) -> &mut Self {
self.max_keep_busy_duration = duration;
self
}
pub fn busy_threshold(&mut self, n: usize) -> &mut Self {
self.busy_threshold = n;
self
}
pub fn logger(&mut self, logger: Logger) -> &mut Self {
self.logger = logger;
self
}
pub fn long_queue_policy(&mut self, long_queue_policy: LongQueuePolicy) -> &mut Self {
self.long_queue_policy = long_queue_policy;
self
}
pub fn spawn<F, N>(&self, init_storage: F) -> Device
where
F: FnOnce() -> Result<Storage<N>> + Send + 'static,
N: NonVolatileMemory + Send + 'static,
{
let (thread_handle, thread_monitor) = DeviceThread::spawn(self.clone(), init_storage);
Device::new(thread_monitor, DeviceHandle(thread_handle))
}
}
impl Default for DeviceBuilder {
fn default() -> Self {
Self::new()
}
}