use std::path::PathBuf;
use std::time::Duration;
use crate::storage::replay::ReplayMode;
#[derive(Debug, Clone)]
pub struct FileConfig {
pub path: PathBuf,
pub batch_size: usize,
pub max_record_size: usize,
pub replay: ReplayMode,
pub eof_policy: EofPolicy,
}
impl FileConfig {
pub fn new_batch(&self) -> crate::storage::batch::RawRecordBatch {
crate::storage::batch::RawRecordBatch::new(
self.batch_size.max(1),
self.max_record_size.max(1),
)
}
pub fn validate(&self) -> crate::core::Result<()> {
if self.batch_size == 0 {
return Err(crate::core::Error::config("batch_size must be > 0"));
}
if self.max_record_size == 0 {
return Err(crate::core::Error::config("max_record_size must be > 0"));
}
if self.path.as_os_str().is_empty() {
return Err(crate::core::Error::config("path must not be empty"));
}
Ok(())
}
}
impl Default for FileConfig {
fn default() -> Self {
Self {
path: PathBuf::from("input.bin"),
batch_size: 256,
max_record_size: 4096,
replay: ReplayMode::FullSpeed,
eof_policy: EofPolicy::Stop,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum EofPolicy {
Stop,
Loop,
Follow {
poll_interval: Duration,
},
}
#[derive(Debug, Clone)]
pub struct IoUringConfig {
pub queue_depth: u32,
pub registered_buffers: bool,
pub o_direct: bool,
pub inflight: u32,
}
impl Default for IoUringConfig {
fn default() -> Self {
Self {
queue_depth: 256,
registered_buffers: false,
o_direct: false,
inflight: 4,
}
}
}
#[derive(Debug, Clone)]
pub struct SpdkConfig {
pub pci_addr: String,
pub namespace_id: u32,
pub queue_pairs: u32,
pub hugepage_mb: usize,
}
impl Default for SpdkConfig {
fn default() -> Self {
Self {
pci_addr: "0000:00:1f.2".to_string(),
namespace_id: 1,
queue_pairs: 1,
hugepage_mb: 1024,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn file_config_defaults() {
let cfg = FileConfig::default();
assert_eq!(cfg.batch_size, 256);
assert_eq!(cfg.max_record_size, 4096);
assert_eq!(cfg.replay, ReplayMode::FullSpeed);
assert_eq!(cfg.eof_policy, EofPolicy::Stop);
}
#[test]
fn io_uring_config_defaults() {
let cfg = IoUringConfig::default();
assert_eq!(cfg.queue_depth, 256);
assert!(!cfg.registered_buffers);
assert!(!cfg.o_direct);
}
#[test]
fn spdk_config_defaults() {
let cfg = SpdkConfig::default();
assert_eq!(cfg.namespace_id, 1);
assert_eq!(cfg.queue_pairs, 1);
}
}