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

  1. Configure a real storage connector (e.g. local, S3, GCS/HDFS) via the druid.storage.* properties (storageConnector type and related config).
  2. If running in dev without durable storage, disable the feature that requires it (e.g. durable task log storage).
  3. 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

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


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)