{"record":{"id":"a5fd64758838e1a5","repo":"apache/druid","slug":"please-configure-durable-storage","errorCode":null,"errorMessage":"Please configure durable storage.","messagePattern":"Please configure durable storage\\.","errorType":"error_code","errorClass":"DruidException","httpStatus":null,"severity":"critical","filePath":"processing/src/main/java/org/apache/druid/storage/NilStorageConnector.java","lineNumber":45,"sourceCode":"\npublic class NilStorageConnector implements StorageConnector\n{\n  private static final NilStorageConnector NIL_STORAGE_CONNECTOR = new NilStorageConnector();\n\n  private NilStorageConnector()\n  {\n\n  }\n\n  public static NilStorageConnector getInstance()\n  {\n    return NIL_STORAGE_CONNECTOR;\n  }\n\n  @Override\n  public boolean pathExists(String path)\n  {\n    throw notConfiguredException();\n  }\n\n  @Override\n  public InputStream read(String path)\n  {\n    throw notConfiguredException();\n\n  }\n\n  @Override\n  public InputStream readRange(String path, long from, long size)\n  {\n    throw notConfiguredException();\n\n  }\n\n  @Override\n  public OutputStream write(String path)","sourceCodeStart":27,"sourceCodeEnd":63,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/processing/src/main/java/org/apache/druid/storage/NilStorageConnector.java#L27-L63","documentation":"NilStorageConnector is the placeholder StorageConnector used when no real durable storage is configured. Every operation, including pathExists(), throws with the message 'Please configure durable storage.' because Druid cannot perform durable task/log storage operations against a nil connector.","triggerScenarios":"A call to StorageConnector.sanity() (or any pathExists/read/write call) on the nil connector, which happens when durable storage is not configured but a component (e.g. Overlord with durable task logs) requires it.","commonSituations":"Running the Overlord or middle manager with durable storage-dependent features enabled without setting the storage connector config (e.g. druid.storage.* / task log durable storage properties); single-machine dev setups missing the local deep storage config.","solutions":["Configure a real storage connector (e.g. local, S3, GCS/HDFS) via the druid.storage.* properties (storageConnector type and related config).","If running in dev without durable storage, disable the feature that requires it (e.g. durable task log storage).","Restart the service after adding the configuration so the real connector replaces the nil one."],"exampleFix":"// before\n// no storageConnector configured -> NilStorageConnector\n// after (runtime.properties)\ndruid.storage.type=local\ndruid.storage.storageDirectory=/var/druid/storage","handlingStrategy":"validation","validationCode":"// before using durable storage, check config\ndruid.storage.type must be set (e.g. local, s3, gcs); if using NilStorageConnector, fail fast with a clear config error","typeGuard":"boolean durableStorageConfigured(StorageConnector c) { return !(c instanceof NilStorageConnector); }","tryCatchPattern":"try { storageConnector.sanity(); } catch (UnsupportedOperationException e) { throw new ConfigRuntimeException(\"Durable storage is required: set druid.storage.* configuration\", e); }","preventionTips":["Set druid.storage.type and its directory/bucket properties in runtime.properties for any deployment needing durable storage.","Call sanity() on the connector at service startup to fail fast with a clear message.","Disable durable-storage-dependent features in dev setups that intentionally use the nil connector."],"tags":["druid","storage","configuration"],"backgroundTag":"missing-required-config","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}