prestodb/presto · warning · ArrowException

ARROW_FLIGHT_INFO_ERROR

ARROW_FLIGHT_INFO_ERROR

Error message

Error getting flight information: 

What it means

getFlightInfo issues a FlightClient.getInfo(descriptor, callOptions) RPC to resolve a descriptor into FlightInfo. The only checked exception is InterruptedException, which is wrapped as ArrowException(ARROW_FLIGHT_INFO_ERROR) with 'Error getting flight information: <msg>'. Note the catch does not restore the thread interrupt flag, so an interruption during this RPC surfaces as this connector error.

Source

Thrown at presto-base-arrow-flight/src/main/java/com/facebook/plugin/arrow/BaseArrowFlightClientHandler.java:139

                    clientKey.get().close();
                }
                catch (IOException e) {
                    logger.error("Error closing input stream for client key", e);
                }
            }
        }
    }

    public abstract CallOption[] getCallOptions(ConnectorSession connectorSession);

    protected FlightInfo getFlightInfo(ConnectorSession connectorSession, FlightDescriptor flightDescriptor)
    {
        try (FlightClient client = createFlightClient()) {
            CallOption[] callOptions = getCallOptions(connectorSession);
            return client.getInfo(flightDescriptor, callOptions);
        }
        catch (InterruptedException e) {
            throw new ArrowException(ARROW_FLIGHT_INFO_ERROR, "Error getting flight information: " + e.getMessage(), e);
        }
    }

    protected ClientClosingFlightStream getFlightStream(ConnectorSession connectorSession, ArrowSplit split)
    {
        ByteBuffer endpointBytes = ByteBuffer.wrap(split.getFlightEndpointBytes());
        try {
            FlightEndpoint endpoint = FlightEndpoint.deserialize(endpointBytes);
            FlightClient client = endpoint.getLocations().stream()
                    .findAny()
                    .map(this::createFlightClient)
                    .orElseGet(this::createFlightClient);
            return new ClientClosingFlightStream(
                    client.getStream(endpoint.getTicket(), getCallOptions(connectorSession)),
                    client);
        }
        catch (FlightRuntimeException | IOException | URISyntaxException e) {
            throw new ArrowException(ARROW_FLIGHT_CLIENT_ERROR, e.getMessage(), e);

View on GitHub (pinned to 55bb57d202)

Solutions

  1. Treat it as expected during query cancellation — rerun the query if cancellation was unintentional.
  2. Avoid restarting/shutting down workers while queries are running (drain first).
  3. If it happens spuriously under load, check for thread-pool exhaustion causing cancellation timers to fire late/incorrectly.
  4. Ensure client code that wraps this call doesn't swallow interrupts and re-trigger.
  5. Long-term: consider re-interrupting the thread before throwing to preserve cancellation semantics.

Example fix

// before
catch (InterruptedException e) {
    throw new ArrowException(ARROW_FLIGHT_INFO_ERROR, "Error getting flight information: " + e.getMessage(), e);
}
// after
catch (InterruptedException e) {
    Thread.currentThread().interrupt();
    throw new ArrowException(ARROW_FLIGHT_INFO_ERROR, "Error getting flight information: " + e.getMessage(), e);
}
Defensive patterns

Strategy: retry

Validate before calling

// Skip the RPC if the current thread is already interrupted
if (Thread.currentThread().isInterrupted()) {
    throw new IllegalStateException("Thread already interrupted; not calling getInfo");
}

Try / catch

try {
    return handler.getFlightInfo(session, descriptor);
} catch (ArrowException e) {
    if (e.getErrorCode().getCode() == ARROW_FLIGHT_INFO_ERROR.getCode()
            && e.getCause() instanceof InterruptedException) {
        // query was cancelled / worker shutting down: do not blind-retry,
        // only retry if interruption was spurious and Thread.interrupted() is false
    }
    throw e;
}

Prevention

When it happens

Trigger: Calling getFlightInfo (e.g. from getFlightInfoForTableScan) while the executing thread is interrupted — typically query cancellation, worker shutdown, or a thread pool being torn down mid-RPC.

Common situations: User cancels the Presto query while the driver thread is inside getInfo(); Presto worker shutdown/restart during query execution; session idle timeouts interrupting blocked RPC threads.

Related errors


AI-assisted analysis of prestodb/presto@55bb57d202 (2026-09-04). Data as JSON: /api/errors/03e90c7e778dc9d0. Report an issue: GitHub.