mirror of https://github.com/apache/kafka.git
MINOR; KafkaAdminClient#describeLogDirs should not fail all the futures when only one call fails (#8998)
Reviewers: Colin P. McCabe <cmccabe@apache.org>
This commit is contained in:
parent
cec5f377b5
commit
f40aa33de7
|
@ -2272,12 +2272,11 @@ public class KafkaAdminClient extends AdminClient {
|
|||
public DescribeLogDirsResult describeLogDirs(Collection<Integer> brokers, DescribeLogDirsOptions options) {
|
||||
final Map<Integer, KafkaFutureImpl<Map<String, DescribeLogDirsResponse.LogDirInfo>>> futures = new HashMap<>(brokers.size());
|
||||
|
||||
for (Integer brokerId: brokers) {
|
||||
futures.put(brokerId, new KafkaFutureImpl<>());
|
||||
}
|
||||
|
||||
final long now = time.milliseconds();
|
||||
for (final Integer brokerId: brokers) {
|
||||
for (final Integer brokerId : brokers) {
|
||||
KafkaFutureImpl<Map<String, DescribeLogDirsResponse.LogDirInfo>> future = new KafkaFutureImpl<>();
|
||||
futures.put(brokerId, future);
|
||||
|
||||
runnable.call(new Call("describeLogDirs", calcDeadlineMs(now, options.timeoutMs()),
|
||||
new ConstantNodeIdProvider(brokerId)) {
|
||||
|
||||
|
@ -2290,7 +2289,6 @@ public class KafkaAdminClient extends AdminClient {
|
|||
@Override
|
||||
public void handleResponse(AbstractResponse abstractResponse) {
|
||||
DescribeLogDirsResponse response = (DescribeLogDirsResponse) abstractResponse;
|
||||
KafkaFutureImpl<Map<String, DescribeLogDirsResponse.LogDirInfo>> future = futures.get(brokerId);
|
||||
if (response.logDirInfos().size() > 0) {
|
||||
future.complete(response.logDirInfos());
|
||||
} else {
|
||||
|
@ -2300,7 +2298,7 @@ public class KafkaAdminClient extends AdminClient {
|
|||
}
|
||||
@Override
|
||||
void handleFailure(Throwable throwable) {
|
||||
completeAllExceptionally(futures.values(), throwable);
|
||||
future.completeExceptionally(throwable);
|
||||
}
|
||||
}, now);
|
||||
}
|
||||
|
|
|
@ -84,6 +84,7 @@ import org.apache.kafka.common.message.DescribeAclsResponseData;
|
|||
import org.apache.kafka.common.message.DescribeConfigsResponseData;
|
||||
import org.apache.kafka.common.message.DescribeGroupsResponseData;
|
||||
import org.apache.kafka.common.message.DescribeGroupsResponseData.DescribedGroupMember;
|
||||
import org.apache.kafka.common.message.DescribeLogDirsResponseData;
|
||||
import org.apache.kafka.common.message.ElectLeadersResponseData.PartitionResult;
|
||||
import org.apache.kafka.common.message.ElectLeadersResponseData.ReplicaElectionResult;
|
||||
import org.apache.kafka.common.message.IncrementalAlterConfigsResponseData;
|
||||
|
@ -123,6 +124,7 @@ import org.apache.kafka.common.requests.DescribeAclsResponse;
|
|||
import org.apache.kafka.common.requests.DescribeClientQuotasResponse;
|
||||
import org.apache.kafka.common.requests.DescribeConfigsResponse;
|
||||
import org.apache.kafka.common.requests.DescribeGroupsResponse;
|
||||
import org.apache.kafka.common.requests.DescribeLogDirsResponse;
|
||||
import org.apache.kafka.common.requests.ElectLeadersResponse;
|
||||
import org.apache.kafka.common.requests.FindCoordinatorResponse;
|
||||
import org.apache.kafka.common.requests.IncrementalAlterConfigsResponse;
|
||||
|
@ -3744,6 +3746,34 @@ public class KafkaAdminClientTest {
|
|||
.setErrorCode(error.code())).collect(Collectors.toList())))));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testDescribeLogDirsPartialFailure() throws Exception {
|
||||
try (AdminClientUnitTestEnv env = mockClientEnv(AdminClientConfig.RETRIES_CONFIG, "0")) {
|
||||
// As we won't retry, this calls fails immediately with a DisconnectException
|
||||
env.kafkaClient().prepareResponseFrom(
|
||||
prepareDescribeLogDirsResponse(Errors.NONE, "/data"),
|
||||
env.cluster().nodeById(0),
|
||||
true);
|
||||
|
||||
env.kafkaClient().prepareResponseFrom(
|
||||
prepareDescribeLogDirsResponse(Errors.NONE, "/data"),
|
||||
env.cluster().nodeById(1));
|
||||
|
||||
DescribeLogDirsResult result = env.adminClient().describeLogDirs(Arrays.asList(0, 1));
|
||||
|
||||
TestUtils.assertFutureThrows(result.values().get(0), ApiException.class);
|
||||
assertNotNull(result.values().get(1).get());
|
||||
}
|
||||
}
|
||||
|
||||
private DescribeLogDirsResponse prepareDescribeLogDirsResponse(Errors error, String logDir) {
|
||||
return new DescribeLogDirsResponse(new DescribeLogDirsResponseData()
|
||||
.setResults(Collections.singletonList(
|
||||
new DescribeLogDirsResponseData.DescribeLogDirsResult()
|
||||
.setErrorCode(error.code())
|
||||
.setLogDir(logDir))));
|
||||
}
|
||||
|
||||
private static MemberDescription convertToMemberDescriptions(DescribedGroupMember member,
|
||||
MemberAssignment assignment) {
|
||||
return new MemberDescription(member.memberId(),
|
||||
|
|
Loading…
Reference in New Issue