public boolean similarTo(ClusterStateBundle other) {
        if (!baselineState.getClusterState().similarToIgnoringInitProgress(other.baselineState.getClusterState())) {
            return false;
        }
        if (clusterFeedIsBlocked() != other.clusterFeedIsBlocked()) {
            return false;
        }
        if (clusterFeedIsBlocked() && !feedBlock.similarTo(other.feedBlock)) {
            return false;
        }
        // Distribution configs must match exactly for bundles to be similar.
        // It may be the case that they are both null, in which case they are also considered equal.
        if (!Objects.equals(distributionConfig, other.distributionConfig)) {
            return false;
        }
        // FIXME we currently treat mismatching bucket space sets as unchanged to avoid breaking some tests
        return derivedBucketSpaceStates.entrySet().stream()
                .allMatch(entry -> other.derivedBucketSpaceStates.getOrDefault(entry.getKey(), entry.getValue())
                        .getClusterState().similarToIgnoringInitProgress(entry.getValue().getClusterState()));
    }
Feed blocking status of the entire cluster that will be communicated to the nodes
as part of the cluster state bundle. If not present, or if blockFeedInCluster is
false, feed is not automatically blocked.

Note that feed blocking only applies to client feed, not to feed generated by internal
maintenance operations such as merging.

Immutable, so may be safely passed around.
clustercontroller-core/src/main/java/com/yahoo/vespa/clustercontroller/core/ClusterStateBundle.java