2023-05-31 06:32:34 -07:00
|
|
|
use log::{error, info};
|
2023-03-13 23:21:15 -07:00
|
|
|
use openbook_candles::structs::markets::{fetch_market_infos, load_markets};
|
2023-03-13 09:51:30 -07:00
|
|
|
use openbook_candles::utils::Config;
|
2023-05-31 06:19:29 -07:00
|
|
|
use openbook_candles::worker::metrics::{
|
2023-06-08 00:47:05 -07:00
|
|
|
serve_metrics, METRIC_DB_POOL_AVAILABLE, METRIC_DB_POOL_SIZE,
|
2023-05-31 06:19:29 -07:00
|
|
|
};
|
2023-05-14 00:15:10 -07:00
|
|
|
use openbook_candles::{
|
2023-06-08 00:47:05 -07:00
|
|
|
database::initialize::{connect_to_database, setup_database},
|
2023-05-14 00:15:10 -07:00
|
|
|
worker::candle_batching::batch_for_market,
|
|
|
|
};
|
2023-03-11 14:50:22 -08:00
|
|
|
use solana_sdk::pubkey::Pubkey;
|
2023-03-26 12:39:25 -07:00
|
|
|
use std::env;
|
2023-05-31 06:12:26 -07:00
|
|
|
use std::{collections::HashMap, str::FromStr, time::Duration as WaitDuration};
|
2023-03-05 22:52:42 -08:00
|
|
|
|
2023-05-17 09:11:17 -07:00
|
|
|
#[tokio::main(flavor = "multi_thread", worker_threads = 10)]
|
2023-03-05 22:52:42 -08:00
|
|
|
async fn main() -> anyhow::Result<()> {
|
2023-05-31 06:32:34 -07:00
|
|
|
env_logger::init();
|
2023-03-07 22:45:37 -08:00
|
|
|
dotenv::dotenv().ok();
|
|
|
|
|
2023-03-14 18:46:49 -07:00
|
|
|
let args: Vec<String> = env::args().collect();
|
|
|
|
assert!(args.len() == 2);
|
|
|
|
let path_to_markets_json = &args[1];
|
2023-03-07 22:45:37 -08:00
|
|
|
let rpc_url: String = dotenv::var("RPC_URL").unwrap();
|
|
|
|
|
|
|
|
let config = Config {
|
2023-03-12 16:32:12 -07:00
|
|
|
rpc_url: rpc_url.clone(),
|
2023-03-05 22:52:42 -08:00
|
|
|
};
|
|
|
|
|
2023-05-19 17:16:37 -07:00
|
|
|
let markets = load_markets(path_to_markets_json);
|
2023-03-26 12:39:25 -07:00
|
|
|
let market_infos = fetch_market_infos(&config, markets.clone()).await?;
|
2023-03-12 16:32:12 -07:00
|
|
|
let mut target_markets = HashMap::new();
|
|
|
|
for m in market_infos.clone() {
|
2023-05-30 10:01:47 -07:00
|
|
|
target_markets.insert(Pubkey::from_str(&m.address)?, m.name);
|
2023-03-12 16:32:12 -07:00
|
|
|
}
|
2023-05-31 06:32:34 -07:00
|
|
|
info!("{:?}", target_markets);
|
2023-03-05 22:52:42 -08:00
|
|
|
|
2023-05-17 09:11:17 -07:00
|
|
|
let pool = connect_to_database().await?;
|
2023-03-12 16:32:12 -07:00
|
|
|
setup_database(&pool).await?;
|
2023-03-13 22:34:23 -07:00
|
|
|
let mut handles = vec![];
|
2023-03-07 22:45:37 -08:00
|
|
|
|
2023-06-08 00:47:05 -07:00
|
|
|
// candle batching
|
2023-03-26 12:39:25 -07:00
|
|
|
for market in market_infos.into_iter() {
|
|
|
|
let batch_pool = pool.clone();
|
|
|
|
handles.push(tokio::spawn(async move {
|
2023-06-03 10:22:10 -07:00
|
|
|
batch_for_market(&batch_pool, &market).await.unwrap();
|
2023-05-31 06:32:34 -07:00
|
|
|
error!("batching halted for market {}", &market.name);
|
2023-03-26 12:39:25 -07:00
|
|
|
}));
|
|
|
|
}
|
2023-03-12 00:13:57 -08:00
|
|
|
|
2023-05-31 06:12:26 -07:00
|
|
|
let monitor_pool = pool.clone();
|
|
|
|
handles.push(tokio::spawn(async move {
|
|
|
|
// TODO: maybe break this out into a new function
|
|
|
|
loop {
|
|
|
|
let pool_status = monitor_pool.status();
|
|
|
|
METRIC_DB_POOL_AVAILABLE.set(pool_status.available as i64);
|
|
|
|
METRIC_DB_POOL_SIZE.set(pool_status.size as i64);
|
|
|
|
|
|
|
|
tokio::time::sleep(WaitDuration::from_secs(10)).await;
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
|
2023-05-30 10:01:47 -07:00
|
|
|
handles.push(tokio::spawn(async move {
|
|
|
|
// TODO: this is ugly af
|
|
|
|
serve_metrics().await.unwrap().await.unwrap();
|
|
|
|
}));
|
|
|
|
|
2023-03-13 22:34:23 -07:00
|
|
|
futures::future::join_all(handles).await;
|
2023-03-11 14:50:22 -08:00
|
|
|
|
2023-03-05 22:52:42 -08:00
|
|
|
Ok(())
|
|
|
|
}
|