use of com.github.ambry.clustermap.MockDataNodeId in project ambry by linkedin.
the class OperationTrackerTest method useReplicaNotSucceededSendTest.
/**
* crossColoEnabled = true, successTarget = 1, parallelism = 2.
* Only 4 local replicas
*
* 1. Get 1st local replica to send request (and sent);
* 2. Get 2nd local replica to send request (and failed to send);
* 3. Get 3rd local replica to send request (and sent);
* 4. Receive 2 failed responses from the 1st and 3rd replicas;
* 5. Get again 2nd local replica to send request (and sent);
* 6. Get 4th local replica to send request (and failed to send);
* 7. Receive 1 failed responses from the 2nd replicas;
* 8. Get again 4th local replica to send request (and sent);
* 9. Receive 1 successful response from the 4th replica;
* 10. Operation succeeds.
*/
@Test
public void useReplicaNotSucceededSendTest() {
int replicaCount = 4;
List<Port> portList = Collections.singletonList(new Port(PORT, PortType.PLAINTEXT));
List<String> mountPaths = Collections.singletonList("mockMountPath");
datanodes = Collections.singletonList(new MockDataNodeId(portList, mountPaths, "dc-0"));
mockPartition = new MockPartitionId();
populateReplicaList(replicaCount, ReplicaState.STANDBY);
localDcName = datanodes.get(0).getDatacenterName();
mockClusterMap = new MockClusterMap(false, datanodes, 1, Collections.singletonList(mockPartition), localDcName);
OperationTracker ot = getOperationTracker(true, 1, 2, RouterOperation.GetBlobOperation, true);
sendRequests(ot, 2, true);
ot.onResponse(inflightReplicas.poll(), TrackedRequestFinalState.FAILURE);
ot.onResponse(inflightReplicas.poll(), TrackedRequestFinalState.FAILURE);
assertFalse("Operation should not be done", ot.isDone());
sendRequests(ot, 1, true);
ot.onResponse(inflightReplicas.poll(), TrackedRequestFinalState.FAILURE);
assertFalse("Operation should not be done", ot.isDone());
sendRequests(ot, 1, false);
ot.onResponse(inflightReplicas.poll(), TrackedRequestFinalState.SUCCESS);
assertTrue("Operation should have succeeded", ot.hasSucceeded());
assertTrue("Operation should be done", ot.isDone());
}
use of com.github.ambry.clustermap.MockDataNodeId in project ambry by linkedin.
the class OperationTrackerTest method getOperationWithReplicaStateTest.
/**
* Test GET operation is able to try on OFFLINE replicas if routerOperationTrackerIncludeDownReplicas is true.
*/
@Test
public void getOperationWithReplicaStateTest() {
assumeTrue(replicasStateEnabled);
List<Port> portList = Collections.singletonList(new Port(PORT, PortType.PLAINTEXT));
List<String> mountPaths = Collections.singletonList("mockMountPath");
datanodes = new ArrayList<>(Arrays.asList(new MockDataNodeId(portList, mountPaths, "dc-0"), new MockDataNodeId(portList, mountPaths, "dc-1")));
mockPartition = new MockPartitionId();
for (ReplicaState state : EnumSet.of(ReplicaState.BOOTSTRAP, ReplicaState.STANDBY, ReplicaState.LEADER, ReplicaState.INACTIVE, ReplicaState.OFFLINE)) {
populateReplicaList(1, state);
}
localDcName = datanodes.get(0).getDatacenterName();
mockClusterMap = new MockClusterMap(false, datanodes, 1, Collections.singletonList(mockPartition), localDcName);
// 1. include down replicas (OFFLINE replicas are eligible for GET)
OperationTracker ot = getOperationTracker(true, 1, 1, RouterOperation.GetBlobOperation, true);
// make sure 4 requests fails and last one succeeds. (This is to verify operation tracker adds offline replica into replica pool as well)
ReplicaId inflightReplica;
for (int i = 0; i < 4; ++i) {
sendRequests(ot, 1, false);
inflightReplica = inflightReplicas.poll();
// verify that the first 4 replicas are not OFFLINE replica. (OFFLINE replica should be added to the end of queue)
assertNotSame("Replica state should not be OFFLINE ", mockPartition.replicaAndState.get(inflightReplica), ReplicaState.OFFLINE);
ot.onResponse(inflightReplica, TrackedRequestFinalState.FAILURE);
assertFalse("Operation should not complete", ot.isDone());
}
sendRequests(ot, 1, false);
inflightReplica = inflightReplicas.poll();
assertEquals("The last replica should be OFFLINE", ReplicaState.OFFLINE, mockPartition.replicaAndState.get(inflightReplica));
ot.onResponse(inflightReplica, TrackedRequestFinalState.SUCCESS);
assertTrue("Operation should be done", ot.isDone());
// 2. exclude down replicas
repetitionTracker.clear();
ot = getOperationTracker(true, 1, 1, RouterOperation.GetBlobOperation, false);
for (int i = 0; i < 4; ++i) {
sendRequests(ot, 1, false);
inflightReplica = inflightReplicas.poll();
// verify that none of these replicas is OFFLINE replica.
assertNotSame("Replica state should not be OFFLINE ", mockPartition.replicaAndState.get(inflightReplica), ReplicaState.OFFLINE);
ot.onResponse(inflightReplica, TrackedRequestFinalState.FAILURE);
if (i < 3) {
assertFalse("Operation should not complete", ot.isDone());
} else {
assertTrue("Operation should complete", ot.isDone());
}
}
}
use of com.github.ambry.clustermap.MockDataNodeId in project ambry by linkedin.
the class OperationTrackerTest method sendCrossColoRequestToDcWithMostReplicasTest.
/**
* Test the case where originating dc name is null and operation tracker will choose dc with most replicas to send
* cross-colo request.
* local dc: one replica;
* remote dc1: three replicas;
* remote dc2: one replica;
*/
@Test
public void sendCrossColoRequestToDcWithMostReplicasTest() {
List<Port> portList = Collections.singletonList(new Port(PORT, PortType.PLAINTEXT));
List<String> mountPaths = Collections.singletonList("mockMountPath");
// set up one node per data center for testing
MockDataNodeId localDcNode = new MockDataNodeId(portList, mountPaths, "dc-0");
MockDataNodeId remoteDc1Node = new MockDataNodeId(portList, mountPaths, "dc-1");
MockDataNodeId remoteDc2Node = new MockDataNodeId(portList, mountPaths, "dc-2");
mockPartition = new MockPartitionId();
localDcName = localDcNode.getDatacenterName();
originatingDcName = null;
chooseDcWithMostReplicas = true;
mockClusterMap = new MockClusterMap(false, Arrays.asList(localDcNode, remoteDc1Node, remoteDc2Node), 1, Collections.singletonList(mockPartition), localDcName);
populateReplicaList(1, ReplicaState.STANDBY, Collections.singletonList(localDcNode));
populateReplicaList(3, ReplicaState.STANDBY, Collections.singletonList(remoteDc1Node));
populateReplicaList(1, ReplicaState.STANDBY, Collections.singletonList(remoteDc2Node));
OperationTracker ot = getOperationTracker(true, 1, 1, RouterOperation.GetBlobOperation, true);
// make local replica return Not_Found
sendRequests(ot, 1, false);
ot.onResponse(inflightReplicas.poll(), TrackedRequestFinalState.NOT_FOUND);
ReplicaId inflightReplica;
// next, operation tracker should send request to dc-1 as it has most replicas
for (int i = 0; i < 3; ++i) {
sendRequests(ot, 1, false);
inflightReplica = inflightReplicas.poll();
assertEquals("The request should be sent to dc-1 with most replicas", "dc-1", inflightReplica.getDataNodeId().getDatacenterName());
// we deliberately make all replicas in dc-1 return Not_Found to verify that operation won't terminate on not found
ot.onResponse(inflightReplica, TrackedRequestFinalState.NOT_FOUND);
assertFalse("Operation should not be done yet", ot.isDone());
}
// the last request should go to dc-2 and this time we make it succeed
sendRequests(ot, 1, false);
inflightReplica = inflightReplicas.poll();
assertEquals("The request should be sent to dc-2", "dc-2", inflightReplica.getDataNodeId().getDatacenterName());
ot.onResponse(inflightReplica, TrackedRequestFinalState.SUCCESS);
assertTrue("Operation should succeed", ot.hasSucceeded());
assertTrue("Operation should be done", ot.isDone());
}
use of com.github.ambry.clustermap.MockDataNodeId in project ambry by linkedin.
the class OperationTrackerTest method downReplicasOrderingTest.
/**
* Test to ensure that replicas that are down are also returned by the operation tracker, but they are
* ordered after the healthy replicas.
*/
@Test
public void downReplicasOrderingTest() {
List<Port> portList = Collections.singletonList(new Port(PORT, PortType.PLAINTEXT));
List<String> mountPaths = Collections.singletonList("mockMountPath");
datanodes = new ArrayList<>();
datanodes.add(new MockDataNodeId(portList, mountPaths, "dc-0"));
datanodes.add(new MockDataNodeId(portList, mountPaths, "dc-1"));
mockPartition = new MockPartitionId();
mockClusterMap = new MockClusterMap(false, datanodes, 1, Collections.singletonList(mockPartition), datanodes.get(0).getDatacenterName());
int replicaCount = 6;
populateReplicaList(replicaCount, ReplicaState.STANDBY);
// Test scenarios with various number of replicas down
for (int i = 0; i < replicaCount; i++) {
testReplicaDown(replicaCount, i);
}
}
use of com.github.ambry.clustermap.MockDataNodeId in project ambry by linkedin.
the class Http2NetworkClientTest method warmUpConnections.
@Test
public void warmUpConnections() throws Exception {
int connectionPerPort = 4;
SSLFactory sslFactory = new NettySslHttp2Factory(clientSSLConfig);
Properties properties = new Properties();
properties.setProperty(Http2ClientConfig.HTTP2_MIN_CONNECTION_PER_PORT, Integer.toString(connectionPerPort));
Http2ClientConfig http2ClientConfig = new Http2ClientConfig(new VerifiableProperties(properties));
Http2NetworkClient networkClient = new Http2NetworkClient(new Http2ClientMetrics(new MetricRegistry()), http2ClientConfig, sslFactory, eventLoopGroup);
MockClusterMap clusterMap = http2Cluster.getClusterMap();
assertEquals("Connection count is not expected", 0, networkClient.warmUpConnections(clusterMap.getDataNodeIds(), 0, 1000, new ArrayList<>()));
assertEquals("Connection count is not expected", clusterMap.getDataNodeIds().size() * connectionPerPort / 2, networkClient.warmUpConnections(clusterMap.getDataNodeIds(), 50, 1000, new ArrayList<>()));
assertEquals("Connection count is not expected", clusterMap.getDataNodeIds().size() * connectionPerPort, networkClient.warmUpConnections(clusterMap.getDataNodeIds(), 100, 1000, new ArrayList<>()));
// All connection should be failed. Connection refused exceptions will be in test log.
List<Port> ports = new ArrayList<>();
ports.add(new Port(79, PortType.HTTP2));
ports.add(new Port(78, PortType.PLAINTEXT));
assertEquals("Connection count is not expected", 0, networkClient.warmUpConnections(Collections.singletonList(new MockDataNodeId(ports, null, "DC1")), 100, 1000, new ArrayList<>()));
}
Aggregations