Мы пытаемся изменить код Cassandra для выполнения ТОЛЬКО удаленных чтений (никогда не считывать локально) в целях тестирования производительности с помощью методов уменьшения задержки спекулятивных повторных попыток и дублирования запросов.
Пока что мы изменили
SRC / Java / орг / Apache / Cassandra / сервис / AbstractReadExecutor.java
сделать что-то вроде этого:
public abstract class AbstractReadExecutor {
protected int getNonLocalEndpointIndex (Iterable<InetAddress> endpoints) {
int endpoint_index = 0;
// iterate thru endpoints and pick non-local one
boolean found = false;
for (InetAddress e : endpoints) {
if (! StorageProxy.canDoLocalRequest(e) ) {
found = true;
break;
}
endpoint_index++;
}
if (!found) {
endpoint_index = 0;
}
return endpoint_index;
}
}
public static class NeverSpeculatingReadExecutor extends AbstractReadExecutor {
public void executeAsync() {
int endpoint_index = getNonLocalEndpointIndex(targetReplicas);
makeDataRequests(targetReplicas.subList(endpoint_index, endpoint_index+1));
if (targetReplicas.size() > 1)
makeDigestRequests(targetReplicas.subList(1, targetReplicas.size()));
}
}
}
Однако это не работает, поскольку targetReplicas почти всегда представляет собой только 1 конечную точку (локальную) для использования небольших рабочих нагрузок, 5 узлов кассандры и коэффициент репликации 3.