From f554b830dfff38a8f8df99a8ad9d000cf774f002 Mon Sep 17 00:00:00 2001 From: YiyuanGUO Date: Tue, 25 May 2021 15:36:10 +0800 Subject: [PATCH 1/2] Fix divide by zero in LoadBalancingKMSClientProvider --- .../hadoop/crypto/key/kms/LoadBalancingKMSClientProvider.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/LoadBalancingKMSClientProvider.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/LoadBalancingKMSClientProvider.java index 237a50d0227b8..8e59b17b2c76f 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/LoadBalancingKMSClientProvider.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/LoadBalancingKMSClientProvider.java @@ -233,6 +233,10 @@ private T doOp(ProviderCallable op, int currPos, } private int nextIdx() { + if (providers.length == 0) { + throw new IOException("No providers configured !"); + } + while (true) { int current = currentIdx.get(); int next = (current + 1) % providers.length; From ddb8f39f988a901933342709525e65d965117d6b Mon Sep 17 00:00:00 2001 From: YiyuanGUO Date: Wed, 26 May 2021 12:42:07 +0800 Subject: [PATCH 2/2] Check length of providers in the constructor --- .../kms/LoadBalancingKMSClientProvider.java | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/LoadBalancingKMSClientProvider.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/LoadBalancingKMSClientProvider.java index 8e59b17b2c76f..4fe223d203429 100644 --- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/LoadBalancingKMSClientProvider.java +++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/crypto/key/kms/LoadBalancingKMSClientProvider.java @@ -86,19 +86,24 @@ public WrapperException(Throwable cause) { private RetryPolicy retryPolicy = null; public LoadBalancingKMSClientProvider(URI providerUri, - KMSClientProvider[] providers, Configuration conf) { + KMSClientProvider[] providers, Configuration conf) throws IOException { this(providerUri, providers, Time.monotonicNow(), conf); } @VisibleForTesting LoadBalancingKMSClientProvider(KMSClientProvider[] providers, long seed, - Configuration conf) { + Configuration conf) throws IOException { this(URI.create("kms://testing"), providers, seed, conf); } private LoadBalancingKMSClientProvider(URI uri, - KMSClientProvider[] providers, long seed, Configuration conf) { + KMSClientProvider[] providers, long seed, Configuration conf) throws IOException { super(conf); + + if (providers.length == 0) { + throw new IOException("No providers configured !"); + } + // uri is the token service so it can be instantiated for renew/cancel. dtService = KMSClientProvider.getDtService(uri); // if provider not in conf, new client will alias on uri else addr. @@ -165,9 +170,6 @@ public KMSClientProvider[] getProviders() { private T doOp(ProviderCallable op, int currPos, boolean isIdempotent) throws IOException { - if (providers.length == 0) { - throw new IOException("No providers configured !"); - } int numFailovers = 0; for (int i = 0;; i++, numFailovers++) { KMSClientProvider provider = providers[(currPos + i) % providers.length]; @@ -233,10 +235,6 @@ private T doOp(ProviderCallable op, int currPos, } private int nextIdx() { - if (providers.length == 0) { - throw new IOException("No providers configured !"); - } - while (true) { int current = currentIdx.get(); int next = (current + 1) % providers.length;