Start reading the CnC file

pull/6/head
Bradlee Speice 2019-10-02 22:54:44 -04:00
parent 4085574b91
commit 27a8ce0dd4
4 changed files with 100 additions and 2 deletions

View File

@ -13,6 +13,7 @@ maintenance = { status = "actively-developed" }
[dependencies]
aeron_driver-sys = { path = "./aeron_driver-sys" }
memmap = "0.7"
[dev-dependencies]
clap = "2.33"

View File

@ -0,0 +1,92 @@
//! Description of the command and control file used to communicate between the Media Driver
//! and its clients.
//!
//! File layout:
//!
//! ```text
//! +-----------------------------+
//! | Meta Data |
//! +-----------------------------+
//! | to-driver Buffer |
//! +-----------------------------+
//! | to-clients Buffer |
//! +-----------------------------+
//! | Counters Metadata Buffer |
//! +-----------------------------+
//! | Counters Values Buffer |
//! +-----------------------------+
//! | Error Log |
//! +-----------------------------+
//! ```
/// The CnC file metadata header. Layout:
///
/// ```text
/// 0 1 2 3
/// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
/// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
/// | Aeron CnC Version |
/// +---------------------------------------------------------------+
/// | to-driver buffer length |
/// +---------------------------------------------------------------+
/// | to-clients buffer length |
/// +---------------------------------------------------------------+
/// | Counters Metadata buffer length |
/// +---------------------------------------------------------------+
/// | Counters Values buffer length |
/// +---------------------------------------------------------------+
/// | Error Log buffer length |
/// +---------------------------------------------------------------+
/// | Client Liveness Timeout |
/// | |
/// +---------------------------------------------------------------+
/// | Driver Start Timestamp |
/// | |
/// +---------------------------------------------------------------+
/// | Driver PID |
/// | |
/// +---------------------------------------------------------------+
/// ```
#[repr(C, align(4))]
pub struct MetaDataDefinition {
cnc_version: i32,
_to_driver_buffer_length: i32,
_to_client_buffer_length: i32,
_counter_metadata_buffer_length: i32,
_counter_values_buffer_length: i32,
_error_log_buffer_length: i32,
_client_liveness_timeout: i64,
_start_timestamp: i64,
_pid: i64,
}
#[cfg(test)]
mod tests {
use crate::client::cnc_descriptor::MetaDataDefinition;
use crate::driver::{DriverContext, MediaDriver};
use memmap::MmapOptions;
use std::fs::File;
use tempfile::tempdir;
#[test]
fn read_cnc_version() {
let dir = tempdir().unwrap();
let dir_path = dir.as_ref().to_path_buf();
dir.close().unwrap();
let context = DriverContext::default().set_aeron_dir(&dir_path);
let _driver = MediaDriver::with_context(context).unwrap();
// Open the CnC location
let cnc_path = dir_path.join("cnc.dat");
let cnc_file = File::open(&cnc_path).expect("Unable to open CnC file");
let mmap = unsafe {
MmapOptions::default()
.map(&cnc_file)
.expect("Unable to memory map CnC file")
};
let metadata: &MetaDataDefinition = unsafe { &*(mmap.as_ptr().cast()) };
assert_eq!(metadata.cnc_version, 16);
}
}

View File

@ -5,7 +5,7 @@ use std::path::PathBuf;
/// Context used to initialize the Aeron client
pub struct ClientContext {
aeron_dir: PathBuf,
_aeron_dir: PathBuf,
}
impl ClientContext {
@ -31,7 +31,7 @@ impl ClientContext {
impl Default for ClientContext {
fn default() -> Self {
ClientContext {
aeron_dir: ClientContext::default_aeron_path(),
_aeron_dir: ClientContext::default_aeron_path(),
}
}
}

5
src/client/mod.rs Normal file
View File

@ -0,0 +1,5 @@
//! Aeron client
//!
//! These are the modules necessary to construct a functioning Aeron client
pub mod cnc_descriptor;
pub mod context;