apache/druid · error · InvalidProtocolBufferException
Invalid Value type.
Error message
Invalid Value type.
What it means
google.protobuf.Value is a oneof that must have exactly one kind set (null_value, number_value, string_value, bool_value, struct_value, list_value). Druid's converter converts a Value message to a single value; when the message has more than one field populated it is malformed, so this InvalidProtocolBufferException is thrown.
Source
Thrown at extensions-core/protobuf-extensions/src/main/java/org/apache/druid/data/input/protobuf/ProtobufConverter.java:218
msg -> {
final Descriptors.Descriptor descriptor = msg.getDescriptorForType();
final Descriptors.FieldDescriptor field = descriptor.findFieldByName("fields");
if (field == null) {
throw new InvalidProtocolBufferException("Invalid Struct type.");
}
// Struct is formatted as a map object.
return convertSingleValue(field, msg.getField(field));
}
);
converters.put(
Value.getDescriptor().getFullName(),
msg -> {
final Map<Descriptors.FieldDescriptor, Object> fields = msg.getAllFields();
if (fields.isEmpty()) {
return null;
}
if (fields.size() != 1) {
throw new InvalidProtocolBufferException("Invalid Value type.");
}
final Map.Entry<Descriptors.FieldDescriptor, Object> entry = fields.entrySet().stream().findFirst().get();
return convertSingleValue(entry.getKey(), entry.getValue());
}
);
converters.put(
ListValue.getDescriptor().getFullName(),
msg -> {
Descriptors.Descriptor descriptor = msg.getDescriptorForType();
Descriptors.FieldDescriptor field = descriptor.findFieldByName("values");
if (field == null) {
throw new InvalidProtocolBufferException("Invalid ListValue type.");
}
return convertList(field, (List<?>) msg.getField(field));
}
);
return converters;
}View on GitHub (pinned to 9b90983fd2)
Solutions
- Fix the producer to set exactly one field of the Value oneof
- Validate upstream bytes with protoc --decode before ingesting
- Check for data corruption in the transport (Kafka topic, network) that could merge or corrupt records
Example fix
// before: producer sets two members of the Value oneof
value.setStringValue("x"); value.setBoolValue(true);
// after: set exactly one
value.setStringValue("x"); Defensive patterns
Strategy: try-catch
Validate before calling
Message valueMsg = ...;
if ("google.protobuf.Value".equals(valueMsg.getDescriptorForType().getFullName())
&& valueMsg.getAllFields().size() > 1) {
throw new IllegalStateException("google.protobuf.Value has multiple oneof members set");
} Type guard
boolean isValidValue(Message msg) {
if (!"google.protobuf.Value".equals(msg.getDescriptorForType().getFullName())) return true;
int n = msg.getAllFields().size();
return n == 0 || n == 1;
} Try / catch
try {
Map<String, Object> row = ProtobufConverter.convertMessage(msg);
} catch (ParseException e) {
log.error("Malformed Value oneof in record; fix producer or skip record", e);
// route to DLQ instead of failing the whole read
} Prevention
- In producers, always set exactly one member of the Value oneof
- Add a producer-side unit test that round-trips messages through JsonFormat
- Monitor transport for byte corruption (checksums, Kafka ISR health)
When it happens
Trigger: A google.protobuf.Value message with two or more simultaneously-set oneof members is passed to ProtobufConverter.convertMessage (e.g. bytes crafted by hand or produced by a non-conformant producer); fields.size() > 1 at conversion time.
Common situations: Hand-crafted or fuzzed protobuf bytes; a buggy producer writing multiple oneof fields; binary data truncated/corrupted in transit causing malformed parse results.
Understand the failure class
Background: "cannot parse invalid wire-format data", "cannot unmarshal", "failed unmarshalling": protobuf unmarshal errors explained — this error's family across 10 libraries.
Related errors
- Invalid Wrapper type.
- Invalid Struct type.
- Invalid ListValue type.
- Protobuf message could not be parsed
- Fail to decode protobuf message!
AI-assisted analysis of apache/druid@9b90983fd2 (2026-09-07).
Data as JSON: /api/errors/c3ee3101b5a91919.
Report an issue: GitHub.