mirror of
https://github.com/logos-blockchain/lssa.git
synced 2026-06-30 21:09:38 +00:00
The indexer's storage location was the `home` field of IndexerConfig, used only to derive the RocksDB dir. Defaulting to "." meant it landed in the process CWD — fine for the standalone service, but wrong when the indexer runs embedded in a logos_host subprocess (RocksDB ended up in an arbitrary/unwritable dir). Storage location is an operational concern the host should own, not something baked into a user-editable config. Remove `home` from IndexerConfig and pass the storage directory explicitly: - core: `IndexerCore::new(config, storage_dir)` derives `<storage_dir>/rocksdb`. - ffi: `start_indexer(runtime, config_path, storage_dir)`; null/empty storage_dir falls back to ".". Lets a host (e.g. a Logos module's instance persistence path) own where state lives. - service: `run_server(config, storage_dir, port)` + a `--data-dir` flag (default ".") on the binary, preserving current behaviour. - drop `home` from the committed indexer config JSONs and the test fixtures. BREAKING CHANGE: `start_indexer` gains a `storage_dir` parameter and IndexerConfig no longer has a `home` field.
68 lines
1.7 KiB
Rust
68 lines
1.7 KiB
Rust
use std::path::PathBuf;
|
|
|
|
use anyhow::Result;
|
|
use clap::Parser;
|
|
use log::{error, info};
|
|
use tokio_util::sync::CancellationToken;
|
|
|
|
#[derive(Debug, Parser)]
|
|
#[clap(version)]
|
|
struct Args {
|
|
#[clap(name = "config")]
|
|
config_path: PathBuf,
|
|
#[clap(short, long, default_value = "8779")]
|
|
port: u16,
|
|
/// Directory under which the indexer stores its `RocksDB` state.
|
|
#[clap(short, long, default_value = ".")]
|
|
data_dir: PathBuf,
|
|
}
|
|
|
|
#[tokio::main]
|
|
#[expect(
|
|
clippy::integer_division_remainder_used,
|
|
reason = "Generated by select! macro, can't be easily rewritten to avoid this lint"
|
|
)]
|
|
async fn main() -> Result<()> {
|
|
env_logger::init();
|
|
|
|
let Args {
|
|
config_path,
|
|
port,
|
|
data_dir,
|
|
} = Args::parse();
|
|
|
|
let cancellation_token = listen_for_shutdown_signal();
|
|
|
|
let config = indexer_service::IndexerConfig::from_path(&config_path)?;
|
|
let indexer_handle = indexer_service::run_server(config, data_dir.as_path(), port).await?;
|
|
|
|
tokio::select! {
|
|
() = cancellation_token.cancelled() => {
|
|
info!("Shutting down server...");
|
|
}
|
|
() = indexer_handle.stopped() => {
|
|
error!("Server stopped unexpectedly");
|
|
}
|
|
}
|
|
|
|
info!("Server shutdown complete");
|
|
|
|
Ok(())
|
|
}
|
|
|
|
fn listen_for_shutdown_signal() -> CancellationToken {
|
|
let cancellation_token = CancellationToken::new();
|
|
let cancellation_token_clone = cancellation_token.clone();
|
|
|
|
tokio::spawn(async move {
|
|
if let Err(err) = tokio::signal::ctrl_c().await {
|
|
error!("Failed to listen for Ctrl-C signal: {err}");
|
|
return;
|
|
}
|
|
info!("Received Ctrl-C signal");
|
|
cancellation_token_clone.cancel();
|
|
});
|
|
|
|
cancellation_token
|
|
}
|