{"record":{"id":"fffeeb213532eda9","repo":"EpicGames/lore","slug":"missing-grpc-settings","errorCode":null,"errorMessage":"Missing gRPC settings","messagePattern":"Missing gRPC settings","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"lore-server/src/server.rs","lineNumber":455,"sourceCode":"    immutable_store: Arc<dyn ImmutableStore>,\n    local_store: Arc<dyn ImmutableStore>,\n    mutable_store: Arc<dyn MutableStore>,\n    lock_store: Option<Arc<dyn LockStore>>,\n    jwt_verifier: Option<JwtVerifier>,\n    repository_authorizer: Arc<dyn RepositoryAuthorizer>,\n    settings: Settings,\n    notification_sender: Arc<dyn NotificationSender>,\n    notification_service: Option<NotificationService>,\n    hook_dispatcher: Arc<HookDispatcher>,\n    user_agent_filter: Arc<UserAgentFilter>,\n    forwarded_requests: Option<Arc<dyn ForwardedRequests>>,\n    mut shutdown_rx: tokio::sync::watch::Receiver<bool>,\n) -> Result<()> {\n    let grpc_settings = settings\n        .server\n        .grpc\n        .clone()\n        .ok_or(anyhow!(\"Missing gRPC settings\"))?;\n    let service_settings = settings.server.grpc_public_services.clone();\n\n    let addr =\n        SocketAddr::from_str(format!(\"{}:{}\", grpc_settings.host, grpc_settings.port).as_str())?;\n\n    let locks = lock_store.is_some() && service_settings.lock_service.enabled;\n\n    info!(\n        \"Starting Lore GRPC Server: {}, Auth: {} Locks: {}\",\n        &addr,\n        jwt_verifier.as_ref().map_or(\"disabled\", |_| \"enabled\"),\n        if locks { \"enabled\" } else { \"disabled\" },\n    );\n\n    // The settings map has no relevant entries to surface yet, so it stays empty.\n    // The features list reports the cargo features the binary was compiled with so\n    // clients and tests can detect optional capabilities (e.g. failure_generator).\n    let settings_map: HashMap<String, String> = HashMap::new();","sourceCodeStart":437,"sourceCodeEnd":473,"githubUrl":"https://github.com/EpicGames/lore/blob/074eb0b0d1194c997d7cf28b55519e3e197b3e23/lore-server/src/server.rs#L437-L473","documentation":"Thrown by launch_grpc_server when settings.server.grpc is None. The gRPC server cannot bind to a host/port without its settings block, so startup fails fast instead of proceeding with a half-configured server. This is a startup-time configuration validation error.","triggerScenarios":"Calling launch_grpc_server with a Settings value whose settings.server.grpc field is None (the TOML config lacks [server.grpc] or it was not deserialized).","commonSituations":"Running the server with a config file that omits the [server.grpc] section while the transport expects gRPC; copying a config from a HTTP-only deployment; renaming config keys after a version upgrade so the section silently deserializes as None.","solutions":["Add a [server.grpc] section with host and port to the server's TOML config file.","Verify you are loading the intended config file (check config path env var / CLI flag).","Check the Settings struct docs for required server.grpc fields after upgrading versions."],"exampleFix":"# before\n[server]\n# no grpc section\n\n# after\n[server.grpc]\nhost = \"0.0.0.0\"\nport = 50051","handlingStrategy":"validation","validationCode":"if settings.server.grpc.is_none() {\n    return Err(anyhow!(\"server.grpc section missing from config; cannot launch gRPC server\"));\n}","typeGuard":"fn grpc_settings_ready(settings: &Settings) -> bool {\n    settings.server.grpc.is_some()\n}","tryCatchPattern":null,"preventionTips":["Include a [server.grpc] section with host and port in every deployment config template.","Validate the full Settings struct at process start before launching servers.","Log the config file path actually loaded so wrong-file mistakes surface quickly."],"tags":["grpc","configuration","startup"],"backgroundTag":"missing-required-config","analyzedSha":"074eb0b0d1194c997d7cf28b55519e3e197b3e23","analyzedAt":"2026-09-13T09:00:57.509Z","contentChangedAt":"2026-09-13T09:00:57.509Z","schemaVersion":2},"datasetVersion":"2026-09-16T09:17:16.951Z"}