You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@phoenix.apache.org by "Lokesh Khurana (Jira)" <ji...@apache.org> on 2026/08/04 21:12:00 UTC
[jira] [Updated] (PHOENIX-7965) ConnectionQueryServicesImpl.getMetaDataCache() returns null after connection close, causing a bare NPE during concurrent query compilation
[ https://issues.apache.org/jira/browse/PHOENIX-7965?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Lokesh Khurana updated PHOENIX-7965:
------------------------------------
Fix Version/s: 5.4.0
> ConnectionQueryServicesImpl.getMetaDataCache() returns null after connection close, causing a bare NPE during concurrent query compilation
> ------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: PHOENIX-7965
> URL: https://issues.apache.org/jira/browse/PHOENIX-7965
> Project: Phoenix
> Issue Type: Bug
> Reporter: Lokesh Khurana
> Assignee: Lokesh Khurana
> Priority: Major
> Fix For: 5.4.0
>
>
> Problem
> ConnectionQueryServicesImpl.getMetaDataCache() is unguarded:
> public PMetaData getMetaDataCache() {
> return latestMetaData; // no null check
> }
> ConnectionQueryServicesImpl.close() sets latestMetaData = null (the field is private volatile PMetaData latestMetaData). The JDBC compile path reads the shared cache via
> PhoenixConnection.getTableRef() → getQueryServices().getMetaDataCache().getTableRef(key). If a connection/CQSI is closed concurrently with an in-flight query compilation (e.g. during a
> cluster failover or connection-pool teardown), getMetaDataCache() returns null and the subsequent .getTableRef(key) throws a bare, causeless NullPointerException with no message — opaque to
> operators and hard to triage. The same exposure exists via PhoenixConnection.getFunction() and getSchema().
> Root cause
> Introduced by PHOENIX-6761 ("Phoenix Client Side Metadata Caching Improvement", commit 9f31c3eca3), which replaced PhoenixConnection's per-connection metadata snapshot with a read of the
> shared, close()-nullable CQSI cache and added the unguarded getMetaDataCache() accessor. A guard method, throwConnectionClosedIfNullMetaData(), already exists and is invoked by every other
> cache accessor/mutator (addTable, removeTable, pruneTables, the internal getTable, etc.) — but not by getMetaDataCache(), which is the one accessor the compile path uses.
> Fix
> Invoke throwConnectionClosedIfNullMetaData() inside getMetaDataCache() so a closed connection surfaces the existing descriptive "Connection to the cluster is closed" exception instead of a
> bare NPE. This makes the failure diagnosable and consistent with the other accessors. Add a unit test asserting the descriptive exception (not a bare NPE) when the cache has been nulled by
> close().
--
This message was sent by Atlassian Jira
(v8.20.10#820010)