diff --git a/node/src/main.rs b/node/src/main.rs index ce2470073cc..4ff21436fae 100644 --- a/node/src/main.rs +++ b/node/src/main.rs @@ -47,14 +47,20 @@ use tokio::sync::mpsc; git_testament!(TESTAMENT); -fn read_expensive_queries() -> Result>, std::io::Error> { +fn read_expensive_queries( + logger: &Logger, + expensive_queries_filename: String, +) -> Result>, std::io::Error> { // A file with a list of expensive queries, one query per line // Attempts to run these queries will return a // QueryExecutionError::TooExpensive to clients - const EXPENSIVE_QUERIES: &str = "/etc/graph-node/expensive-queries.txt"; - let path = Path::new(EXPENSIVE_QUERIES); + let path = Path::new(&expensive_queries_filename); let mut queries = Vec::new(); if path.exists() { + info!( + logger, + "Reading expensive queries file: {}", expensive_queries_filename + ); let file = std::fs::File::open(path)?; let reader = BufReader::new(file); for line in reader.lines() { @@ -63,7 +69,7 @@ fn read_expensive_queries() -> Result>, std::io::Error> { .map_err(|e| { let msg = format!( "invalid GraphQL query in {}: {}\n{}", - EXPENSIVE_QUERIES, + expensive_queries_filename, e.to_string(), line ); @@ -72,6 +78,11 @@ fn read_expensive_queries() -> Result>, std::io::Error> { .into_static(); queries.push(Arc::new(query)); } + } else { + warn!( + logger, + "Expensive queries file not set to a valid file: {}", expensive_queries_filename + ); } Ok(queries) } @@ -220,7 +231,9 @@ async fn main() { let contention_logger = logger.clone(); - let expensive_queries = read_expensive_queries().unwrap(); + // TODO: make option loadable from configuration TOML and environment: + let expensive_queries = + read_expensive_queries(&logger, opt.expensive_queries_filename).unwrap(); let store_builder = StoreBuilder::new( &logger, diff --git a/node/src/opt.rs b/node/src/opt.rs index 498115afc29..785b73f517e 100644 --- a/node/src/opt.rs +++ b/node/src/opt.rs @@ -152,6 +152,14 @@ pub struct Opt { help = "a unique identifier for this node. Should have the same value between consecutive node restarts" )] pub node_id: String, + #[structopt( + long, + value_name = "FILE", + env = "GRAPH_NODE_EXPENSIVE_QUERIES_FILE", + default_value = "/etc/graph-node/expensive-queries.txt", + help = "a file with a list of expensive queries, one query per line. Attempts to run these queries will return a QueryExecutionError::TooExpensive to clients" + )] + pub expensive_queries_filename: String, #[structopt(long, help = "Enable debug logging")] pub debug: bool,