{"record":{"id":"4aba4e3d5c2874c5","repo":"EpicGames/lore","slug":"immutable-store-must-be-a-local-store","errorCode":null,"errorMessage":"Immutable store must be a local store","messagePattern":"Immutable store must be a local store","errorType":"exception","errorClass":"anyhow::Error","httpStatus":null,"severity":"error","filePath":"lore-server/src/grpc/grpc_internal_server.rs","lineNumber":87,"sourceCode":"\npub struct WantsComponents(());\n\nimpl GrpcInternalServerBuilder<WantsComponents> {\n    pub fn new() -> Self {\n        Self(WantsComponents(()))\n    }\n\n    pub fn with_components(\n        self,\n        local_immutable_store: Arc<dyn ImmutableStore>,\n        immutable_store: Arc<dyn ImmutableStore>,\n        mutable_store: Arc<dyn MutableStore>,\n        notification_sender: Arc<dyn NotificationSender>,\n        hook_dispatcher: Arc<HookDispatcher>,\n        environment: EnvironmentConfig,\n    ) -> anyhow::Result<GrpcInternalServerBuilder<WantsTlsConfig>> {\n        if !local_immutable_store.is_local() {\n            return Err(anyhow!(\"Immutable store must be a local store\"));\n        }\n\n        Ok(GrpcInternalServerBuilder(WantsTlsConfig {\n            local_immutable_store,\n            immutable_store,\n            mutable_store,\n            notification_sender,\n            hook_dispatcher,\n            environment,\n        }))\n    }\n}\n\npub struct WantsTlsConfig {\n    local_immutable_store: Arc<dyn ImmutableStore>,\n    immutable_store: Arc<dyn ImmutableStore>,\n    mutable_store: Arc<dyn MutableStore>,\n    notification_sender: Arc<dyn NotificationSender>,","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/EpicGames/lore/blob/074eb0b0d1194c997d7cf28b55519e3e197b3e23/lore-server/src/grpc/grpc_internal_server.rs#L69-L105","documentation":"GrpcInternalServer::with_components requires the provided immutable store to be a lore_storage::LocalImmutableStore-backed store; if local_immutable_store.is_local() is false it returns this error. The internal gRPC server (node-to-node APIs) only works against local disk storage.","triggerScenarios":"Calling GrpcInternalServer::with_components with a non-local immutable store (e.g. S3/remote object-store implementation) passed as local_immutable_store.","commonSituations":"Deployments configured with a remote/cloud storage backend but still launching the internal gRPC server; wiring the wrong Arc<dyn ImmutableStore> into with_components; config switched from local disk to object storage without disabling internal server features that require locality.","solutions":["Configure a LocalImmutableStore (local disk path) for the internal gRPC server.","If using remote storage, disable the components that require the internal server or use a local cache/staging store alongside it.","Audit the store construction call site to ensure the local store, not the generic one, is passed."],"exampleFix":"// before\nlet store = Arc::new(S3ImmutableStore::new(...));\nGrpcInternalServer::with_components(store, ...)\n// after\nlet store = Arc::new(LocalImmutableStore::new(\"/data/lore\"));\nGrpcInternalServer::with_components(store, ...)","handlingStrategy":"validation","validationCode":"if !local_immutable_store.is_local() {\n    return Err(\"internal gRPC server requires a LocalImmutableStore\");\n}","typeGuard":null,"tryCatchPattern":"match GrpcInternalServer::with_components(...) {\n    Err(e) if e.to_string() == \"Immutable store must be a local store\" => {\n        // switch config to a local-disk store or disable internal server\n    }\n    other => other?,\n}","preventionTips":["Pair the internal gRPC server strictly with LocalImmutableStore in deployment templates.","Document that object-store backends cannot back node-to-node internal APIs.","Assert storage backend type in an integration smoke test before rollout."],"tags":["grpc","storage","configuration","invariant"],"backgroundTag":"invalid-argument-value","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"}