apache/druid · critical · DruidException
Please configure durable storage.
Error message
Please configure durable storage.
What it means
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.
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.
Example fix
// before // no storageConnector configured -> NilStorageConnector // after (runtime.properties) druid.storage.type=local druid.storage.storageDirectory=/var/druid/storage
Defensive patterns
Strategy: validation
Validate before calling
// before using durable storage, check config druid.storage.type must be set (e.g. local, s3, gcs); if using NilStorageConnector, fail fast with a clear config error
Type guard
boolean durableStorageConfigured(StorageConnector c) { return !(c instanceof NilStorageConnector); } Try / catch
try { storageConnector.sanity(); } catch (UnsupportedOperationException e) { throw new ConfigRuntimeException("Durable storage is required: set druid.storage.* configuration", e); } Prevention
- 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.
When it happens
Trigger: 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.
Common situations: 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.
Understand the failure class
Background: "X is required", "must be set", "cannot be empty": the missing-required-config error family, from Vertex AI project/location to WeChat keys — this error's family across 18 libraries.
Related errors
- At most one of 'druid.broker.segment.watchedTiers' and…
- bitmapEncoding[ ] does not match indexSpec.bitmap[ ]
- Can't find location to handle segment
- Cannot mix sortable and unsortable key columns
- Compression value [ ] is greater than the max allowed…
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/a5fd64758838e1a5.
Report an issue: GitHub.
Appendix: source
Thrown at processing/src/main/java/org/apache/druid/storage/NilStorageConnector.java:45
public class NilStorageConnector implements StorageConnector
{
private static final NilStorageConnector NIL_STORAGE_CONNECTOR = new NilStorageConnector();
private NilStorageConnector()
{
}
public static NilStorageConnector getInstance()
{
return NIL_STORAGE_CONNECTOR;
}
@Override
public boolean pathExists(String path)
{
throw notConfiguredException();
}
@Override
public InputStream read(String path)
{
throw notConfiguredException();
}
@Override
public InputStream readRange(String path, long from, long size)
{
throw notConfiguredException();
}
@Override
public OutputStream write(String path)View on GitHub (pinned to 9b90983fd2)