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
- 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
- Check any script or template that generates runtime.properties for accidental '..' or leading-dot output
- 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
- Never hand-edit generated properties files; use templating that validates keys
- Add a startup pre-check script that rejects keys with '..' or leading dots
- Keep one canonical source of truth for runtime.properties
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
- Dot at the end of property: %s
- %s - %s
- JsonConfigurator requires default classes to have zero-arg c
- JsonConfigurator requires Jackson-annotated Config objects t
- Some value must be configured for [%s]
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/ed9c4c275c86acbb.
Report an issue: GitHub.