use of org.elasticsearch.cluster.routing.UnassignedInfo.AllocationStatus in project elasticsearch by elastic.
the class AllocateUnassignedDecisionTests method testNoDecision.
public void testNoDecision() {
final AllocationStatus allocationStatus = randomFrom(AllocationStatus.DELAYED_ALLOCATION, AllocationStatus.NO_VALID_SHARD_COPY, AllocationStatus.FETCHING_SHARD_DATA);
AllocateUnassignedDecision noDecision = AllocateUnassignedDecision.no(allocationStatus, null);
assertTrue(noDecision.isDecisionTaken());
assertEquals(AllocationDecision.fromAllocationStatus(allocationStatus), noDecision.getAllocationDecision());
assertEquals(allocationStatus, noDecision.getAllocationStatus());
if (allocationStatus == AllocationStatus.FETCHING_SHARD_DATA) {
assertEquals("cannot allocate because information about existing shard data is still being retrieved from " + "some of the nodes", noDecision.getExplanation());
} else if (allocationStatus == AllocationStatus.DELAYED_ALLOCATION) {
assertThat(noDecision.getExplanation(), startsWith("cannot allocate because the cluster is still waiting"));
} else {
assertThat(noDecision.getExplanation(), startsWith("cannot allocate because a previous copy of the primary shard existed"));
}
assertNull(noDecision.getNodeDecisions());
assertNull(noDecision.getTargetNode());
assertNull(noDecision.getAllocationId());
List<NodeAllocationResult> nodeDecisions = new ArrayList<>();
nodeDecisions.add(new NodeAllocationResult(node1, Decision.NO, 1));
nodeDecisions.add(new NodeAllocationResult(node2, Decision.NO, 2));
final boolean reuseStore = randomBoolean();
noDecision = AllocateUnassignedDecision.no(AllocationStatus.DECIDERS_NO, nodeDecisions, reuseStore);
assertTrue(noDecision.isDecisionTaken());
assertEquals(AllocationDecision.NO, noDecision.getAllocationDecision());
assertEquals(AllocationStatus.DECIDERS_NO, noDecision.getAllocationStatus());
if (reuseStore) {
assertEquals("cannot allocate because allocation is not permitted to any of the nodes that hold an in-sync shard copy", noDecision.getExplanation());
} else {
assertEquals("cannot allocate because allocation is not permitted to any of the nodes", noDecision.getExplanation());
}
assertEquals(nodeDecisions.stream().sorted().collect(Collectors.toList()), noDecision.getNodeDecisions());
// node1 should be sorted first b/c of better weight ranking
assertEquals("node1", noDecision.getNodeDecisions().iterator().next().getNode().getId());
assertNull(noDecision.getTargetNode());
assertNull(noDecision.getAllocationId());
// test bad values
expectThrows(NullPointerException.class, () -> AllocateUnassignedDecision.no(null, null));
}
use of org.elasticsearch.cluster.routing.UnassignedInfo.AllocationStatus in project elasticsearch by elastic.
the class AllocationDecisionTests method testFromAllocationStatus.
/**
* Tests getting a {@link AllocationDecision} from {@link AllocationStatus}.
*/
public void testFromAllocationStatus() {
AllocationStatus allocationStatus = rarely() ? null : randomFrom(AllocationStatus.values());
AllocationDecision allocationDecision = AllocationDecision.fromAllocationStatus(allocationStatus);
AllocationDecision expected;
if (allocationStatus == null) {
expected = AllocationDecision.YES;
} else if (allocationStatus == AllocationStatus.DECIDERS_THROTTLED) {
expected = AllocationDecision.THROTTLED;
} else if (allocationStatus == AllocationStatus.FETCHING_SHARD_DATA) {
expected = AllocationDecision.AWAITING_INFO;
} else if (allocationStatus == AllocationStatus.DELAYED_ALLOCATION) {
expected = AllocationDecision.ALLOCATION_DELAYED;
} else if (allocationStatus == AllocationStatus.NO_VALID_SHARD_COPY) {
expected = AllocationDecision.NO_VALID_SHARD_COPY;
} else if (allocationStatus == AllocationStatus.NO_ATTEMPT) {
expected = AllocationDecision.NO_ATTEMPT;
} else {
expected = AllocationDecision.NO;
}
assertEquals(expected, allocationDecision);
}
use of org.elasticsearch.cluster.routing.UnassignedInfo.AllocationStatus in project elasticsearch by elastic.
the class AllocateUnassignedDecisionTests method testCachedDecisions.
public void testCachedDecisions() {
List<AllocationStatus> cachableStatuses = Arrays.asList(AllocationStatus.DECIDERS_NO, AllocationStatus.DECIDERS_THROTTLED, AllocationStatus.NO_VALID_SHARD_COPY, AllocationStatus.FETCHING_SHARD_DATA, AllocationStatus.DELAYED_ALLOCATION);
for (AllocationStatus allocationStatus : cachableStatuses) {
if (allocationStatus == AllocationStatus.DECIDERS_THROTTLED) {
AllocateUnassignedDecision cached = AllocateUnassignedDecision.throttle(null);
AllocateUnassignedDecision another = AllocateUnassignedDecision.throttle(null);
assertSame(cached, another);
AllocateUnassignedDecision notCached = AllocateUnassignedDecision.throttle(new ArrayList<>());
another = AllocateUnassignedDecision.throttle(new ArrayList<>());
assertNotSame(notCached, another);
} else {
AllocateUnassignedDecision cached = AllocateUnassignedDecision.no(allocationStatus, null);
AllocateUnassignedDecision another = AllocateUnassignedDecision.no(allocationStatus, null);
assertSame(cached, another);
AllocateUnassignedDecision notCached = AllocateUnassignedDecision.no(allocationStatus, new ArrayList<>());
another = AllocateUnassignedDecision.no(allocationStatus, new ArrayList<>());
assertNotSame(notCached, another);
}
}
// yes decisions are not precomputed and cached
AllocateUnassignedDecision first = AllocateUnassignedDecision.yes(node1, "abc", emptyList(), randomBoolean());
AllocateUnassignedDecision second = AllocateUnassignedDecision.yes(node1, "abc", emptyList(), randomBoolean());
// same fields for the ShardAllocationDecision, but should be different instances
assertNotSame(first, second);
}
use of org.elasticsearch.cluster.routing.UnassignedInfo.AllocationStatus in project elasticsearch by elastic.
the class UnassignedInfoTests method testAllocationStatusSerialization.
public void testAllocationStatusSerialization() throws IOException {
for (AllocationStatus allocationStatus : AllocationStatus.values()) {
BytesStreamOutput out = new BytesStreamOutput();
allocationStatus.writeTo(out);
ByteBufferStreamInput in = new ByteBufferStreamInput(ByteBuffer.wrap(out.bytes().toBytesRef().bytes));
AllocationStatus readStatus = AllocationStatus.readFrom(in);
assertThat(readStatus, equalTo(allocationStatus));
}
}
use of org.elasticsearch.cluster.routing.UnassignedInfo.AllocationStatus in project elasticsearch by elastic.
the class AllocateUnassignedDecision method fromDecision.
/**
* Creates a {@link AllocateUnassignedDecision} from the given {@link Decision} and the assigned node, if any.
*/
public static AllocateUnassignedDecision fromDecision(Decision decision, @Nullable DiscoveryNode assignedNode, @Nullable List<NodeAllocationResult> nodeDecisions) {
final Type decisionType = decision.type();
AllocationStatus allocationStatus = decisionType != Type.YES ? AllocationStatus.fromDecision(decisionType) : null;
return new AllocateUnassignedDecision(allocationStatus, assignedNode, null, nodeDecisions, false, 0L, 0L);
}
Aggregations