Skip to content

Commit 44033f8

Browse files
committed
feat(rust): add the Iceoryx channel configuration.
1 parent d530fa2 commit 44033f8

File tree

4 files changed

+57
-14
lines changed

4 files changed

+57
-14
lines changed

hftbacktest/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ rust-version = "1.82"
2323
[features]
2424
default = ["backtest", "live"]
2525
backtest = ["zip", "uuid", "nom", "hftbacktest-derive"]
26-
live = ["chrono", "tokio", "futures-util", "iceoryx2", "rand"]
26+
live = ["chrono", "tokio", "futures-util", "iceoryx2", "rand", "toml", "serde"]
2727
unstable_fuse = []
2828

2929
[dependencies]
@@ -40,6 +40,8 @@ rand = { version = "0.8.5", optional = true }
4040
uuid = { version = "1.8.0", features = ["v4"], optional = true }
4141
nom = { version = "7.1.3", optional = true }
4242
iceoryx2 = { version = "0.4.1", optional = true, features = ["logger_tracing"] }
43+
serde = { version = "1.0.215", optional = true, features = ["derive"] }
44+
toml = { version = "0.8.19", optional = true }
4345
hftbacktest-derive = { path = "../hftbacktest-derive", optional = true, version = "0.2.0" }
4446

4547
[dev-dependencies]

hftbacktest/src/live/ipc/config.rs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
use std::{env, fs};
2+
3+
use serde::Deserialize;
4+
5+
pub const MAX_PAYLOAD_SIZE: usize = 512;
6+
const MAX_BOTS_PER_CONNECTOR: usize = 200;
7+
const CHANNEL_BUFFER_SIZE: usize = 10000;
8+
9+
#[derive(Deserialize)]
10+
pub struct ChannelConfig {
11+
pub buffer_size: usize,
12+
pub max_bots: usize,
13+
}
14+
15+
impl ChannelConfig {
16+
pub fn load_config() -> Self {
17+
if let Ok(config_file) = env::var("HFTBACKTEST_CHANNEL_CONFIG") {
18+
if let Ok(contents) = fs::read_to_string(config_file) {
19+
if let Ok(config) = toml::from_str::<ChannelConfig>(&contents) {
20+
return config;
21+
}
22+
}
23+
}
24+
ChannelConfig::default()
25+
}
26+
}
27+
28+
impl Default for ChannelConfig {
29+
fn default() -> Self {
30+
Self {
31+
buffer_size: CHANNEL_BUFFER_SIZE,
32+
max_bots: MAX_BOTS_PER_CONNECTOR,
33+
}
34+
}
35+
}

hftbacktest/src/live/ipc/iceoryx.rs

Lines changed: 18 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,18 @@ use iceoryx2::{
2222
use thiserror::Error;
2323

2424
use crate::{
25-
live::{ipc::Channel, BotError, Instrument},
25+
live::{
26+
ipc::{
27+
config::{ChannelConfig, MAX_PAYLOAD_SIZE},
28+
Channel,
29+
},
30+
BotError,
31+
Instrument,
32+
},
2633
prelude::{LiveEvent, LiveRequest},
2734
types::BuildError,
2835
};
2936

30-
const MAX_PAYLOAD_SIZE: usize = 512;
31-
const MAX_BOTS_PER_CONNECTOR: usize = 500;
32-
const CHANNEL_BUFFER_SIZE: usize = 100000;
33-
3437
#[derive(Default, Debug)]
3538
#[repr(C)]
3639
pub struct CustomHeader {
@@ -74,6 +77,7 @@ impl IceoryxBuilder {
7477
}
7578

7679
pub fn receiver<T>(self) -> Result<IceoryxReceiver<T>, ChannelError> {
80+
let config = ChannelConfig::load_config();
7781
let node = NodeBuilder::new()
7882
.create::<ipc::Service>()
7983
.map_err(|error| ChannelError::BuildError(error.to_string()))?;
@@ -83,9 +87,9 @@ impl IceoryxBuilder {
8387
.map_err(|error| ChannelError::BuildError(error.to_string()))?;
8488
node.service_builder(&service_name)
8589
.publish_subscribe::<[u8]>()
86-
.subscriber_max_buffer_size(CHANNEL_BUFFER_SIZE)
90+
.subscriber_max_buffer_size(config.buffer_size)
8791
.max_publishers(1)
88-
.max_subscribers(MAX_BOTS_PER_CONNECTOR)
92+
.max_subscribers(config.max_bots)
8993
.user_header::<CustomHeader>()
9094
.open_or_create()
9195
.map_err(|error| ChannelError::BuildError(error.to_string()))?
@@ -94,8 +98,8 @@ impl IceoryxBuilder {
9498
.map_err(|error| ChannelError::BuildError(error.to_string()))?;
9599
node.service_builder(&service_name)
96100
.publish_subscribe::<[u8]>()
97-
.subscriber_max_buffer_size(CHANNEL_BUFFER_SIZE)
98-
.max_publishers(MAX_BOTS_PER_CONNECTOR)
101+
.subscriber_max_buffer_size(config.buffer_size)
102+
.max_publishers(config.max_bots)
99103
.max_subscribers(1)
100104
.user_header::<CustomHeader>()
101105
.open_or_create()
@@ -114,6 +118,7 @@ impl IceoryxBuilder {
114118
}
115119

116120
pub fn sender<T>(self) -> Result<IceoryxSender<T>, ChannelError> {
121+
let config = ChannelConfig::load_config();
117122
let node = NodeBuilder::new()
118123
.create::<ipc::Service>()
119124
.map_err(|error| ChannelError::BuildError(error.to_string()))?;
@@ -123,8 +128,8 @@ impl IceoryxBuilder {
123128
.map_err(|error| ChannelError::BuildError(error.to_string()))?;
124129
node.service_builder(&service_name)
125130
.publish_subscribe::<[u8]>()
126-
.subscriber_max_buffer_size(100000)
127-
.max_publishers(500)
131+
.subscriber_max_buffer_size(config.buffer_size)
132+
.max_publishers(config.max_bots)
128133
.max_subscribers(1)
129134
.user_header::<CustomHeader>()
130135
.open_or_create()
@@ -134,9 +139,9 @@ impl IceoryxBuilder {
134139
.map_err(|error| ChannelError::BuildError(error.to_string()))?;
135140
node.service_builder(&service_name)
136141
.publish_subscribe::<[u8]>()
137-
.subscriber_max_buffer_size(100000)
142+
.subscriber_max_buffer_size(config.buffer_size)
138143
.max_publishers(1)
139-
.max_subscribers(500)
144+
.max_subscribers(config.max_bots)
140145
.user_header::<CustomHeader>()
141146
.open_or_create()
142147
.map_err(|error| ChannelError::BuildError(error.to_string()))?

hftbacktest/src/live/ipc/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::{
66
types::{LiveEvent, LiveRequest},
77
};
88

9+
mod config;
910
pub mod iceoryx;
1011

1112
pub const TO_ALL: u64 = 0;

0 commit comments

Comments
 (0)