use of org.apache.kafka.common.message.AlterReplicaLogDirsRequestData.AlterReplicaLogDirTopic in project kafka by apache.
the class AlterReplicaLogDirsRequestTest method testErrorResponse.
@Test
public void testErrorResponse() {
AlterReplicaLogDirsRequestData data = new AlterReplicaLogDirsRequestData().setDirs(new AlterReplicaLogDirCollection(singletonList(new AlterReplicaLogDir().setPath("/data0").setTopics(new AlterReplicaLogDirTopicCollection(singletonList(new AlterReplicaLogDirTopic().setName("topic").setPartitions(asList(0, 1, 2))).iterator()))).iterator()));
AlterReplicaLogDirsResponse errorResponse = new AlterReplicaLogDirsRequest.Builder(data).build().getErrorResponse(123, new LogDirNotFoundException("/data0"));
assertEquals(1, errorResponse.data().results().size());
AlterReplicaLogDirTopicResult topicResponse = errorResponse.data().results().get(0);
assertEquals("topic", topicResponse.topicName());
assertEquals(3, topicResponse.partitions().size());
for (int i = 0; i < 3; i++) {
assertEquals(i, topicResponse.partitions().get(i).partitionIndex());
assertEquals(Errors.LOG_DIR_NOT_FOUND.code(), topicResponse.partitions().get(i).errorCode());
}
}
use of org.apache.kafka.common.message.AlterReplicaLogDirsRequestData.AlterReplicaLogDirTopic in project kafka by apache.
the class AlterReplicaLogDirsRequestTest method testPartitionDir.
@Test
public void testPartitionDir() {
AlterReplicaLogDirsRequestData data = new AlterReplicaLogDirsRequestData().setDirs(new AlterReplicaLogDirCollection(asList(new AlterReplicaLogDir().setPath("/data0").setTopics(new AlterReplicaLogDirTopicCollection(asList(new AlterReplicaLogDirTopic().setName("topic").setPartitions(asList(0, 1)), new AlterReplicaLogDirTopic().setName("topic2").setPartitions(asList(7))).iterator())), new AlterReplicaLogDir().setPath("/data1").setTopics(new AlterReplicaLogDirTopicCollection(asList(new AlterReplicaLogDirTopic().setName("topic3").setPartitions(asList(12))).iterator()))).iterator()));
AlterReplicaLogDirsRequest request = new AlterReplicaLogDirsRequest.Builder(data).build();
Map<TopicPartition, String> expect = new HashMap<>();
expect.put(new TopicPartition("topic", 0), "/data0");
expect.put(new TopicPartition("topic", 1), "/data0");
expect.put(new TopicPartition("topic2", 7), "/data0");
expect.put(new TopicPartition("topic3", 12), "/data1");
assertEquals(expect, request.partitionDirs());
}
use of org.apache.kafka.common.message.AlterReplicaLogDirsRequestData.AlterReplicaLogDirTopic in project kafka by apache.
the class RequestResponseTest method createAlterReplicaLogDirsRequest.
private AlterReplicaLogDirsRequest createAlterReplicaLogDirsRequest(short version) {
AlterReplicaLogDirsRequestData data = new AlterReplicaLogDirsRequestData();
data.dirs().add(new AlterReplicaLogDirsRequestData.AlterReplicaLogDir().setPath("/data0").setTopics(new AlterReplicaLogDirTopicCollection(singletonList(new AlterReplicaLogDirTopic().setPartitions(singletonList(0)).setName("topic")).iterator())));
return new AlterReplicaLogDirsRequest.Builder(data).build(version);
}
use of org.apache.kafka.common.message.AlterReplicaLogDirsRequestData.AlterReplicaLogDirTopic in project kafka by apache.
the class KafkaAdminClient method alterReplicaLogDirs.
@Override
public AlterReplicaLogDirsResult alterReplicaLogDirs(Map<TopicPartitionReplica, String> replicaAssignment, final AlterReplicaLogDirsOptions options) {
final Map<TopicPartitionReplica, KafkaFutureImpl<Void>> futures = new HashMap<>(replicaAssignment.size());
for (TopicPartitionReplica replica : replicaAssignment.keySet()) futures.put(replica, new KafkaFutureImpl<>());
Map<Integer, AlterReplicaLogDirsRequestData> replicaAssignmentByBroker = new HashMap<>();
for (Map.Entry<TopicPartitionReplica, String> entry : replicaAssignment.entrySet()) {
TopicPartitionReplica replica = entry.getKey();
String logDir = entry.getValue();
int brokerId = replica.brokerId();
AlterReplicaLogDirsRequestData value = replicaAssignmentByBroker.computeIfAbsent(brokerId, key -> new AlterReplicaLogDirsRequestData());
AlterReplicaLogDir alterReplicaLogDir = value.dirs().find(logDir);
if (alterReplicaLogDir == null) {
alterReplicaLogDir = new AlterReplicaLogDir();
alterReplicaLogDir.setPath(logDir);
value.dirs().add(alterReplicaLogDir);
}
AlterReplicaLogDirTopic alterReplicaLogDirTopic = alterReplicaLogDir.topics().find(replica.topic());
if (alterReplicaLogDirTopic == null) {
alterReplicaLogDirTopic = new AlterReplicaLogDirTopic().setName(replica.topic());
alterReplicaLogDir.topics().add(alterReplicaLogDirTopic);
}
alterReplicaLogDirTopic.partitions().add(replica.partition());
}
final long now = time.milliseconds();
for (Map.Entry<Integer, AlterReplicaLogDirsRequestData> entry : replicaAssignmentByBroker.entrySet()) {
final int brokerId = entry.getKey();
final AlterReplicaLogDirsRequestData assignment = entry.getValue();
runnable.call(new Call("alterReplicaLogDirs", calcDeadlineMs(now, options.timeoutMs()), new ConstantNodeIdProvider(brokerId)) {
@Override
public AlterReplicaLogDirsRequest.Builder createRequest(int timeoutMs) {
return new AlterReplicaLogDirsRequest.Builder(assignment);
}
@Override
public void handleResponse(AbstractResponse abstractResponse) {
AlterReplicaLogDirsResponse response = (AlterReplicaLogDirsResponse) abstractResponse;
for (AlterReplicaLogDirTopicResult topicResult : response.data().results()) {
for (AlterReplicaLogDirPartitionResult partitionResult : topicResult.partitions()) {
TopicPartitionReplica replica = new TopicPartitionReplica(topicResult.topicName(), partitionResult.partitionIndex(), brokerId);
KafkaFutureImpl<Void> future = futures.get(replica);
if (future == null) {
log.warn("The partition {} in the response from broker {} is not in the request", new TopicPartition(topicResult.topicName(), partitionResult.partitionIndex()), brokerId);
} else if (partitionResult.errorCode() == Errors.NONE.code()) {
future.complete(null);
} else {
future.completeExceptionally(Errors.forCode(partitionResult.errorCode()).exception());
}
}
}
// The server should send back a response for every replica. But do a sanity check anyway.
completeUnrealizedFutures(futures.entrySet().stream().filter(entry -> entry.getKey().brokerId() == brokerId), replica -> "The response from broker " + brokerId + " did not contain a result for replica " + replica);
}
@Override
void handleFailure(Throwable throwable) {
// Only completes the futures of brokerId
completeAllExceptionally(futures.entrySet().stream().filter(entry -> entry.getKey().brokerId() == brokerId).map(Map.Entry::getValue), throwable);
}
}, now);
}
return new AlterReplicaLogDirsResult(new HashMap<>(futures));
}
Aggregations