gatewayd.rs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. use std::net::SocketAddr;
  2. use std::sync::Arc;
  3. use drk::blockchain::{rocks::columns, Rocks, RocksColumn};
  4. use drk::cli::{Config, GatewaydCli, GatewaydConfig};
  5. use drk::service::GatewayService;
  6. use drk::util::join_config_path;
  7. use drk::Result;
  8. use std::path::PathBuf;
  9. extern crate clap;
  10. use async_executor::Executor;
  11. use easy_parallel::Parallel;
  12. async fn start(executor: Arc<Executor<'_>>, config: Arc<&GatewaydConfig>) -> Result<()> {
  13. let accept_addr: SocketAddr = config.accept_url.parse()?;
  14. let pub_addr: SocketAddr = config.publisher_url.parse()?;
  15. let database_path = config.database_path.clone();
  16. let database_path = join_config_path(&PathBuf::from(database_path))?;
  17. let rocks = Rocks::new(&database_path)?;
  18. let rocks_slabstore_column = RocksColumn::<columns::Slabs>::new(rocks);
  19. let gateway = GatewayService::new(accept_addr, pub_addr, rocks_slabstore_column)?;
  20. gateway.start(executor.clone()).await?;
  21. Ok(())
  22. }
  23. fn main() -> Result<()> {
  24. let ex = Arc::new(Executor::new());
  25. let (signal, shutdown) = async_channel::unbounded::<()>();
  26. let path = join_config_path(&PathBuf::from("gatewayd.toml")).unwrap();
  27. let config: GatewaydConfig = Config::<GatewaydConfig>::load(path)?;
  28. let config_ptr = Arc::new(&config);
  29. let options = GatewaydCli::load()?;
  30. {
  31. use simplelog::*;
  32. let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
  33. let debug_level = if options.verbose {
  34. LevelFilter::Debug
  35. } else {
  36. LevelFilter::Off
  37. };
  38. let log_path = config.log_path.clone();
  39. CombinedLogger::init(vec![
  40. TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
  41. WriteLogger::new(
  42. LevelFilter::Debug,
  43. Config::default(),
  44. std::fs::File::create(log_path).unwrap(),
  45. ),
  46. ])
  47. .unwrap();
  48. }
  49. let ex2 = ex.clone();
  50. let (_, result) = Parallel::new()
  51. // Run four executor threads.
  52. .each(0..3, |_| smol::future::block_on(ex.run(shutdown.recv())))
  53. // Run the main future on the current thread.
  54. .finish(|| {
  55. smol::future::block_on(async move {
  56. start(ex2, config_ptr).await?;
  57. drop(signal);
  58. Ok::<(), drk::Error>(())
  59. })
  60. });
  61. result
  62. }