Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions changelog/unreleased/SOLR-18391.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
title: Fail collection creation cleanly when the collection is missing from cluster state during replica assignment.
type: fixed
authors:
- name: Nick Shanin
links:
- name: SOLR-18391
url: https://issues.apache.org/jira/browse/SOLR-18391
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import org.apache.solr.cloud.api.collections.Assign;
import org.apache.solr.cluster.Node;
import org.apache.solr.cluster.Replica.ReplicaType;
import org.apache.solr.cluster.SolrCollection;
import org.apache.solr.cluster.placement.BalanceRequest;
import org.apache.solr.cluster.placement.DeleteCollectionRequest;
import org.apache.solr.cluster.placement.DeleteReplicasRequest;
Expand Down Expand Up @@ -67,11 +68,21 @@ public List<ReplicaPosition> assign(

List<PlacementRequest> placementRequests = new ArrayList<>(assignRequests.size());
for (Assign.AssignRequest assignRequest : assignRequests) {
SolrCollection solrCollection =
placementContext.getCluster().getCollection(assignRequest.collectionName);
if (solrCollection == null) {
// The collection can be missing from cluster state here (race between
// CreateCollectionCmd.waitForState and getClusterState). Fail with
// AssignmentException so the collection create is cleaned up instead of
// NPEing and leaving a zombie collection with no replicas.
throw new Assign.AssignmentException(
"Collection "
+ assignRequest.collectionName
+ " not found in cluster state; cannot assign replicas");
}
placementRequests.add(
PlacementRequestImpl.toPlacementRequest(
placementContext.getCluster(),
placementContext.getCluster().getCollection(assignRequest.collectionName),
assignRequest));
placementContext.getCluster(), solrCollection, assignRequest));
}

final List<ReplicaPosition> replicaPositions = new ArrayList<>();
Expand Down
Loading