Yuntong Qu created CASSJAVA-142:
-----------------------------------

             Summary: MetadataManager: schema refresh never runs again after 
one refresh fails with "Control channel not available"
                 Key: CASSJAVA-142
                 URL: https://issues.apache.org/jira/browse/CASSJAVA-142
             Project: Apache Cassandra Java driver
          Issue Type: Task
            Reporter: Yuntong Qu
            Assignee: Yuntong Qu


{{MetadataManager.SingleThreaded.startSchemaRequest}} sets 
{{currentSchemaRefresh}} when a refresh starts, but only the success path 
clears it. Two failure paths fail the caller's future and leave it set:

# {{schemaQueriesFactory.newInstance()}} throws 
{{IllegalStateException("Control channel not available, aborting schema 
refresh")}} (catch block from CASSJAVA-13).
# {{initControlConnectionForSchema()}} or {{checkSchemaAgreement()}} fails 
({{agreementError}} branch).

After that, every later refresh waits in {{queuedSchemaRefresh}} until the 
session closes. CASSJAVA-13 made the first caller fail fast; it did not clear 
{{currentSchemaRefresh}}, so all later callers still hang.

h3. Impact

* {{refreshSchemaAsync()}} never completes, and schema metadata stays frozen.
* Every later DDL fails with {{DriverTimeoutException}}, although the server 
applied it.
* Only a new session recovers. Spark Cassandra Connector apps hang, because the 
connector calls a blocking {{refreshSchema()}} on each table lookup.

Seen in production with driver 4.18.1 (Spark Cassandra Connector 3.5.1) during 
node maintenance.

h3. Reproduce

Single-node Cassandra 5.0: connect, stop the node, call {{refreshSchema()}}, 
start the node, call {{refreshSchema()}} again, run a {{CREATE TABLE}}.

||Driver||Refresh after node is back||DDL after node is back||
|4.18.1, 4.19.3 (3 runs each)|no completion in 30 s|{{DriverTimeoutException}}; 
table missing from driver metadata|
|4.18.1 + proposed fix (3 runs)|completes|completes|

h3. Proposed fix

Add one method that clears {{currentSchemaRefresh}} and starts the queued 
refresh. Call it from all three completion paths as a separate task on the 
admin executor ({{adminExecutor.execute}}). The failure can complete on an I/O 
thread, and running the cleanup inline could recurse when a caller retries from 
the failure callback. The PR includes unit tests for both failure paths.

h3. Related

* CASSJAVA-13: partial fix (first caller only).
* [JAVA-3059|https://datastax-oss.atlassian.net/browse/JAVA-3059]: original 
report (legacy DataStax JIRA, open). Its 2023-05-19 comment points at the 
refresh queue.
* [SPARKC-636|https://datastax-oss.atlassian.net/browse/SPARKC-636], 
[SPARKC-669|https://datastax-oss.atlassian.net/browse/SPARKC-669]: Spark apps 
hang after a node stops; likely the same bug.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to