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

  1. Regenerate the FileDescriptorSet including all dependency .proto files.
  2. Check the validation exception cause for the specific invalid field/type definition.
  3. 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)