apache/druid · error · ParseException

Descriptor not found at URL

Error message

Descriptor not found at URL: [%s]

What it means

Descriptor-fetch failure in FileBasedProtobufBytesDecoder.loadFileDescriptorSet: the descriptorFilePath was interpreted as a URL but opening the connection's input stream returned null or failed, so the descriptor could not be downloaded/read from that URL.

Solutions

  1. Verify the URL is reachable from the ingestion process (network, auth).
  2. Check that the URL serves the FileDescriptorSet content, not an error page.
  3. Place the descriptor on the classpath instead if remote access is unreliable.
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at extensions-core/protobuf-extensions/src/main/java/org/apache/druid/data/input/protobuf/FileBasedProtobufBytesDecoder.java:79 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/d0f1a31f49f24d03. Report an issue: GitHub.

Appendix: source

Thrown at extensions-core/protobuf-extensions/src/main/java/org/apache/druid/data/input/protobuf/FileBasedProtobufBytesDecoder.java:79

    InputStream fin;
    DescriptorProtos.FileDescriptorSet descriptorSet;
    try {
      fin = this.getClass().getClassLoader().getResourceAsStream(descriptorFilePath);
      if (fin == null) {
        URL url;
        try {
          url = new URL(descriptorFilePath);
        }
        catch (MalformedURLException e) {
          throw new ParseException(
              descriptorFilePath,
              e,
              "Descriptor not found in class path or malformed URL: [%s]", descriptorFilePath
              );
        }
        try (InputStream urlIn = url.openConnection().getInputStream()) {
          if (urlIn == null) {
            throw new ParseException(
                descriptorFilePath,
                "Descriptor not found at URL: [%s]", descriptorFilePath
            );
          }
          descriptorSet = DescriptorProtos.FileDescriptorSet.parseFrom(urlIn);
        }
      } else {
        descriptorSet = DescriptorProtos.FileDescriptorSet.parseFrom(fin);
      }

      if (descriptorSet.getFileCount() == 0) {
        throw new ParseException(null, "No file descriptors found in the descriptor set");
      }

      return descriptorSet;
    }
    catch (IOException e) {
      throw new ParseException(descriptorFilePath, e, "Failed to initialize descriptor at [%s]", descriptorFilePath);

View on GitHub (pinned to 9b90983fd2)