{"record":{"id":"3aa21cc573c6ccb1","repo":"apache/cassandra","slug":"stopping-log-processing-on-the-node-all-subsequ","errorCode":null,"errorMessage":"Stopping log processing on the node... All subsequent epochs will be ignored.","messagePattern":"Stopping log processing on the node\\.\\.\\. All subsequent epochs will be ignored\\.","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/java/org/apache/cassandra/tcm/log/LocalLog.java","lineNumber":851,"sourceCode":"                    {\n                        Condition condition = subscriber.getAndSet(null);\n                        // Grab a ticket ahead of time, so that we can't get into race with the exit from process pending\n                        signal = logNotifier.register();\n                        processPendingInternal();\n                        if (condition != null)\n                            condition.signalAll();\n                        // if no new threads have subscribed since we started running, await\n                        // otherwise, run again to process whatever work they may be waiting on\n                        if (subscriber.get() == null)\n                        {\n                            signal.await();\n                            signal = null;\n                        }\n                    }\n                }\n                catch (StopProcessingException t)\n                {\n                    logger.warn(\"Stopping log processing on the node... All subsequent epochs will be ignored.\", t);\n                    executor.shutdown();\n                }\n                catch (InterruptedException t)\n                {\n                    // ignore\n                }\n                catch (Throwable t)\n                {\n                    // TODO handle properly\n                    logger.warn(\"Error in log follower\", t);\n                }\n                finally\n                {\n                    // If signal was not consumed for some reason, cancel it\n                    if (signal != null)\n                        signal.cancel();\n                }\n            }","sourceCodeStart":833,"sourceCodeEnd":869,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/tcm/log/LocalLog.java#L833-L869","documentation":"LocalLog's async follower thread catches StopProcessingException thrown by a transformation when the node must stop applying cluster metadata log entries. It logs this warning, shuts down the log executor, and thereafter ignores all subsequent epochs: the node has left the metadata log-processing path (e.g. after being removed from the cluster or hitting an unrecoverable state).","triggerScenarios":"A transformation applied while catching up on the log throws StopProcessingException - typically because the node's metadata state diverged, the node was decommissioned/removed, or the log contains an entry the local node cannot process; LocalLog.Async then stops processing permanently.","commonSituations":"Node removed from the cluster but still running and consuming the log; failed/incompatible transformation after an upgrade; internal error forcing TCM to halt local log catch-up; nodes left running after decommission.","solutions":["Read the attached StopProcessingException stack to learn why processing stopped.","If the node was removed, shut it down; a removed node must not keep serving.","If it was an unexpected stop, restart the node so LocalLog is rebuilt (or re-bootstrap it).","Compare the node's last committed epoch with the CMS to detect divergence and rejoin if needed."],"exampleFix":null,"handlingStrategy":"retry","validationCode":"// Check whether the node is still a metadata member before applying entries\nif (!ClusterMetadataService.instance().isCurrent() && !isMemberOfCluster(metadata)) {\n    throw new StopProcessingException(\"Node no longer member of cluster\");\n}","typeGuard":null,"tryCatchPattern":"try {\n    processCommitted(metadata);\n} catch (StopProcessingException e) {\n    logger.warn(\"Halting log catch-up; node must rejoin or shut down\", e);\n}","preventionTips":["Shut down nodes immediately after decommission/removal.","Keep cluster versions consistent to avoid unprocessable transformations.","Alert on this log line - it means permanent halt of local log processing."],"tags":["tcm","log-follower","stop-processing","node-lifecycle"],"backgroundTag":"invalid-state-transition","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}