apache/druid · error · ParseException
Invalid protobuf descriptor
Error message
Invalid protobuf descriptor
What it means
Descriptor-validation failure in DescriptorBasedProtobufBytesDecoder.buildMessageDescriptor: building the file descriptors threw DescriptorValidationException, meaning the descriptor set is internally inconsistent (unresolved dependencies, invalid field definitions), so no usable message descriptor can be produced.
Solutions
- Regenerate the FileDescriptorSet including all dependency .proto files.
- Check the validation exception cause for the specific invalid field/type definition.
- Ensure protoc output is complete and not hand-edited.
Defensive patterns
Strategy: try-catch
When it happens
Trigger: Thrown at extensions-core/protobuf-extensions/src/main/java/org/apache/druid/data/input/protobuf/DescriptorBasedProtobufBytesDecoder.java:160 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/aef18f71abc9eaba.
Report an issue: GitHub.
Appendix: source
Thrown at extensions-core/protobuf-extensions/src/main/java/org/apache/druid/data/input/protobuf/DescriptorBasedProtobufBytesDecoder.java:160
return desc;
}
}
// Something went wrong... collect all available types for better error message
final var availableTypes = new TreeSet<String>();
for (final var fileDescriptor : allDescriptors.values()) {
collectAvailableTypes(fileDescriptor, availableTypes);
}
throw new ParseException(
null,
"Protobuf message type [%s] not found in the descriptor set. Available types: %s",
protoMessageType,
availableTypes
);
}
catch (Descriptors.DescriptorValidationException e) {
throw new ParseException(null, e, "Invalid protobuf descriptor");
}
}
@Nullable
private Descriptors.Descriptor findMessageByName(
final Descriptors.FileDescriptor fileDescriptor,
final String messageTypeName
)
{
// Try simple name match first
for (final var messageType : fileDescriptor.getMessageTypes()) {
if (messageType.getName().equals(messageTypeName) || messageType.getFullName().equals(messageTypeName)) {
return messageType;
}
// Try nested types (e.g., "ParentMessage.NestedMessage")
final var nested = findNestedMessage(messageType, messageTypeName);
if (nested != null) {View on GitHub (pinned to 9b90983fd2)