apache/cassandra · warning

Unable to propagate index status: {}

Error message

Unable to propagate index status: {}

What it means

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.

Source

Thrown at src/java/org/apache/cassandra/index/IndexStatusManager.java:262

                // Versions 5.0.0 through 5.0.2 use a much more bloated format that duplicates keyspace names
                // and writes full status names instead of their numeric codes. If the minimum cluster version is
                // unknown or one of those 3 versions, continue to propagate the old format.
                CassandraVersion minVersion = ClusterMetadata.current().directory.clusterMinVersion.cassandraVersion;

                String newSerializedStatusMap = shouldWriteLegacyStatusFormat(minVersion) ? JsonUtils.writeAsJsonString(statusMap) 
                                                                                          : toSerializedFormat(statusMap);

                statusPropagationExecutor.submit(() -> {
                    // schedule gossiper update asynchronously to avoid potential deadlock when another thread is holding
                    // gossiper taskLock.
                    VersionedValue value = StorageService.instance.valueFactory.indexStatus(newSerializedStatusMap);
                    Gossiper.instance.addLocalApplicationState(ApplicationState.INDEX_STATUS, value);
                });
            }
        }
        catch (Exception e)
        {
            logger.warn("Unable to propagate index status: {}", e.getMessage());
        }
    }

    private static boolean shouldWriteLegacyStatusFormat(CassandraVersion minVersion)
    {
        if (DatabaseDescriptor.getForceOptimizedIndexStatusFormat())
            return false;

        return minVersion == null || (minVersion.major == 5 && minVersion.minor == 0 && minVersion.patch < 3);
    }

    /**
     * Serializes as a JSON string the status of the indexes in the provided map.
     * <p> 
     * For example, the map...
     * <pre>
     * {
     *     ks1.cf1_idx1=FULL_REBUILD_STARTED,

View on GitHub (pinned to 88fd0f6a0e)

Solutions

  1. Read the logged e.getMessage() to identify the underlying exception; it is swallowed here, so full stack traces need debug logging on IndexStatusManager.
  2. Retry after gossip converges — status is re-propagated periodically and on subsequent index events.
  3. During rolling upgrades, ensure all nodes can parse the legacy index status format or set force_optimized_index_status_format appropriately.
  4. If persistent at startup, check that Gossiper has an endpoint for peers (verify seed configuration and connectivity).
Defensive patterns

Strategy: fallback

Try / catch

try { IndexStatusManager.instance.propagateLocalIndexStatus(); } catch (Exception e) { logger.warn("propagation deferred; status will be re-sent on next gossip cycle"); }

Prevention

When it happens

Trigger: 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).

Common situations: 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.

Understand the failure class

Background: "invalid response format", "malformed payload", "missing data field": when an API returns 200 but the response shape is wrong — this error's family across 23 libraries.

Related errors


AI-assisted analysis of apache/cassandra@88fd0f6a0e (2026-09-10). Data as JSON: /api/errors/e183eedd31edaa9f. Report an issue: GitHub.