{"record":{"id":"e183eedd31edaa9f","repo":"apache/cassandra","slug":"unable-to-propagate-index-status","errorCode":null,"errorMessage":"Unable to propagate index status: {}","messagePattern":"Unable to propagate index status: (.+?)","errorType":"console","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"src/java/org/apache/cassandra/index/IndexStatusManager.java","lineNumber":262,"sourceCode":"                // Versions 5.0.0 through 5.0.2 use a much more bloated format that duplicates keyspace names\n                // and writes full status names instead of their numeric codes. If the minimum cluster version is\n                // unknown or one of those 3 versions, continue to propagate the old format.\n                CassandraVersion minVersion = ClusterMetadata.current().directory.clusterMinVersion.cassandraVersion;\n\n                String newSerializedStatusMap = shouldWriteLegacyStatusFormat(minVersion) ? JsonUtils.writeAsJsonString(statusMap) \n                                                                                          : toSerializedFormat(statusMap);\n\n                statusPropagationExecutor.submit(() -> {\n                    // schedule gossiper update asynchronously to avoid potential deadlock when another thread is holding\n                    // gossiper taskLock.\n                    VersionedValue value = StorageService.instance.valueFactory.indexStatus(newSerializedStatusMap);\n                    Gossiper.instance.addLocalApplicationState(ApplicationState.INDEX_STATUS, value);\n                });\n            }\n        }\n        catch (Exception e)\n        {\n            logger.warn(\"Unable to propagate index status: {}\", e.getMessage());\n        }\n    }\n\n    private static boolean shouldWriteLegacyStatusFormat(CassandraVersion minVersion)\n    {\n        if (DatabaseDescriptor.getForceOptimizedIndexStatusFormat())\n            return false;\n\n        return minVersion == null || (minVersion.major == 5 && minVersion.minor == 0 && minVersion.patch < 3);\n    }\n\n    /**\n     * Serializes as a JSON string the status of the indexes in the provided map.\n     * <p> \n     * For example, the map...\n     * <pre>\n     * {\n     *     ks1.cf1_idx1=FULL_REBUILD_STARTED,","sourceCodeStart":244,"sourceCodeEnd":280,"githubUrl":"https://github.com/apache/cassandra/blob/88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1/src/java/org/apache/cassandra/index/IndexStatusManager.java#L244-L280","documentation":"IndexStatusManager propagates local index build status (built/failed) to other nodes via Gossiper application state. Any exception thrown during propagation is caught and logged at WARN with this message, so a gossip failure never fails index management locally. It means other nodes may temporarily have a stale view of this node's index status.","triggerScenarios":"Calling propagateLocalIndexStatus when Gossiper is not yet fully started, during shutdown, or when serializing the INDEX_STATUS application-state value fails (e.g. legacy vs optimized format handling throwing while computing the value for a peer's version).","commonSituations":"Node starting up and building indexes before gossip settles; rolling upgrades where mixed versions force legacy status format; gossip storm or endpoint changes concurrent with an index build finishing.","solutions":["Read the logged e.getMessage() to identify the underlying exception; it is swallowed here, so full stack traces need debug logging on IndexStatusManager.","Retry after gossip converges — status is re-propagated periodically and on subsequent index events.","During rolling upgrades, ensure all nodes can parse the legacy index status format or set force_optimized_index_status_format appropriately.","If persistent at startup, check that Gossiper has an endpoint for peers (verify seed configuration and connectivity)."],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { IndexStatusManager.instance.propagateLocalIndexStatus(); } catch (Exception e) { logger.warn(\"propagation deferred; status will be re-sent on next gossip cycle\"); }","preventionTips":["Delay index creation until the node has joined gossip (nodetool status shows node UP).","Keep cluster versions homogeneous or verify legacy index status support during rolling upgrades.","Monitor gossip convergence at startup before heavy index operations."],"tags":["gossip","index","propagation","secondary-index"],"backgroundTag":"unexpected-api-response-shape","analyzedSha":"88fd0f6a0eaed8943f05ac9e8f947882b8ddc8f1","analyzedAt":"2026-09-10T07:29:22.284Z","contentChangedAt":"2026-09-10T07:29:22.284Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}