[ 
https://issues.apache.org/jira/browse/HADOOP-18310?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Tak-Lon (Stephen) Wu updated HADOOP-18310:
------------------------------------------
    Description: 
When one is using a customized credential provider via 
fs.s3a.aws.credentials.provider, e.g. 
org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider, when the provided 
credential by this pluggable provider is expired and return an error code of 
400 as bad request exception.

Here, the current S3ARetryPolicy will fail immediately and does not retry on 
the S3A level. 

Our recent use case in HBase found this use case could lead to a Region Server 
got immediate abandoned from this Exception without retry, when the file system 
is trying open or S3AInputStream is trying to reopen the file. especially the 
S3AInputStream use cases, we cannot find a good way to retry outside of the 
file system semantic (because if a ongoing stream is failing currently it's 
considered as irreparable state), and thus we come up with this optional flag 
for retrying in S3A.


{code}
Caused by: com.amazonaws.services.s3.model.AmazonS3Exception: The provided 
token has expired. (Service: Amazon S3; Status Code: 400; Error Code: 
ExpiredToken; Request ID: XYZ; S3 Extended Request ID: ABC; Proxy: null), S3 
Extended Request ID: 123
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1862)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleServiceErrorResponse(AmazonHttpClient.java:1415)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1384)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1154)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:811)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:779)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:753)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:713)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:695)
        at 
com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:559)
        at 
com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:539)
        at 
com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5453)
        at 
com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5400)
        at 
com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1524)
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem$InputStreamCallbacksImpl.getObject(S3AFileSystem.java:1506)
        at 
org.apache.hadoop.fs.s3a.S3AInputStream.lambda$reopen$0(S3AInputStream.java:217)
        at org.apache.hadoop.fs.s3a.Invoker.once(Invoker.java:117)
        ... 35 more
{code}

  was:
When one is using a customized credential provider via 
fs.s3a.aws.credentials.provider, e.g. 
org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider, when the provided 
credential by this pluggable provider is expired and return an error code of 
400 as bad request exception.

Here, the current S3ARetryPolicy will fail immediately and does not retry on 
the S3A level. 

Our recent use case in HBase found this use case could lead to a Region Server 
got immediate abandoned from this Exception without retry, when the file system 
is trying open or S3AInputStream is trying to reopen the file. especially the 
S3AInputStream use cases, we cannot find a good way to retry outside of the 
file system semantic (because if a ongoing stream is failing currently it's 
considered as irreparable state), and thus we come up with this optional flag 
for retrying in S3A.


{code}
Caused by: com.amazonaws.services.s3.model.AmazonS3Exception: The provided 
token has expired. (Service: Amazon S3; Status Code: 400; Error Code: 
ExpiredToken; Request ID: QQZ08S3G11Q2FFEJ; S3 Extended Request ID: 
AozmtAiY5cmnz3GEjLd/tnnMVcl8YMFF2ic4K/MkzBEiefEC0X7dPAMs+A561fs2QSJ1oWoFJX0=; 
Proxy: null), S3 Extended Request ID: 
AozmtAiY5cmnz3GEjLd/tnnMVcl8YMFF2ic4K/MkzBEiefEC0X7dPAMs+A561fs2QSJ1oWoFJX0=
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1862)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleServiceErrorResponse(AmazonHttpClient.java:1415)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1384)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1154)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:811)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:779)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:753)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:713)
        at 
com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:695)
        at 
com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:559)
        at 
com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:539)
        at 
com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5453)
        at 
com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5400)
        at 
com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1524)
        at 
org.apache.hadoop.fs.s3a.S3AFileSystem$InputStreamCallbacksImpl.getObject(S3AFileSystem.java:1506)
        at 
org.apache.hadoop.fs.s3a.S3AInputStream.lambda$reopen$0(S3AInputStream.java:217)
        at org.apache.hadoop.fs.s3a.Invoker.once(Invoker.java:117)
        ... 35 more
{code}


> Add option and make 400 bad request retryable
> ---------------------------------------------
>
>                 Key: HADOOP-18310
>                 URL: https://issues.apache.org/jira/browse/HADOOP-18310
>             Project: Hadoop Common
>          Issue Type: Bug
>          Components: fs/s3
>    Affects Versions: 3.3.4
>            Reporter: Tak-Lon (Stephen) Wu
>            Priority: Major
>
> When one is using a customized credential provider via 
> fs.s3a.aws.credentials.provider, e.g. 
> org.apache.hadoop.fs.s3a.TemporaryAWSCredentialsProvider, when the provided 
> credential by this pluggable provider is expired and return an error code of 
> 400 as bad request exception.
> Here, the current S3ARetryPolicy will fail immediately and does not retry on 
> the S3A level. 
> Our recent use case in HBase found this use case could lead to a Region 
> Server got immediate abandoned from this Exception without retry, when the 
> file system is trying open or S3AInputStream is trying to reopen the file. 
> especially the S3AInputStream use cases, we cannot find a good way to retry 
> outside of the file system semantic (because if a ongoing stream is failing 
> currently it's considered as irreparable state), and thus we come up with 
> this optional flag for retrying in S3A.
> {code}
> Caused by: com.amazonaws.services.s3.model.AmazonS3Exception: The provided 
> token has expired. (Service: Amazon S3; Status Code: 400; Error Code: 
> ExpiredToken; Request ID: XYZ; S3 Extended Request ID: ABC; Proxy: null), S3 
> Extended Request ID: 123
>       at 
> com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1862)
>       at 
> com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleServiceErrorResponse(AmazonHttpClient.java:1415)
>       at 
> com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1384)
>       at 
> com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1154)
>       at 
> com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:811)
>       at 
> com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:779)
>       at 
> com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:753)
>       at 
> com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:713)
>       at 
> com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:695)
>       at 
> com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:559)
>       at 
> com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:539)
>       at 
> com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5453)
>       at 
> com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:5400)
>       at 
> com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:1524)
>       at 
> org.apache.hadoop.fs.s3a.S3AFileSystem$InputStreamCallbacksImpl.getObject(S3AFileSystem.java:1506)
>       at 
> org.apache.hadoop.fs.s3a.S3AInputStream.lambda$reopen$0(S3AInputStream.java:217)
>       at org.apache.hadoop.fs.s3a.Invoker.once(Invoker.java:117)
>       ... 35 more
> {code}



--
This message was sent by Atlassian Jira
(v8.20.7#820007)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to