apache/pulsar · error · IllegalArgumentException

Malformed configuration file

Error message

Malformed configuration file

What it means

readBookieConfFile catches ConfigurationException from bookieConf.loadConf/bookieConf.validate and rethrows it as 'Malformed configuration file'. It means the Bookie configuration file exists but cannot be parsed or fails validation by the configuration framework.

Source

Thrown at pulsar-broker/src/main/java/org/apache/pulsar/PulsarBrokerStarter.java:120

        @Option(names = {"-h", "--help"}, usageHelp = true, description = "Show this help message")
        private boolean help = false;

        @Option(names = {"-g", "--generate-docs"}, description = "Generate docs")
        private boolean generateDocs = false;
    }

    private static ServerConfiguration readBookieConfFile(String bookieConfigFile) throws IllegalArgumentException {
        ServerConfiguration bookieConf = new ServerConfiguration();
        try {
            bookieConf.loadConf(new File(bookieConfigFile).toURI().toURL());
            bookieConf.validate();
            log.info().attr("file", bookieConfigFile).log("Using bookie configuration file");
        } catch (MalformedURLException e) {
            log.error().attr("file", bookieConfigFile).exception(e).log("Could not open configuration file");
            throw new IllegalArgumentException("Could not open configuration file");
        } catch (ConfigurationException e) {
            log.error().attr("file", bookieConfigFile).exception(e).log("Malformed configuration file");
            throw new IllegalArgumentException("Malformed configuration file");
        }

        if (bookieConf.getMaxPendingReadRequestPerThread() < bookieConf.getRereplicationEntryBatchSize()) {
            throw new IllegalArgumentException(
                "rereplicationEntryBatchSize should be smaller than " + "maxPendingReadRequestPerThread");
        }
        return bookieConf;
    }

    protected static class BrokerStarter implements Callable<Integer> {
        private ServiceConfiguration brokerConfig;
        private PulsarService pulsarService;
        private LifecycleComponent bookieServer;
        private volatile CompletableFuture<Void> bookieStartFuture;
        private AutoRecoveryMain autoRecoveryMain;
        private StatsProvider bookieStatsProvider;
        private ServerConfiguration bookieConfig;
        private WorkerService functionsWorkerService;

View on GitHub (pinned to 820761864e)

Solutions

  1. Fix the syntax/values in the bookie configuration file; compare against conf/bookie.conf shipped with your Pulsar version
  2. Check the logged ConfigurationException (stack trace shows the offending property)
  3. Validate types of numeric/boolean properties and remove unsupported keys from old versions

Example fix

// before (bookie.conf)
bookiePort=not-a-number
// after
bookiePort=3181
Defensive patterns

Strategy: validation

Validate before calling

// Pre-parse check in the caller
Properties props = new Properties();
try (InputStream in = Files.newInputStream(Path.of(bookieConfigFile))) {
    props.load(in);
    if (!props.stringPropertyNames().contains("bookiePort")) {
        throw new IllegalStateException("bookie.conf missing required keys");
    }
}

Try / catch

try {
    BookKeeperConfiguration conf = readBookieConfFile(bookieConfigFile);
} catch (IllegalArgumentException e) {
    if (e.getMessage().equals("Malformed configuration file")) {
        throw new IllegalStateException("Invalid bookie.conf " + bookieConfigFile + ": fix syntax/types", e);
    }
    throw e;
}

Prevention

When it happens

Trigger: Bookie config file contains invalid syntax, wrong value types (e.g. non-numeric port), or a value that fails BookKeeper's Configuration validate() step; thrown when --bookie-config points to a parseable-path but invalid-content file.

Common situations: Hand-edited bookie.conf with typos; copying an incompatible bookkeeper config across versions; missing required properties; wrong encoding or stray characters in the file.

Understand the failure class

Related errors


AI-assisted analysis of apache/pulsar@820761864e (2026-09-06). Data as JSON: /api/errors/15371dcccd3a89c1. Report an issue: GitHub.