You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ozone.apache.org by ri...@apache.org on 2022/11/03 20:56:42 UTC
[ozone] branch master updated: HDDS-7324. S3G: Avoid calling getS3VolumeContext by using GetGeyInfo API. (#3911)
This is an automated email from the ASF dual-hosted git repository.
ritesh pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 6fed1c9434 HDDS-7324. S3G: Avoid calling getS3VolumeContext by using GetGeyInfo API. (#3911)
6fed1c9434 is described below
commit 6fed1c9434729e59f2fd4ad9ac6dcbfafaf6f32d
Author: Duong Nguyen <du...@gmail.com>
AuthorDate: Thu Nov 3 13:56:36 2022 -0700
HDDS-7324. S3G: Avoid calling getS3VolumeContext by using GetGeyInfo API. (#3911)
---
.../apache/hadoop/ozone/client/ObjectStore.java | 13 -----
.../org/apache/hadoop/ozone/client/OzoneKey.java | 8 +++
.../ozone/client/protocol/ClientProtocol.java | 21 +++++++
.../apache/hadoop/ozone/client/rpc/RpcClient.java | 65 ++++++++++++++++++++--
.../hadoop/ozone/s3/endpoint/ObjectEndpoint.java | 10 +---
.../hadoop/ozone/client/ClientProtocolStub.java | 13 +++++
.../ozone/s3/endpoint/TestPermissionCheck.java | 3 +-
7 files changed, 106 insertions(+), 27 deletions(-)
diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
index a38c80e153..543550b1bf 100644
--- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
+++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/ObjectStore.java
@@ -40,7 +40,6 @@ import org.apache.hadoop.ozone.om.helpers.S3VolumeContext;
import org.apache.hadoop.ozone.om.helpers.TenantStateList;
import org.apache.hadoop.ozone.om.helpers.TenantUserInfoValue;
import org.apache.hadoop.ozone.om.helpers.TenantUserList;
-import org.apache.hadoop.ozone.om.protocol.S3Auth;
import org.apache.hadoop.ozone.security.OzoneTokenIdentifier;
import org.apache.hadoop.ozone.security.acl.OzoneObj;
import org.apache.hadoop.security.UserGroupInformation;
@@ -165,18 +164,6 @@ public class ObjectStore {
public OzoneVolume getS3Volume() throws IOException {
final S3VolumeContext resp = proxy.getS3VolumeContext();
-
- S3Auth s3Auth = proxy.getThreadLocalS3Auth();
- // Update user principal if needed to be used for KMS client
- if (s3Auth != null) {
- // Update userPrincipal field with the value returned from OM. So that
- // in multi-tenancy, KMS client can use the correct identity
- // (instead of using accessId) to communicate with KMS.
- LOG.debug("Updating S3Auth.userPrincipal to {}", resp.getUserPrincipal());
- s3Auth.setUserPrincipal(resp.getUserPrincipal());
- proxy.setThreadLocalS3Auth(s3Auth);
- }
-
OmVolumeArgs volume = resp.getOmVolumeArgs();
return proxy.buildOzoneVolume(volume);
}
diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java
index 72dfb26f21..99275692e4 100644
--- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java
+++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/OzoneKey.java
@@ -22,6 +22,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
import org.apache.hadoop.hdds.client.ReplicationConfig;
import org.apache.hadoop.hdds.client.ReplicationFactor;
import org.apache.hadoop.hdds.client.ReplicationType;
+import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
import java.time.Instant;
import java.util.Map;
@@ -187,4 +188,11 @@ public class OzoneKey {
return replicationConfig;
}
+ public static OzoneKey fromKeyInfo(OmKeyInfo keyInfo) {
+ return new OzoneKey(keyInfo.getVolumeName(), keyInfo.getBucketName(),
+ keyInfo.getKeyName(), keyInfo.getDataSize(), keyInfo.getCreationTime(),
+ keyInfo.getModificationTime(), keyInfo.getReplicationConfig(),
+ keyInfo.getMetadata());
+ }
+
}
diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
index 70a04406a0..2f6e666fd0 100644
--- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
+++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/protocol/ClientProtocol.java
@@ -134,6 +134,27 @@ public interface ClientProtocol {
*/
S3VolumeContext getS3VolumeContext() throws IOException;
+ /**
+ * Returns OzoneKey that contains the application generated/visible
+ * metadata for an Ozone Object in S3 context.
+ *
+ * If Key exists, return returns OzoneKey.
+ * If Key does not exist, throws an exception with error code KEY_NOT_FOUND
+ *
+ * @return OzoneKey which gives basic information about the key.
+ */
+ OzoneKey headS3Object(String bucketName, String keyName) throws IOException;
+
+ /**
+ * Get OzoneKey in S3 context.
+ * @param bucketName Name of the Bucket
+ * @param keyName Key name
+ * @return {@link OzoneKey}
+ * @throws IOException
+ */
+ OzoneKeyDetails getS3KeyDetails(String bucketName, String keyName)
+ throws IOException;
+
OzoneVolume buildOzoneVolume(OmVolumeArgs volume);
/**
diff --git a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
index 1f970ecac6..fdbce82e44 100644
--- a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
+++ b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/rpc/RpcClient.java
@@ -107,6 +107,7 @@ import org.apache.hadoop.ozone.om.exceptions.OMException;
import org.apache.hadoop.ozone.om.helpers.BucketLayout;
import org.apache.hadoop.ozone.om.helpers.BucketEncryptionKeyInfo;
import org.apache.hadoop.ozone.om.helpers.DeleteTenantState;
+import org.apache.hadoop.ozone.om.helpers.KeyInfoWithVolumeContext;
import org.apache.hadoop.ozone.om.helpers.OmBucketArgs;
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
import org.apache.hadoop.ozone.om.helpers.OmDeleteKeys;
@@ -510,7 +511,23 @@ public class RpcClient implements ClientProtocol {
@Override
public S3VolumeContext getS3VolumeContext() throws IOException {
- return ozoneManagerClient.getS3VolumeContext();
+ S3VolumeContext resp = ozoneManagerClient.getS3VolumeContext();
+ String userPrincipal = resp.getUserPrincipal();
+ updateS3Principal(userPrincipal);
+ return resp;
+ }
+
+ private void updateS3Principal(String userPrincipal) {
+ S3Auth s3Auth = this.getThreadLocalS3Auth();
+ // Update user principal if needed to be used for KMS client
+ if (s3Auth != null) {
+ // Update userPrincipal field with the value returned from OM. So that
+ // in multi-tenancy, KMS client can use the correct identity
+ // (instead of using accessId) to communicate with KMS.
+ LOG.debug("Updating S3Auth.userPrincipal to {}", userPrincipal);
+ s3Auth.setUserPrincipal(userPrincipal);
+ this.setThreadLocalS3Auth(s3Auth);
+ }
}
public OzoneVolume buildOzoneVolume(OmVolumeArgs volume) {
@@ -1417,6 +1434,11 @@ public class RpcClient implements ClientProtocol {
OmKeyInfo keyInfo =
getKeyInfo(volumeName, bucketName, keyName, false);
+ return getOzoneKeyDetails(keyInfo);
+ }
+
+ @NotNull
+ private OzoneKeyDetails getOzoneKeyDetails(OmKeyInfo keyInfo) {
List<OzoneKeyLocation> ozoneKeyLocations = new ArrayList<>();
long lastKeyOffset = 0L;
List<OmKeyLocationInfo> omKeyLocationInfos = keyInfo
@@ -1439,6 +1461,36 @@ public class RpcClient implements ClientProtocol {
getInputStream);
}
+ @Override
+ public OzoneKeyDetails getS3KeyDetails(String bucketName, String keyName)
+ throws IOException {
+ OmKeyInfo keyInfo = getS3KeyInfo(bucketName, keyName, false);
+ return getOzoneKeyDetails(keyInfo);
+ }
+
+ @NotNull
+ private OmKeyInfo getS3KeyInfo(
+ String bucketName, String keyName, boolean isHeadOp) throws IOException {
+ verifyBucketName(bucketName);
+ Preconditions.checkNotNull(keyName);
+
+ OmKeyArgs keyArgs = new OmKeyArgs.Builder()
+ // Volume name is not important, as we call GetKeyInfo with
+ // assumeS3Context = true, OM will infer the correct s3 volume.
+ .setVolumeName(OzoneConfigKeys.OZONE_S3_VOLUME_NAME_DEFAULT)
+ .setBucketName(bucketName)
+ .setKeyName(keyName)
+ .setSortDatanodesInPipeline(topologyAwareReadEnabled)
+ .setLatestVersionLocation(getLatestVersionLocation)
+ .setForceUpdateContainerCacheFromSCM(false)
+ .setHeadOp(isHeadOp)
+ .build();
+ KeyInfoWithVolumeContext keyInfoWithS3Context =
+ ozoneManagerClient.getKeyInfo(keyArgs, true);
+ keyInfoWithS3Context.getUserPrincipal().ifPresent(this::updateS3Principal);
+ return keyInfoWithS3Context.getKeyInfo();
+ }
+
private OmKeyInfo getKeyInfo(
String volumeName, String bucketName, String keyName,
boolean forceUpdateContainerCache) throws IOException {
@@ -2027,11 +2079,14 @@ public class RpcClient implements ClientProtocol {
.build();
OmKeyInfo keyInfo = getKeyInfo(keyArgs);
- return new OzoneKey(keyInfo.getVolumeName(), keyInfo.getBucketName(),
- keyInfo.getKeyName(), keyInfo.getDataSize(), keyInfo.getCreationTime(),
- keyInfo.getModificationTime(), keyInfo.getReplicationConfig(),
- keyInfo.getMetadata());
+ return OzoneKey.fromKeyInfo(keyInfo);
+ }
+ @Override
+ public OzoneKey headS3Object(String bucketName, String keyName)
+ throws IOException {
+ OmKeyInfo keyInfo = getS3KeyInfo(bucketName, keyName, true);
+ return OzoneKey.fromKeyInfo(keyInfo);
}
@Override
diff --git a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java
index 488dc9ce49..8b0fec1f97 100644
--- a/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java
+++ b/hadoop-ozone/s3gateway/src/main/java/org/apache/hadoop/ozone/s3/endpoint/ObjectEndpoint.java
@@ -297,10 +297,8 @@ public class ObjectEndpoint extends EndpointBase {
partMarker, maxParts);
}
- OzoneVolume volume = getVolume();
-
- OzoneKeyDetails keyDetails = getClientProtocol().getKeyDetails(
- volume.getName(), bucketName, keyPath);
+ OzoneKeyDetails keyDetails = getClientProtocol()
+ .getS3KeyDetails(bucketName, keyPath);
long length = keyDetails.getDataSize();
@@ -445,9 +443,7 @@ public class ObjectEndpoint extends EndpointBase {
OzoneKey key;
try {
- OzoneVolume volume = getVolume();
- key = getClientProtocol().headObject(volume.getName(),
- bucketName, keyPath);
+ key = getClientProtocol().headS3Object(bucketName, keyPath);
// TODO: return the specified range bytes of this object.
} catch (OMException ex) {
AUDIT.logReadFailure(
diff --git a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ClientProtocolStub.java b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ClientProtocolStub.java
index f023488986..7c1daeca0b 100644
--- a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ClientProtocolStub.java
+++ b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/client/ClientProtocolStub.java
@@ -100,6 +100,19 @@ public class ClientProtocolStub implements ClientProtocol {
return null;
}
+ @Override
+ public OzoneKey headS3Object(String bucketName, String keyName)
+ throws IOException {
+ return objectStoreStub.getS3Volume().getBucket(bucketName)
+ .headObject(keyName);
+ }
+
+ @Override
+ public OzoneKeyDetails getS3KeyDetails(String bucketName, String keyName)
+ throws IOException {
+ return objectStoreStub.getS3Volume().getBucket(bucketName).getKey(keyName);
+ }
+
@Override
public OzoneVolume buildOzoneVolume(OmVolumeArgs volume) {
return null;
diff --git a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java
index 0be5b91792..835e032e7e 100644
--- a/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java
+++ b/hadoop-ozone/s3gateway/src/test/java/org/apache/hadoop/ozone/s3/endpoint/TestPermissionCheck.java
@@ -254,10 +254,9 @@ public class TestPermissionCheck {
*/
@Test
public void testGetKey() throws IOException {
- Mockito.when(objectStore.getS3Volume()).thenReturn(volume);
Mockito.when(client.getProxy()).thenReturn(clientProtocol);
doThrow(exception).when(clientProtocol)
- .getKeyDetails(anyString(), anyString(), anyString());
+ .getS3KeyDetails(anyString(), anyString());
ObjectEndpoint objectEndpoint = new ObjectEndpoint();
objectEndpoint.setClient(client);
objectEndpoint.setHeaders(headers);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@ozone.apache.org
For additional commands, e-mail: commits-help@ozone.apache.org