Skip to content

Commit b4b23ef

Browse files
authored
HADOOP-17092. ABFS: Making AzureADAuthenticator.getToken() throw HttpException
- Contributed by Bilahari T H
1 parent 8b7695b commit b4b23ef

File tree

8 files changed

+244
-7
lines changed

8 files changed

+244
-7
lines changed

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AbfsConfiguration.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
import org.apache.hadoop.fs.azurebfs.oauth2.UserPasswordTokenProvider;
5858
import org.apache.hadoop.fs.azurebfs.security.AbfsDelegationTokenManager;
5959
import org.apache.hadoop.fs.azurebfs.services.AuthType;
60+
import org.apache.hadoop.fs.azurebfs.services.ExponentialRetryPolicy;
6061
import org.apache.hadoop.fs.azurebfs.services.KeyProvider;
6162
import org.apache.hadoop.fs.azurebfs.services.SimpleKeyProvider;
6263
import org.apache.hadoop.security.ssl.DelegatingSSLSocketFactory;
@@ -119,6 +120,26 @@ public class AbfsConfiguration{
119120
DefaultValue = DEFAULT_CUSTOM_TOKEN_FETCH_RETRY_COUNT)
120121
private int customTokenFetchRetryCount;
121122

123+
@IntegerConfigurationValidatorAnnotation(ConfigurationKey = AZURE_OAUTH_TOKEN_FETCH_RETRY_COUNT,
124+
MinValue = 0,
125+
DefaultValue = DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_ATTEMPTS)
126+
private int oauthTokenFetchRetryCount;
127+
128+
@IntegerConfigurationValidatorAnnotation(ConfigurationKey = AZURE_OAUTH_TOKEN_FETCH_RETRY_MIN_BACKOFF,
129+
MinValue = 0,
130+
DefaultValue = DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MIN_BACKOFF_INTERVAL)
131+
private int oauthTokenFetchRetryMinBackoff;
132+
133+
@IntegerConfigurationValidatorAnnotation(ConfigurationKey = AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_BACKOFF,
134+
MinValue = 0,
135+
DefaultValue = DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_BACKOFF_INTERVAL)
136+
private int oauthTokenFetchRetryMaxBackoff;
137+
138+
@IntegerConfigurationValidatorAnnotation(ConfigurationKey = AZURE_OAUTH_TOKEN_FETCH_RETRY_DELTA_BACKOFF,
139+
MinValue = 0,
140+
DefaultValue = DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_DELTA_BACKOFF)
141+
private int oauthTokenFetchRetryDeltaBackoff;
142+
122143
@LongConfigurationValidatorAnnotation(ConfigurationKey = AZURE_BLOCK_SIZE_PROPERTY_NAME,
123144
MinValue = 0,
124145
MaxValue = MAX_AZURE_BLOCK_SIZE,
@@ -795,6 +816,12 @@ boolean validateBoolean(Field field) throws IllegalAccessException, InvalidConfi
795816
validator.ThrowIfInvalid()).validate(value);
796817
}
797818

819+
public ExponentialRetryPolicy getOauthTokenFetchRetryPolicy() {
820+
return new ExponentialRetryPolicy(oauthTokenFetchRetryCount,
821+
oauthTokenFetchRetryMinBackoff, oauthTokenFetchRetryMaxBackoff,
822+
oauthTokenFetchRetryDeltaBackoff);
823+
}
824+
798825
@VisibleForTesting
799826
void setReadBufferSize(int bufferSize) {
800827
this.readBufferSize = bufferSize;

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/AzureBlobFileSystemStore.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@
7979
import org.apache.hadoop.fs.azurebfs.extensions.SASTokenProvider;
8080
import org.apache.hadoop.fs.azurebfs.extensions.ExtensionHelper;
8181
import org.apache.hadoop.fs.azurebfs.oauth2.AccessTokenProvider;
82+
import org.apache.hadoop.fs.azurebfs.oauth2.AzureADAuthenticator;
8283
import org.apache.hadoop.fs.azurebfs.oauth2.IdentityTransformer;
8384
import org.apache.hadoop.fs.azurebfs.oauth2.IdentityTransformerInterface;
8485
import org.apache.hadoop.fs.azurebfs.services.AbfsAclHelper;
@@ -1234,6 +1235,10 @@ private void initializeClient(URI uri, String fileSystemName,
12341235
AccessTokenProvider tokenProvider = null;
12351236
SASTokenProvider sasTokenProvider = null;
12361237

1238+
if (authType == AuthType.OAuth) {
1239+
AzureADAuthenticator.init(abfsConfiguration);
1240+
}
1241+
12371242
if (authType == AuthType.SharedKey) {
12381243
LOG.trace("Fetching SharedKey credentials");
12391244
int dotIndex = accountName.indexOf(AbfsHttpConstants.DOT);

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/ConfigurationKeys.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,12 @@ public final class ConfigurationKeys {
4545
public static final String AZURE_MAX_IO_RETRIES = "fs.azure.io.retry.max.retries";
4646
public static final String AZURE_CUSTOM_TOKEN_FETCH_RETRY_COUNT = "fs.azure.custom.token.fetch.retry.count";
4747

48+
// Retry strategy for getToken calls
49+
public static final String AZURE_OAUTH_TOKEN_FETCH_RETRY_COUNT = "fs.azure.oauth.token.fetch.retry.max.retries";
50+
public static final String AZURE_OAUTH_TOKEN_FETCH_RETRY_MIN_BACKOFF = "fs.azure.oauth.token.fetch.retry.min.backoff.interval";
51+
public static final String AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_BACKOFF = "fs.azure.oauth.token.fetch.retry.max.backoff.interval";
52+
public static final String AZURE_OAUTH_TOKEN_FETCH_RETRY_DELTA_BACKOFF = "fs.azure.oauth.token.fetch.retry.delta.backoff";
53+
4854
// Read and write buffer sizes defined by the user
4955
public static final String AZURE_WRITE_BUFFER_SIZE = "fs.azure.write.request.size";
5056
public static final String AZURE_READ_BUFFER_SIZE = "fs.azure.read.request.size";

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/constants/FileSystemConfigurations.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,13 +35,21 @@ public final class FileSystemConfigurations {
3535

3636
public static final String USER_HOME_DIRECTORY_PREFIX = "/user";
3737

38+
private static final int SIXTY_SECONDS = 60 * 1000;
39+
3840
// Retry parameter defaults.
3941
public static final int DEFAULT_MIN_BACKOFF_INTERVAL = 3 * 1000; // 3s
4042
public static final int DEFAULT_MAX_BACKOFF_INTERVAL = 30 * 1000; // 30s
4143
public static final int DEFAULT_BACKOFF_INTERVAL = 3 * 1000; // 3s
4244
public static final int DEFAULT_MAX_RETRY_ATTEMPTS = 30;
4345
public static final int DEFAULT_CUSTOM_TOKEN_FETCH_RETRY_COUNT = 3;
4446

47+
// Retry parameter defaults.
48+
public static final int DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_ATTEMPTS = 5;
49+
public static final int DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MIN_BACKOFF_INTERVAL = 0;
50+
public static final int DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_BACKOFF_INTERVAL = SIXTY_SECONDS;
51+
public static final int DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_DELTA_BACKOFF = 2;
52+
4553
private static final int ONE_KB = 1024;
4654
private static final int ONE_MB = ONE_KB * ONE_KB;
4755

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/oauth2/AzureADAuthenticator.java

Lines changed: 36 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,11 @@
1818

1919
package org.apache.hadoop.fs.azurebfs.oauth2;
2020

21+
import java.io.FileNotFoundException;
2122
import java.io.IOException;
2223
import java.io.InputStream;
2324
import java.net.HttpURLConnection;
25+
import java.net.MalformedURLException;
2426
import java.net.URL;
2527
import java.nio.charset.StandardCharsets;
2628
import java.util.Date;
@@ -34,6 +36,7 @@
3436
import org.slf4j.Logger;
3537
import org.slf4j.LoggerFactory;
3638

39+
import org.apache.hadoop.fs.azurebfs.AbfsConfiguration;
3740
import org.apache.hadoop.classification.InterfaceAudience;
3841
import org.apache.hadoop.classification.InterfaceStability;
3942
import org.apache.hadoop.fs.azurebfs.services.AbfsIoUtils;
@@ -56,10 +59,16 @@ public final class AzureADAuthenticator {
5659
private static final int CONNECT_TIMEOUT = 30 * 1000;
5760
private static final int READ_TIMEOUT = 30 * 1000;
5861

62+
private static ExponentialRetryPolicy tokenFetchRetryPolicy;
63+
5964
private AzureADAuthenticator() {
6065
// no operation
6166
}
6267

68+
public static void init(AbfsConfiguration abfsConfiguration) {
69+
tokenFetchRetryPolicy = abfsConfiguration.getOauthTokenFetchRetryPolicy();
70+
}
71+
6372
/**
6473
* gets Azure Active Directory token using the user ID and password of
6574
* a service principal (that is, Web App in Azure Active Directory).
@@ -81,8 +90,7 @@ private AzureADAuthenticator() {
8190
* @throws IOException throws IOException if there is a failure in connecting to Azure AD
8291
*/
8392
public static AzureADToken getTokenUsingClientCreds(String authEndpoint,
84-
String clientId, String clientSecret)
85-
throws IOException {
93+
String clientId, String clientSecret) throws IOException {
8694
Preconditions.checkNotNull(authEndpoint, "authEndpoint");
8795
Preconditions.checkNotNull(clientId, "clientId");
8896
Preconditions.checkNotNull(clientSecret, "clientSecret");
@@ -283,13 +291,14 @@ private static AzureADToken getTokenCall(String authEndpoint, String body,
283291
Hashtable<String, String> headers, String httpMethod, boolean isMsi)
284292
throws IOException {
285293
AzureADToken token = null;
286-
ExponentialRetryPolicy retryPolicy
287-
= new ExponentialRetryPolicy(3, 0, 1000, 2);
288294

289295
int httperror = 0;
290296
IOException ex = null;
291297
boolean succeeded = false;
298+
boolean isRecoverableFailure = true;
292299
int retryCount = 0;
300+
boolean shouldRetry;
301+
LOG.trace("First execution of REST operation getTokenSingleCall");
293302
do {
294303
httperror = 0;
295304
ex = null;
@@ -299,17 +308,38 @@ private static AzureADToken getTokenCall(String authEndpoint, String body,
299308
httperror = e.httpErrorCode;
300309
ex = e;
301310
} catch (IOException e) {
302-
ex = e;
311+
httperror = -1;
312+
isRecoverableFailure = isRecoverableFailure(e);
313+
ex = new HttpException(httperror, "", String
314+
.format("AzureADAuthenticator.getTokenCall threw %s : %s",
315+
e.getClass().getTypeName(), e.getMessage()), authEndpoint, "",
316+
"");
303317
}
304318
succeeded = ((httperror == 0) && (ex == null));
319+
shouldRetry = !succeeded && isRecoverableFailure
320+
&& tokenFetchRetryPolicy.shouldRetry(retryCount, httperror);
305321
retryCount++;
306-
} while (!succeeded && retryPolicy.shouldRetry(retryCount, httperror));
322+
if (shouldRetry) {
323+
LOG.debug("Retrying getTokenSingleCall. RetryCount = {}", retryCount);
324+
try {
325+
Thread.sleep(tokenFetchRetryPolicy.getRetryInterval(retryCount));
326+
} catch (InterruptedException e) {
327+
Thread.currentThread().interrupt();
328+
}
329+
}
330+
331+
} while (shouldRetry);
307332
if (!succeeded) {
308333
throw ex;
309334
}
310335
return token;
311336
}
312337

338+
private static boolean isRecoverableFailure(IOException e) {
339+
return !(e instanceof MalformedURLException
340+
|| e instanceof FileNotFoundException);
341+
}
342+
313343
private static AzureADToken getTokenSingleCall(String authEndpoint,
314344
String payload, Hashtable<String, String> headers, String httpMethod,
315345
boolean isMsi)

hadoop-tools/hadoop-azure/src/main/java/org/apache/hadoop/fs/azurebfs/services/ExponentialRetryPolicy.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
import java.util.Random;
2222
import java.net.HttpURLConnection;
2323

24+
import com.google.common.annotations.VisibleForTesting;
25+
2426
/**
2527
* Retry policy used by AbfsClient.
2628
* */
@@ -138,4 +140,25 @@ public long getRetryInterval(final int retryCount) {
138140

139141
return retryInterval;
140142
}
143+
144+
@VisibleForTesting
145+
int getRetryCount() {
146+
return this.retryCount;
147+
}
148+
149+
@VisibleForTesting
150+
int getMinBackoff() {
151+
return this.minBackoff;
152+
}
153+
154+
@VisibleForTesting
155+
int getMaxBackoff() {
156+
return maxBackoff;
157+
}
158+
159+
@VisibleForTesting
160+
int getDeltaBackoff() {
161+
return this.deltaBackoff;
162+
}
163+
141164
}

hadoop-tools/hadoop-azure/src/site/markdown/abfs.md

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,22 @@ All secrets can be stored in JCEKS files. These are encrypted and password
330330
protected —use them or a compatible Hadoop Key Management Store wherever
331331
possible
332332

333+
### <a name="aad-token-fetch-retry-logic"></a> AAD Token fetch retries
334+
335+
The exponential retry policy used for the AAD token fetch retries can be tuned
336+
with the following configurations.
337+
* `fs.azure.oauth.token.fetch.retry.max.retries`: Sets the maximum number of
338+
retries. Default value is 5.
339+
* `fs.azure.oauth.token.fetch.retry.min.backoff.interval`: Minimum back-off
340+
interval. Added to the retry interval computed from delta backoff. By
341+
default this si set as 0. Set the interval in milli seconds.
342+
* `fs.azure.oauth.token.fetch.retry.max.backoff.interval`: Maximum back-off
343+
interval. Default value is 60000 (sixty seconds). Set the interval in milli
344+
seconds.
345+
* `fs.azure.oauth.token.fetch.retry.delta.backoff`: Back-off interval between
346+
retries. Multiples of this timespan are used for subsequent retry attempts
347+
. The default value is 2.
348+
333349
### <a name="shared-key-auth"></a> Default: Shared Key
334350

335351
This is the simplest authentication mechanism of account + password.
@@ -776,7 +792,9 @@ bytes. The value should be between 16384 to 104857600 both inclusive (16 KB to
776792
`fs.azure.readaheadqueue.depth`: Sets the readahead queue depth in
777793
AbfsInputStream. In case the set value is negative the read ahead queue depth
778794
will be set as Runtime.getRuntime().availableProcessors(). By default the value
779-
will be -1.
795+
will be -1. To disable readaheads, set this value to 0. If your workload is
796+
doing only random reads (non-sequential) or you are seeing throttling, you
797+
may try setting this value to 0.
780798

781799
### <a name="securityconfigoptions"></a> Security Options
782800
`fs.azure.always.use.https`: Enforces to use HTTPS instead of HTTP when the flag
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/**
2+
* Licensed to the Apache Software Foundation (ASF) under one
3+
* or more contributor license agreements. See the NOTICE file
4+
* distributed with this work for additional information
5+
* regarding copyright ownership. The ASF licenses this file
6+
* to you under the Apache License, Version 2.0 (the
7+
* "License"); you may not use this file except in compliance
8+
* with the License. You may obtain a copy of the License at
9+
* <p>
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
* <p>
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
package org.apache.hadoop.fs.azurebfs.services;
19+
20+
import java.io.IOException;
21+
22+
import org.assertj.core.api.Assertions;
23+
import org.junit.Test;
24+
25+
import org.apache.hadoop.fs.azurebfs.AbfsConfiguration;
26+
import org.apache.hadoop.fs.azurebfs.AbstractAbfsIntegrationTest;
27+
28+
import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.AZURE_OAUTH_TOKEN_FETCH_RETRY_COUNT;
29+
import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.AZURE_OAUTH_TOKEN_FETCH_RETRY_DELTA_BACKOFF;
30+
import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_BACKOFF;
31+
import static org.apache.hadoop.fs.azurebfs.constants.ConfigurationKeys.AZURE_OAUTH_TOKEN_FETCH_RETRY_MIN_BACKOFF;
32+
import static org.apache.hadoop.fs.azurebfs.constants.FileSystemConfigurations.DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_DELTA_BACKOFF;
33+
import static org.apache.hadoop.fs.azurebfs.constants.FileSystemConfigurations.DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_ATTEMPTS;
34+
import static org.apache.hadoop.fs.azurebfs.constants.FileSystemConfigurations.DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_BACKOFF_INTERVAL;
35+
import static org.apache.hadoop.fs.azurebfs.constants.FileSystemConfigurations.DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MIN_BACKOFF_INTERVAL;
36+
import static org.apache.hadoop.fs.azurebfs.constants.TestConfigurationKeys.FS_AZURE_ACCOUNT_NAME;
37+
38+
public class TestAzureADAuthenticator extends AbstractAbfsIntegrationTest {
39+
40+
private static final int TEST_RETRY_COUNT = 10;
41+
private static final int TEST_MIN_BACKOFF = 20;
42+
private static final int TEST_MAX_BACKOFF = 30;
43+
private static final int TEST_DELTA_BACKOFF = 40;
44+
45+
public TestAzureADAuthenticator() throws Exception {
46+
super();
47+
}
48+
49+
@Test
50+
public void testDefaultOAuthTokenFetchRetryPolicy() throws Exception {
51+
getConfiguration().unset(AZURE_OAUTH_TOKEN_FETCH_RETRY_COUNT);
52+
getConfiguration().unset(AZURE_OAUTH_TOKEN_FETCH_RETRY_MIN_BACKOFF);
53+
getConfiguration().unset(AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_BACKOFF);
54+
getConfiguration().unset(AZURE_OAUTH_TOKEN_FETCH_RETRY_DELTA_BACKOFF);
55+
56+
String accountName = getConfiguration().get(FS_AZURE_ACCOUNT_NAME);
57+
AbfsConfiguration abfsConfig = new AbfsConfiguration(getRawConfiguration(),
58+
accountName);
59+
60+
ExponentialRetryPolicy retryPolicy = abfsConfig
61+
.getOauthTokenFetchRetryPolicy();
62+
63+
Assertions.assertThat(retryPolicy.getRetryCount()).describedAs(
64+
"retryCount should be the default value {} as the same "
65+
+ "is not configured",
66+
DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_ATTEMPTS)
67+
.isEqualTo(DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_ATTEMPTS);
68+
Assertions.assertThat(retryPolicy.getMinBackoff()).describedAs(
69+
"minBackOff should be the default value {} as the same is "
70+
+ "not configured",
71+
DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MIN_BACKOFF_INTERVAL)
72+
.isEqualTo(DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MIN_BACKOFF_INTERVAL);
73+
Assertions.assertThat(retryPolicy.getMaxBackoff()).describedAs(
74+
"maxBackOff should be the default value {} as the same is "
75+
+ "not configured",
76+
DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_BACKOFF_INTERVAL)
77+
.isEqualTo(DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_BACKOFF_INTERVAL);
78+
Assertions.assertThat(retryPolicy.getDeltaBackoff()).describedAs(
79+
"deltaBackOff should be the default value {} as the same " + "is "
80+
+ "not configured",
81+
DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_DELTA_BACKOFF)
82+
.isEqualTo(DEFAULT_AZURE_OAUTH_TOKEN_FETCH_RETRY_DELTA_BACKOFF);
83+
84+
}
85+
86+
@Test
87+
public void testOAuthTokenFetchRetryPolicy()
88+
throws IOException, IllegalAccessException {
89+
90+
getConfiguration()
91+
.set(AZURE_OAUTH_TOKEN_FETCH_RETRY_COUNT, String.valueOf(TEST_RETRY_COUNT));
92+
getConfiguration().set(AZURE_OAUTH_TOKEN_FETCH_RETRY_MIN_BACKOFF,
93+
String.valueOf(TEST_MIN_BACKOFF));
94+
getConfiguration().set(AZURE_OAUTH_TOKEN_FETCH_RETRY_MAX_BACKOFF,
95+
String.valueOf(TEST_MAX_BACKOFF));
96+
getConfiguration().set(AZURE_OAUTH_TOKEN_FETCH_RETRY_DELTA_BACKOFF,
97+
String.valueOf(TEST_DELTA_BACKOFF));
98+
99+
String accountName = getConfiguration().get(FS_AZURE_ACCOUNT_NAME);
100+
AbfsConfiguration abfsConfig = new AbfsConfiguration(getRawConfiguration(),
101+
accountName);
102+
103+
ExponentialRetryPolicy retryPolicy = abfsConfig
104+
.getOauthTokenFetchRetryPolicy();
105+
106+
Assertions.assertThat(retryPolicy.getRetryCount())
107+
.describedAs("retryCount should be {}", TEST_RETRY_COUNT)
108+
.isEqualTo(TEST_RETRY_COUNT);
109+
Assertions.assertThat(retryPolicy.getMinBackoff())
110+
.describedAs("minBackOff should be {}", TEST_MIN_BACKOFF)
111+
.isEqualTo(TEST_MIN_BACKOFF);
112+
Assertions.assertThat(retryPolicy.getMaxBackoff())
113+
.describedAs("maxBackOff should be {}", TEST_MAX_BACKOFF)
114+
.isEqualTo(TEST_MAX_BACKOFF);
115+
Assertions.assertThat(retryPolicy.getDeltaBackoff())
116+
.describedAs("deltaBackOff should be {}", TEST_DELTA_BACKOFF)
117+
.isEqualTo(TEST_DELTA_BACKOFF);
118+
}
119+
120+
}

0 commit comments

Comments
 (0)