gatewayd.rs 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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::{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 = if Path::new(&path).exists() {
  28. Config::<GatewaydConfig>::load(path)?
  29. } else {
  30. Config::<GatewaydConfig>::load_default(path)?
  31. };
  32. let config_ptr = Arc::new(&config);
  33. let options = GatewaydCli::load()?;
  34. {
  35. use simplelog::*;
  36. let logger_config = ConfigBuilder::new().set_time_format_str("%T%.6f").build();
  37. let debug_level = if options.verbose {
  38. LevelFilter::Debug
  39. } else {
  40. LevelFilter::Off
  41. };
  42. let log_path = config.log_path.clone();
  43. CombinedLogger::init(vec![
  44. TermLogger::new(debug_level, logger_config, TerminalMode::Mixed).unwrap(),
  45. WriteLogger::new(
  46. LevelFilter::Debug,
  47. Config::default(),
  48. std::fs::File::create(log_path).unwrap(),
  49. ),
  50. ])
  51. .unwrap();
  52. }
  53. let ex2 = ex.clone();
  54. let (_, result) = Parallel::new()
  55. // Run four executor threads.
  56. .each(0..3, |_| smol::future::block_on(ex.run(shutdown.recv())))
  57. // Run the main future on the current thread.
  58. .finish(|| {
  59. smol::future::block_on(async move {
  60. start(ex2, config_ptr).await?;
  61. drop(signal);
  62. Ok::<(), drk::Error>(())
  63. })
  64. });
  65. result
  66. }