This is an automated email from the ASF dual-hosted git repository.

pifta 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 51a5fb9422 Revert "HDDS-11235. Spare InfoBucket RPC call in 
FileSystem#mkdir() call. (#6990)" (#7122)
51a5fb9422 is described below

commit 51a5fb9422108e47ea10d7118f1ee9baec4a7e3b
Author: tanvipenumudy <[email protected]>
AuthorDate: Wed Aug 28 03:34:08 2024 +0530

    Revert "HDDS-11235. Spare InfoBucket RPC call in FileSystem#mkdir() call. 
(#6990)" (#7122)
---
 .../apache/hadoop/ozone/client/rpc/RpcClient.java  |   2 -
 .../ozone/BasicRootedOzoneClientAdapterImpl.java   | 121 ++++++++++-----------
 2 files changed, 58 insertions(+), 65 deletions(-)

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 f01fddf40f..35db51b3e4 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
@@ -2164,8 +2164,6 @@ public class RpcClient implements ClientProtocol {
   @Override
   public void createDirectory(String volumeName, String bucketName,
       String keyName) throws IOException {
-    verifyVolumeName(volumeName);
-    verifyBucketName(bucketName);
     String ownerName = getRealUserInfo().getShortUserName();
     OmKeyArgs keyArgs = new OmKeyArgs.Builder().setVolumeName(volumeName)
         .setBucketName(bucketName)
diff --git 
a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java
 
b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java
index 14c297d9f4..da278f17fb 100644
--- 
a/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java
+++ 
b/hadoop-ozone/ozonefs-common/src/main/java/org/apache/hadoop/fs/ozone/BasicRootedOzoneClientAdapterImpl.java
@@ -260,8 +260,11 @@ public class BasicRootedOzoneClientAdapterImpl
     }
   }
 
-  OzoneBucket getBucket(OFSPath ofsPath, boolean createIfNotExist)throws 
IOException {
-    return getBucket(ofsPath.getVolumeName(), ofsPath.getBucketName(), 
createIfNotExist);
+  OzoneBucket getBucket(OFSPath ofsPath, boolean createIfNotExist)
+      throws IOException {
+
+    return getBucket(ofsPath.getVolumeName(), ofsPath.getBucketName(),
+        createIfNotExist);
   }
 
   /**
@@ -273,7 +276,8 @@ public class BasicRootedOzoneClientAdapterImpl
    * @throws IOException Exceptions other than OMException with result code
    *                     VOLUME_NOT_FOUND or BUCKET_NOT_FOUND.
    */
-  private OzoneBucket getBucket(String volumeStr, String bucketStr, boolean 
createIfNotExist) throws IOException {
+  private OzoneBucket getBucket(String volumeStr, String bucketStr,
+      boolean createIfNotExist) throws IOException {
     Preconditions.checkNotNull(volumeStr);
     Preconditions.checkNotNull(bucketStr);
 
@@ -283,7 +287,7 @@ public class BasicRootedOzoneClientAdapterImpl
           "getBucket: Invalid argument: given bucket string is empty.");
     }
 
-    OzoneBucket bucket = null;
+    OzoneBucket bucket;
     try {
       bucket = proxy.getBucketDetails(volumeStr, bucketStr);
 
@@ -295,8 +299,44 @@ public class BasicRootedOzoneClientAdapterImpl
       OzoneFSUtils.validateBucketLayout(bucket.getName(), 
resolvedBucketLayout);
     } catch (OMException ex) {
       if (createIfNotExist) {
-        handleVolumeOrBucketCreationOnException(volumeStr, bucketStr, ex);
-        // Try to get the bucket again
+        // getBucketDetails can throw VOLUME_NOT_FOUND when the parent volume
+        // doesn't exist and ACL is enabled; it can only throw BUCKET_NOT_FOUND
+        // when ACL is disabled. Both exceptions need to be handled.
+        switch (ex.getResult()) {
+        case VOLUME_NOT_FOUND:
+          // Create the volume first when the volume doesn't exist
+          try {
+            objectStore.createVolume(volumeStr);
+          } catch (OMException newVolEx) {
+            // Ignore the case where another client created the volume
+            if (!newVolEx.getResult().equals(VOLUME_ALREADY_EXISTS)) {
+              throw newVolEx;
+            }
+          }
+          // No break here. Proceed to create the bucket
+        case BUCKET_NOT_FOUND:
+          // When BUCKET_NOT_FOUND is thrown, we expect the parent volume
+          // exists, so that we don't call create volume and incur
+          // unnecessary ACL checks which could lead to unwanted behavior.
+          OzoneVolume volume = proxy.getVolumeDetails(volumeStr);
+          // Create the bucket
+          try {
+            // Buckets created by OFS should be in FSO layout
+            volume.createBucket(bucketStr,
+                BucketArgs.newBuilder().setBucketLayout(
+                    this.defaultOFSBucketLayout).build());
+          } catch (OMException newBucEx) {
+            // Ignore the case where another client created the bucket
+            if (!newBucEx.getResult().equals(BUCKET_ALREADY_EXISTS)) {
+              throw newBucEx;
+            }
+          }
+          break;
+        default:
+          // Throw unhandled exception
+          throw ex;
+        }
+        // Try get bucket again
         bucket = proxy.getBucketDetails(volumeStr, bucketStr);
       } else {
         throw ex;
@@ -306,41 +346,6 @@ public class BasicRootedOzoneClientAdapterImpl
     return bucket;
   }
 
-  private void handleVolumeOrBucketCreationOnException(String volumeStr, 
String bucketStr, OMException ex)
-      throws IOException {
-    // OM can throw VOLUME_NOT_FOUND when the parent volume does not exist, 
and in this case we may create the volume,
-    // OM can also throw BUCKET_NOT_FOUND when the parent bucket does not 
exist, and so we also may create the bucket.
-    // This method creates the volume and the bucket when an exception marks 
that they don't exist.
-    switch (ex.getResult()) {
-    case VOLUME_NOT_FOUND:
-      // Create the volume first when the volume doesn't exist
-      try {
-        objectStore.createVolume(volumeStr);
-      } catch (OMException newVolEx) {
-        // Ignore the case where another client created the volume
-        if (!newVolEx.getResult().equals(VOLUME_ALREADY_EXISTS)) {
-          throw newVolEx;
-        }
-      }
-      // No break here. Proceed to create the bucket
-    case BUCKET_NOT_FOUND:
-      // Create the bucket
-      try {
-        // Buckets created by OFS should be in FSO layout
-        BucketArgs defaultBucketArgs = 
BucketArgs.newBuilder().setBucketLayout(this.defaultOFSBucketLayout).build();
-        proxy.createBucket(volumeStr, bucketStr, defaultBucketArgs);
-      } catch (OMException newBucEx) {
-        // Ignore the case where another client created the bucket
-        if (!newBucEx.getResult().equals(BUCKET_ALREADY_EXISTS)) {
-          throw newBucEx;
-        }
-      }
-      break;
-    default:
-      throw ex;
-    }
-  }
-
   /**
    * This API returns the value what is configured at client side only. It 
could
    * differ from the server side default values. If no replication config
@@ -510,40 +515,30 @@ public class BasicRootedOzoneClientAdapterImpl
     LOG.trace("creating dir for path: {}", pathStr);
     incrementCounter(Statistic.OBJECTS_CREATED, 1);
     OFSPath ofsPath = new OFSPath(pathStr, config);
-
-    String volumeName = ofsPath.getVolumeName();
-    if (volumeName.isEmpty()) {
+    if (ofsPath.getVolumeName().isEmpty()) {
       // Volume name unspecified, invalid param, return failure
       return false;
     }
-
-    String bucketName = ofsPath.getBucketName();
-    if (bucketName.isEmpty()) {
-      // Create volume only as path only contains one element the volume.
-      objectStore.createVolume(volumeName);
+    if (ofsPath.getBucketName().isEmpty()) {
+      // Create volume only
+      objectStore.createVolume(ofsPath.getVolumeName());
       return true;
     }
-
     String keyStr = ofsPath.getKeyName();
     try {
-      if (keyStr == null || keyStr.isEmpty()) {
-        // This is the case when the given path only contains volume and 
bucket.
-        // If the bucket does not exist, then this will throw and bucket will 
be created
-        // in handleVolumeOrBucketCreationOnException later.
-        proxy.getBucketDetails(volumeName, bucketName);
-      } else {
-        proxy.createDirectory(volumeName, bucketName, keyStr);
+      OzoneBucket bucket = getBucket(ofsPath, true);
+      // Empty keyStr here indicates only volume and bucket is
+      // given in pathStr, so getBucket above should handle the creation
+      // of volume and bucket. We won't feed empty keyStr to
+      // bucket.createDirectory as that would be a NPE.
+      if (keyStr != null && keyStr.length() > 0) {
+        bucket.createDirectory(keyStr);
       }
     } catch (OMException e) {
       if (e.getResult() == OMException.ResultCodes.FILE_ALREADY_EXISTS) {
         throw new FileAlreadyExistsException(e.getMessage());
       }
-      // Create volume and bucket if they do not exist, and retry key creation.
-      // This call will throw an exception if it fails, or the exception is 
different than it handles.
-      handleVolumeOrBucketCreationOnException(volumeName, bucketName, e);
-      if (keyStr != null && !keyStr.isEmpty()) {
-        proxy.createDirectory(volumeName, bucketName, keyStr);
-      }
+      throw e;
     }
     return true;
   }


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

Reply via email to