@Test
  public void getOperationFailDueToNotFoundWithOriginatingTwoDown() {
    assumeTrue(replicasStateEnabled);

    List<Port> portList = Collections.singletonList(new Port(PORT, PortType.PLAINTEXT));
    List<String> mountPaths = Collections.singletonList("mockMountPath");
    MockDataNodeId localDcNode = new MockDataNodeId(portList, mountPaths, "dc-0");
    datanodes = new ArrayList<>(Collections.singletonList(localDcNode));
    mockPartition = new MockPartitionId();
    populateReplicaList(1, ReplicaState.LEADER, Collections.singletonList(localDcNode));
    populateReplicaList(2, ReplicaState.OFFLINE, Collections.singletonList(localDcNode));
    localDcName = datanodes.get(0).getDatacenterName();
    originatingDcName = localDcName;
    mockClusterMap = new MockClusterMap(false, datanodes, 1, Collections.singletonList(mockPartition), localDcName);
    // 1. include down replicas (OFFLINE replicas are eligible for GET)
    OperationTracker ot = getOperationTrackerForGetOrPut(true, 1, 1, RouterOperation.GetBlobOperation, true);
    ReplicaId inflightReplica;
    sendRequests(ot, 1, false);
    inflightReplica = inflightReplicas.poll();
    assertNotSame("Replica state should not be OFFLINE ", mockPartition.replicaAndState.get(inflightReplica),
        ReplicaState.OFFLINE);
    ot.onResponse(inflightReplica, TrackedRequestFinalState.DISK_DOWN);
    assertFalse("Operation should not complete", ot.isDone());

    for (int i = 0; i < 2; ++i) {
      sendRequests(ot, 1, false);
      inflightReplica = inflightReplicas.poll();
      ot.onResponse(inflightReplica, TrackedRequestFinalState.NOT_FOUND);
      if (i == 1) {
        // the last one
        assertTrue("Operation should complete", ot.isDone());
      } else {
        assertFalse("Operation should not complete", ot.isDone());
      }
    }
    assertFalse(ot.hasFailedOnNotFound());

    // 2. exclude down replicas
    repetitionTracker.clear();
    ot = getOperationTrackerForGetOrPut(true, 1, 1, RouterOperation.GetBlobOperation, false);
    sendRequests(ot, 1, false);
    inflightReplica = inflightReplicas.poll();
    ot.onResponse(inflightReplica, TrackedRequestFinalState.NOT_FOUND);
    assertTrue("Operation should be done", ot.isDone());
    assertFalse(ot.hasFailedOnNotFound());
  }
Duplicate the GCN issue:
Among the 9 replicas, some are ERROR(in the GCN case, these are not listed in the Helix external view.
All the eligible replica returns either DiskDown or NotFound.
Originating Colo only has 1 replica in the eligible replica, so we return Ambry Unavailable instead of Not_Found.
ambry-router/src/test/java/com/github/ambry/router/OperationTrackerTest.java