openbook-candles/src/worker/candle_batching/mod.rs

76 lines
2.3 KiB
Rust
Raw Normal View History

2023-03-12 00:13:57 -08:00
pub mod higher_order_candles;
pub mod minute_candles;
use chrono::Duration;
use deadpool_postgres::Pool;
2023-03-12 00:13:57 -08:00
use strum::IntoEnumIterator;
use tokio::{sync::mpsc::Sender, time::sleep};
use crate::{
2023-03-13 09:51:30 -07:00
structs::{candle::Candle, markets::MarketInfo, resolution::Resolution},
2023-03-26 12:39:25 -07:00
worker::candle_batching::minute_candles::batch_1m_candles,
2023-03-12 00:13:57 -08:00
};
use self::higher_order_candles::batch_higher_order_candles;
2023-05-31 06:12:26 -07:00
use super::metrics::METRIC_CANDLES_TOTAL;
2023-03-26 12:39:25 -07:00
pub async fn batch_for_market(
pool: &Pool,
2023-03-12 00:13:57 -08:00
candles_sender: &Sender<Vec<Candle>>,
2023-03-26 12:39:25 -07:00
market: &MarketInfo,
2023-03-27 10:11:58 -07:00
) -> anyhow::Result<()> {
2023-03-26 12:39:25 -07:00
loop {
let sender = candles_sender.clone();
let market_clone = market.clone();
// let client = pool.get().await?;
2023-03-26 12:39:25 -07:00
loop {
2023-03-27 10:11:58 -07:00
sleep(Duration::milliseconds(2000).to_std()?).await;
match batch_inner(pool, &sender, &market_clone).await {
2023-03-26 12:39:25 -07:00
Ok(_) => {}
Err(e) => {
println!(
"Batching thread failed for {:?} with error: {:?}",
market_clone.name.clone(),
e
);
break;
}
};
}
println!("Restarting {:?} batching thread", market.name);
2023-03-12 00:13:57 -08:00
}
}
2023-03-26 12:39:25 -07:00
async fn batch_inner(
pool: &Pool,
2023-03-12 00:13:57 -08:00
candles_sender: &Sender<Vec<Candle>>,
market: &MarketInfo,
2023-03-12 00:13:57 -08:00
) -> anyhow::Result<()> {
let market_name = &market.name.clone();
let candles = batch_1m_candles(pool, market).await?;
2023-05-31 06:12:26 -07:00
send_candles(candles.clone(), candles_sender).await;
2023-05-31 06:19:29 -07:00
METRIC_CANDLES_TOTAL
.with_label_values(&[market.name.as_str()])
.inc_by(candles.clone().len() as u64);
2023-03-12 00:13:57 -08:00
for resolution in Resolution::iter() {
if resolution == Resolution::R1m {
continue;
}
let candles = batch_higher_order_candles(pool, market_name, resolution).await?;
2023-05-31 06:12:26 -07:00
send_candles(candles.clone(), candles_sender).await;
2023-05-31 06:19:29 -07:00
METRIC_CANDLES_TOTAL
.with_label_values(&[market.name.as_str()])
.inc_by(candles.clone().len() as u64);
2023-03-12 00:13:57 -08:00
}
Ok(())
}
async fn send_candles(candles: Vec<Candle>, candles_sender: &Sender<Vec<Candle>>) {
2023-05-19 17:16:37 -07:00
if !candles.is_empty() {
2023-03-12 00:13:57 -08:00
if let Err(_) = candles_sender.send(candles).await {
panic!("candles receiver dropped");
}
}
}