[TEST] Don't rely on currentTimeMillis in RoutingServiceTests
If the machine is very slow this test fails if the delta of the unallocaiton timestamp and the last scheduled delay is greater than the scheduled delay time.
This commit is contained in:
parent
5a35a8582b
commit
5098dcaf96
|
@ -36,6 +36,9 @@ import org.junit.After;
|
|||
import org.junit.Before;
|
||||
import org.junit.Test;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Comparator;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.atomic.AtomicBoolean;
|
||||
|
||||
import static org.elasticsearch.cluster.routing.ShardRoutingState.INITIALIZING;
|
||||
|
@ -111,23 +114,32 @@ public class RoutingServiceTests extends ESAllocationTestCase {
|
|||
// starting replicas
|
||||
clusterState = ClusterState.builder(clusterState).routingResult(allocation.applyStartedShards(clusterState, clusterState.getRoutingNodes().shardsWithState(INITIALIZING))).build();
|
||||
assertFalse("no shards should be unassigned", clusterState.getRoutingNodes().hasUnassigned());
|
||||
String nodeId = null;
|
||||
final List<ShardRouting> allShards = clusterState.getRoutingNodes().routingTable().allShards("test");
|
||||
// we need to find the node with the replica otherwise we will not reroute
|
||||
for (ShardRouting shardRouting : allShards) {
|
||||
if (shardRouting.primary() == false) {
|
||||
nodeId = shardRouting.currentNodeId();
|
||||
break;
|
||||
}
|
||||
}
|
||||
assertNotNull(nodeId);
|
||||
// remove node2 and reroute
|
||||
|
||||
ClusterState prevState = clusterState;
|
||||
clusterState = ClusterState.builder(clusterState).nodes(DiscoveryNodes.builder(clusterState.nodes()).remove("node2")).build();
|
||||
clusterState = ClusterState.builder(clusterState).nodes(DiscoveryNodes.builder(clusterState.nodes()).remove(nodeId)).build();
|
||||
clusterState = ClusterState.builder(clusterState).routingResult(allocation.reroute(clusterState)).build();
|
||||
// We need to update the routing service's last attempted run to
|
||||
// signal that the GatewayAllocator tried to allocated it but
|
||||
// it was delayed
|
||||
routingService.setUnassignedShardsAllocatedTimestamp(System.currentTimeMillis());
|
||||
ClusterState newState = clusterState;
|
||||
RoutingNodes.UnassignedShards unassigned = clusterState.getRoutingNodes().unassigned();
|
||||
assertEquals(1, unassigned.size());
|
||||
ShardRouting next = unassigned.iterator().next();
|
||||
routingService.setUnassignedShardsAllocatedTimestamp(next.unassignedInfo().getTimestampInMillis() + randomIntBetween(0, 99));
|
||||
|
||||
ClusterState newState = clusterState;
|
||||
routingService.clusterChanged(new ClusterChangedEvent("test", newState, prevState));
|
||||
assertBusy(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
assertTrue("routing service should have run a reroute", routingService.hasReroutedAndClear());
|
||||
}
|
||||
});
|
||||
assertBusy(() -> assertTrue("routing service should have run a reroute", routingService.hasReroutedAndClear()));
|
||||
// verify the registration has been reset
|
||||
assertThat(routingService.getRegisteredNextDelaySetting(), equalTo(Long.MAX_VALUE));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue