[
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)