Skip to content

Commit

Permalink
Fix the issue in COSUnderFileSystem
Browse files Browse the repository at this point in the history
### What changes are proposed in this pull request?

Fix the issue to get a tag of a non-existed in COS as PR #18388


### Why are the changes needed?

Please clarify why the changes are needed. For instance,
  1. If you propose a new API, clarify the use case for a new API.
  2. If you fix a bug, describe the bug.

### Does this PR introduce any user facing changes?

Please list the user-facing changes introduced by your change, including
  1. change in user-facing APIs
  2. addition or removal of property keys
  3. webui

			pr-link: #18420
			change-id: cid-1042f3ec006f4fa44a7d301b824ad97f1f02ddb8
  • Loading branch information
pkuweblab authored and alluxio-bot committed May 11, 2024
1 parent 7fefc94 commit e6ac8bd
Show file tree
Hide file tree
Showing 2 changed files with 103 additions and 2 deletions.
100 changes: 100 additions & 0 deletions underfs/cos/src/main/java/alluxio/underfs/cos/AlluxioCosException.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/

package alluxio.underfs.cos;

import alluxio.exception.runtime.AlluxioRuntimeException;
import alluxio.grpc.ErrorType;

import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import io.grpc.Status;

import java.net.HttpURLConnection;

/**
* Alluxio exception for cos.
*/
public class AlluxioCosException extends AlluxioRuntimeException {
private static final ErrorType ERROR_TYPE = ErrorType.External;

/**
* Converts an AmazonClientException to a corresponding AlluxioCosException.
* @param cause cos exception
* @return alluxio cos exception
*/
public static AlluxioCosException from(CosClientException cause) {
return from(null, cause);
}

/**
* Converts an CosClientException with errormessage to a corresponding AlluxioCosException.
* @param errorMessage error message
* @param cause cos exception
* @return alluxio cos exception
*/
public static AlluxioCosException from(String errorMessage, CosClientException cause) {
Status status = Status.UNKNOWN;
String errorDescription = "ClientException:" + cause.getMessage();
if (cause instanceof CosServiceException) {
CosServiceException exception = (CosServiceException) cause;
status = httpStatusToGrpcStatus(exception.getStatusCode());
errorDescription = exception.getErrorCode() + ":" + exception.getErrorMessage();
}
if (errorMessage == null) {
errorMessage = errorDescription;
}
return new AlluxioCosException(status, errorMessage, cause, cause.isRetryable());
}

private AlluxioCosException(Status status, String message, Throwable cause, boolean isRetryAble) {
super(status, message, cause, ERROR_TYPE, isRetryAble);
}

private static Status httpStatusToGrpcStatus(int httpStatusCode) {
if (httpStatusCode >= 100 && httpStatusCode < 200) {
// 1xx. These headers should have been ignored.
return Status.INTERNAL;
}
switch (httpStatusCode) {
case HttpURLConnection.HTTP_BAD_REQUEST: // 400
return Status.INVALID_ARGUMENT;
case HttpURLConnection.HTTP_UNAUTHORIZED: // 401
return Status.UNAUTHENTICATED;
case HttpURLConnection.HTTP_FORBIDDEN: // 403
return Status.PERMISSION_DENIED;
case HttpURLConnection.HTTP_NOT_FOUND: // 404
return Status.NOT_FOUND;
case HttpURLConnection.HTTP_BAD_METHOD: // 405
case HttpURLConnection.HTTP_NOT_IMPLEMENTED: // 501
return Status.UNIMPLEMENTED;
case HttpURLConnection.HTTP_CONFLICT: // 409
return Status.ABORTED;
case HttpURLConnection.HTTP_LENGTH_REQUIRED: // 411
case HttpURLConnection.HTTP_PRECON_FAILED: // 412
return Status.FAILED_PRECONDITION;
case 416: // Requested Range Not Satisfiable
return Status.OUT_OF_RANGE;
case HttpURLConnection.HTTP_INTERNAL_ERROR: //500
return Status.INTERNAL;
case HttpURLConnection.HTTP_MOVED_PERM: // 301
case HttpURLConnection.HTTP_NOT_MODIFIED: //304
case 307: // Moved Temporarily
case HttpURLConnection.HTTP_BAD_GATEWAY: // 502
case HttpURLConnection.HTTP_UNAVAILABLE: // 503
return Status.UNAVAILABLE;
case HttpURLConnection.HTTP_GATEWAY_TIMEOUT: // 504
return Status.DEADLINE_EXCEEDED;
default:
return Status.UNKNOWN;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,8 @@ protected List<String> deleteObjects(List<String> keys) throws IOException {
.map(DeleteObjectsResult.DeletedObject::getKey)
.collect(Collectors.toList());
} catch (CosClientException e) {
throw new IOException("failed to delete objects", e);
LOG.warn("failed to delete objects");
throw AlluxioCosException.from(e);
}
}

Expand Down Expand Up @@ -324,7 +325,7 @@ protected InputStream openObject(String key, OpenOptions options,
return new COSInputStream(mBucketNameInternal, key, mClient, options.getOffset(), retryPolicy,
mUfsConf.getBytes(PropertyKey.UNDERFS_OBJECT_STORE_MULTI_RANGE_CHUNK_SIZE));
} catch (CosClientException e) {
throw new IOException(e.getMessage());
throw AlluxioCosException.from(e);
}
}
}

0 comments on commit e6ac8bd

Please sign in to comment.