apache/druid · error · ProvisionException

Double dot in property: %s

Error message

Double dot in property: %s

What it means

JsonConfigurator flattens dotted runtime properties (druid.emitter.http.flushThreshold) into nested JSON maps via hieraricalPutValue. A dot at position 0 of a property key means the key starts with a dot or contains consecutive dots ('..'), producing an empty nested key segment. Druid throws ProvisionException 'Double dot in property' because it cannot build a valid nested map from such a key.

Source

Thrown at processing/src/main/java/org/apache/druid/guice/JsonConfigurator.java:237

  private static void hieraricalPutValue(
      String propertyPrefix,
      String originalProperty,
      String property,
      Object value,
      Map<String, Object> targetMap
  )
  {
    int dotIndex = property.indexOf('.');
    // Always put property with name even if it is of form a.b. This will make sure the property is available for classes
    // where JsonProperty names are of the form a.b
    // Note:- this will cause more than required properties to be present in the jsonMap.
    targetMap.put(property, value);
    if (dotIndex < 0) {
      return;
    }
    if (dotIndex == 0) {
      throw new ProvisionException(StringUtils.format("Double dot in property: %s", originalProperty));
    }
    if (dotIndex == property.length() - 1) {
      throw new ProvisionException(StringUtils.format("Dot at the end of property: %s", originalProperty));
    }
    String nestedKey = property.substring(0, dotIndex);
    Object nested = targetMap.computeIfAbsent(nestedKey, k -> new HashMap<String, Object>());
    if (!(nested instanceof Map)) {
      // Clash is possible between properties, which are used to configure different objects: e. g.
      // druid.emitter=parametrized is used to configure Emitter class, and druid.emitter.parametrized.xxx=yyy is used
      // to configure ParametrizedUriEmitterConfig object. So skipping xxx=yyy key-value pair when configuring Emitter
      // doesn't make any difference. That is why we just log this situation, instead of throwing an exception.
      log.info(
          "Skipping property [%s]: one of it's prefixes [%s] is also used as a property key.",
          originalProperty,
          propertyPrefix
      );
      return;
    }

View on GitHub (pinned to 9b90983fd2)

Solutions

  1. Locate the property named in the error and remove the extra dot(s) so the key is a valid dotted path like druid.emitter.http.flushThreshold
  2. Check any script or template that generates runtime.properties for accidental '..' or leading-dot output
  3. Restart the Druid process and confirm the error is gone

Example fix

// before (runtime.properties)
druid..emitter=parametrized
// after
druid.emitter=parametrized
Defensive patterns

Strategy: validation

Validate before calling

for (String key : props.stringPropertyNames()) {
  if (key.startsWith(".") || key.contains("..")) throw new IllegalArgumentException("Malformed property key: " + key);
}

Try / catch

try { injector = Guice.createInjector(...); } catch (ProvisionException e) { if (e.getMessage().contains("Double dot")) log.error("Fix dotted property key"); throw e; }

Prevention

When it happens

Trigger: hieraricalPutValue is called recursively from configurate for each runtime property; when indexOf('.') == 0 for the current suffix (key begins with '.' or contains '..'), it throws immediately.

Common situations: Typo in runtime.properties like 'druid..emitter=...' or a stray leading dot from scripted property generation or environment-variable-to-property conversion scripts.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07). Data as JSON: /api/errors/ed9c4c275c86acbb. Report an issue: GitHub.