openjdk/jdk · error · IOException

No port file values materialized. Giving up after {} ms

Error message

No port file values materialized. Giving up after {} ms

What it means

IOException from PortFile.waitForValidValues(): the caller (typically a client after triggering server startup) polled lock/getValues/unlock for the port file until a per-call timeout elapsed, but the file never contained valid server connection values. The message reports the actual elapsed milliseconds spent waiting.

Source

Thrown at make/langtools/tools/javacserver/shared/PortFile.java:260

        long startTime = System.currentTimeMillis();
        long timeout = startTime + getServerStartupTimeoutSeconds() * 1000;
        while (true) {
            Log.debug("Looking for valid port file values...");
            if (exists()) {
                lock();
                getValues();
                unlock();
            }
            if (containsPortInfo) {
                Log.debug("Valid port file values found after " + (System.currentTimeMillis() - startTime) + " ms");
                return;
            }
            if (System.currentTimeMillis() > timeout) {
                break;
            }
            Thread.sleep(MS_BETWEEN_ATTEMPTS);
        }
        throw new IOException("No port file values materialized. Giving up after " +
                                      (System.currentTimeMillis() - startTime) + " ms");
    }

    /**
     * Check if the portfile still contains my values, assuming that I am the server.
     */
    public boolean stillMyValues() throws IOException, FileNotFoundException, InterruptedException {
        for (;;) {
            try {
                lock();
                getValues();
                unlock();
                if (containsPortInfo) {
                    if (serverPort == myServerPort &&
                        serverCookie == myServerCookie) {
                        // Everything is ok.
                        return true;
                    }

View on GitHub (pinned to 88dfb74bbe)

Solutions

  1. Increase the wait timeout so slow machine startup (cold JVM, loaded CI host) completes.
  2. Diagnose why the daemon never wrote values: run it in the foreground and watch its output.
  3. Clear stale port files and orphaned server processes before the build.
  4. Check for disk/filesystem latency on the port file directory.
Defensive patterns

Strategy: retry

Validate before calling

// before waiting, cheaply check the daemon is even alive
if (!serverProcess.isAlive())
    throw new IOException("javacserver daemon exited before writing the port file; see its output");

Try / catch

try {
    portFile.waitForValidValues(timeoutMs);
} catch (IOException e) {
    if (serverProcess.isAlive() && elapsed < hardLimit) {
        portFile.waitForValidValues(timeoutMs * 2); // one backoff retry on loaded hosts
    } else {
        killServerAndRemovePortFile(); // avoid poisoned state for the next client
        throw e;
    }
}

Prevention

When it happens

Trigger: Client starts a new javacserver and waits for the daemon to write its port into the shared port file; the daemon crashes before writing, or the values it writes are for a different server incarnation (mismatched cookie), so containsPortInfo never becomes true.

Common situations: Forked server dying at startup (see 'Server failed to initialize'); concurrent clients racing where one deletes the port file; slow or hung disks delaying the daemon's write past the timeout.

Related errors


AI-assisted analysis of openjdk/jdk@88dfb74bbe (2026-08-14). Data as JSON: /api/errors/27138870ae953209. Report an issue: GitHub.