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

adoroszlai 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 4fd7fcd83ef HDDS-15320. Reduce duplication in OMAllocateBlockRequest 
OBS/FSO classes (#10327)
4fd7fcd83ef is described below

commit 4fd7fcd83ef29658cd16a4f60308bf94de6fb831
Author: rhalm <[email protected]>
AuthorDate: Fri May 22 21:26:52 2026 +0200

    HDDS-15320. Reduce duplication in OMAllocateBlockRequest OBS/FSO classes 
(#10327)
---
 .../om/request/key/OMAllocateBlockRequest.java     |  61 +++++--
 .../request/key/OMAllocateBlockRequestWithFSO.java | 184 +++------------------
 2 files changed, 68 insertions(+), 177 deletions(-)

diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
index b692cf9d55e..e8b3abfe219 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequest.java
@@ -21,6 +21,7 @@
 import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_UNDER_LEASE_RECOVERY;
 import static 
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK;
 
+import jakarta.annotation.Nonnull;
 import java.io.IOException;
 import java.nio.file.InvalidPathException;
 import java.util.Collections;
@@ -147,7 +148,7 @@ public OMRequest preExecute(OzoneManager ozoneManager) 
throws IOException {
   }
 
   @Override
-  public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, 
ExecutionContext context) {
+  public final OMClientResponse validateAndUpdateCache(OzoneManager 
ozoneManager, ExecutionContext context) {
     final long trxnLogIndex = context.getIndex();
 
     OzoneManagerProtocolProtos.AllocateBlockRequest allocateBlockRequest =
@@ -190,12 +191,15 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
           bucketName);
 
       // Here we don't acquire bucket/volume lock because for a single client
-      // allocateBlock is called in serial fashion.
+      // allocateBlock is called in serial fashion. With this approach, it
+      // won't make 'fail-fast' during race condition case on delete/rename op,
+      // assuming that later it will fail at the key commit operation.
 
-      openKeyName = omMetadataManager
-          .getOpenKey(volumeName, bucketName, keyName, clientID);
+      openKeyName =
+          getOpenKeyName(volumeName, bucketName, keyName, clientID, 
omMetadataManager);
       openKeyInfo =
-          
omMetadataManager.getOpenKeyTable(getBucketLayout()).get(openKeyName);
+          getOpenKeyInfo(omMetadataManager, openKeyName, keyName);
+
       if (openKeyInfo == null) {
         throw new OMException("Open Key not found " + openKeyName,
             KEY_NOT_FOUND);
@@ -241,22 +245,20 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
           .build();
 
       // Add to cache.
-      omMetadataManager.getOpenKeyTable(getBucketLayout()).addCacheEntry(
-          new CacheKey<>(openKeyName),
-          CacheValue.get(trxnLogIndex, openKeyInfo));
+      addOpenTableCacheEntry(trxnLogIndex, omMetadataManager,
+          openKeyName, keyName, openKeyInfo);
 
       omResponse.setAllocateBlockResponse(AllocateBlockResponse.newBuilder()
           .setKeyLocation(blockLocation).build());
-      omClientResponse = new OMAllocateBlockResponse(omResponse.build(),
-          openKeyInfo, clientID, getBucketLayout());
+      omClientResponse = getOmClientResponse(clientID, omResponse, openKeyInfo,
+          omBucketInfo, omMetadataManager);
 
       LOG.debug("Allocated block for Volume:{}, Bucket:{}, OpenKey:{}",
           volumeName, bucketName, openKeyName);
     } catch (IOException | InvalidPathException ex) {
       omMetrics.incNumBlockAllocateCallFails();
       exception = ex;
-      omClientResponse = new OMAllocateBlockResponse(createErrorOMResponse(
-          omResponse, exception), getBucketLayout());
+      omClientResponse = getOmClientErrorResponse(omResponse, exception);
       LOG.error("Allocate Block failed. Volume:{}, Bucket:{}, OpenKey:{}. " +
           "Exception:{}", volumeName, bucketName, openKeyName, exception);
     } finally {
@@ -276,6 +278,41 @@ public OMClientResponse 
validateAndUpdateCache(OzoneManager ozoneManager, Execut
     return omClientResponse;
   }
 
+  protected OmKeyInfo getOpenKeyInfo(OMMetadataManager omMetadataManager,
+      String openKeyName, String keyName) throws IOException {
+    return 
omMetadataManager.getOpenKeyTable(getBucketLayout()).get(openKeyName);
+  }
+
+  protected String getOpenKeyName(String volumeName, String bucketName,
+      String keyName, long clientID, OMMetadataManager omMetadataManager)
+          throws IOException {
+    return omMetadataManager.getOpenKey(volumeName, bucketName, keyName, 
clientID);
+  }
+
+  protected void addOpenTableCacheEntry(long trxnLogIndex,
+      OMMetadataManager omMetadataManager, String openKeyName, String keyName,
+      OmKeyInfo openKeyInfo) {
+    omMetadataManager.getOpenKeyTable(getBucketLayout()).addCacheEntry(
+        new CacheKey<>(openKeyName),
+        CacheValue.get(trxnLogIndex, openKeyInfo));
+  }
+
+  @Nonnull
+  protected OMClientResponse getOmClientResponse(long clientID,
+      OMResponse.Builder omResponse, OmKeyInfo openKeyInfo,
+      OmBucketInfo omBucketInfo, OMMetadataManager omMetadataManager)
+          throws IOException {
+    return new OMAllocateBlockResponse(omResponse.build(),
+        openKeyInfo, clientID, getBucketLayout());
+  }
+
+  @Nonnull
+  protected OMClientResponse getOmClientErrorResponse(
+      OMResponse.Builder omResponse, Exception exception) {
+    return new OMAllocateBlockResponse(createErrorOMResponse(
+        omResponse, exception), getBucketLayout());
+  }
+
   @RequestFeatureValidator(
       conditions = ValidationCondition.CLUSTER_NEEDS_FINALIZATION,
       processingPhase = RequestProcessingPhase.PRE_PROCESS,
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java
index dba523bed48..a718a8b8c0f 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/key/OMAllocateBlockRequestWithFSO.java
@@ -17,200 +17,42 @@
 
 package org.apache.hadoop.ozone.om.request.key;
 
-import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_NOT_FOUND;
-import static 
org.apache.hadoop.ozone.om.exceptions.OMException.ResultCodes.KEY_UNDER_LEASE_RECOVERY;
-import static 
org.apache.hadoop.ozone.om.lock.OzoneManagerLock.LeveledResource.BUCKET_LOCK;
-
 import jakarta.annotation.Nonnull;
 import java.io.IOException;
-import java.nio.file.InvalidPathException;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import org.apache.hadoop.hdds.client.ReplicationConfig;
-import org.apache.hadoop.ozone.OzoneConsts;
-import org.apache.hadoop.ozone.audit.AuditLogger;
-import org.apache.hadoop.ozone.audit.OMAction;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
-import org.apache.hadoop.ozone.om.OMMetrics;
-import org.apache.hadoop.ozone.om.OzoneManager;
-import org.apache.hadoop.ozone.om.exceptions.OMException;
-import org.apache.hadoop.ozone.om.execution.flowcontrol.ExecutionContext;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
 import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
 import org.apache.hadoop.ozone.om.helpers.OmFSOFile;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
-import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo;
 import org.apache.hadoop.ozone.om.helpers.OzoneFSUtils;
-import org.apache.hadoop.ozone.om.helpers.QuotaUtil;
 import org.apache.hadoop.ozone.om.request.file.OMFileRequest;
-import org.apache.hadoop.ozone.om.request.util.OmResponseUtil;
 import org.apache.hadoop.ozone.om.response.OMClientResponse;
 import org.apache.hadoop.ozone.om.response.key.OMAllocateBlockResponseWithFSO;
-import org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos;
-import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.AllocateBlockRequest;
-import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.AllocateBlockResponse;
-import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.KeyArgs;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
 import 
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
 
 /**
  * Handles allocate block request - prefix layout.
  */
 public class OMAllocateBlockRequestWithFSO extends OMAllocateBlockRequest {
 
-  private static final Logger LOG =
-          LoggerFactory.getLogger(OMAllocateBlockRequestWithFSO.class);
-
   public OMAllocateBlockRequestWithFSO(OMRequest omRequest,
       BucketLayout bucketLayout) {
     super(omRequest, bucketLayout);
   }
 
   @Override
-  public OMClientResponse validateAndUpdateCache(OzoneManager ozoneManager, 
ExecutionContext context) {
-    final long trxnLogIndex = context.getIndex();
-
-    AllocateBlockRequest allocateBlockRequest =
-            getOmRequest().getAllocateBlockRequest();
-
-    KeyArgs keyArgs =
-            allocateBlockRequest.getKeyArgs();
-
-    OzoneManagerProtocolProtos.KeyLocation blockLocation =
-            allocateBlockRequest.getKeyLocation();
-    Objects.requireNonNull(blockLocation, "blockLocation == null");
-
-    String volumeName = keyArgs.getVolumeName();
-    String bucketName = keyArgs.getBucketName();
-    String keyName = keyArgs.getKeyName();
-    long clientID = allocateBlockRequest.getClientID();
-
-    OMMetrics omMetrics = ozoneManager.getMetrics();
-    omMetrics.incNumBlockAllocateCalls();
-
-    AuditLogger auditLogger = ozoneManager.getAuditLogger();
-
-    Map<String, String> auditMap = buildKeyArgsAuditMap(keyArgs);
-    auditMap.put(OzoneConsts.CLIENT_ID, String.valueOf(clientID));
-
-    OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager();
-    String openKeyName = null;
-
-    OMResponse.Builder omResponse = OmResponseUtil.getOMResponseBuilder(
-            getOmRequest());
-    OMClientResponse omClientResponse = null;
-
-    OmKeyInfo openKeyInfo = null;
-    Exception exception = null;
-    OmBucketInfo omBucketInfo = null;
-    boolean acquiredLock = false;
-
-    try {
-      validateBucketAndVolume(omMetadataManager, volumeName,
-          bucketName);
-
-      // Here we don't acquire bucket/volume lock because for a single client
-      // allocateBlock is called in serial fashion. With this approach, it
-      // won't make 'fail-fast' during race condition case on delete/rename op,
-      // assuming that later it will fail at the key commit operation.
-      openKeyName = getOpenKeyName(volumeName, bucketName, keyName, clientID,
-              ozoneManager);
-      openKeyInfo = getOpenKeyInfo(omMetadataManager, openKeyName, keyName);
-      if (openKeyInfo == null) {
-        throw new OMException("Open Key not found " + openKeyName,
-                KEY_NOT_FOUND);
-      }
-      if (openKeyInfo.getMetadata().containsKey(OzoneConsts.LEASE_RECOVERY)) {
-        throw new OMException("Open Key " + openKeyName + " is under lease 
recovery",
-            KEY_UNDER_LEASE_RECOVERY);
-      }
-      if (openKeyInfo.getMetadata().containsKey(OzoneConsts.DELETED_HSYNC_KEY) 
||
-          
openKeyInfo.getMetadata().containsKey(OzoneConsts.OVERWRITTEN_HSYNC_KEY)) {
-        throw new OMException("Open Key " + openKeyName + " is already 
deleted/overwritten",
-            KEY_NOT_FOUND);
-      }
-      List<OmKeyLocationInfo> newLocationList = Collections.singletonList(
-              OmKeyLocationInfo.getFromProtobuf(blockLocation));
-
-      mergeOmLockDetails(
-          omMetadataManager.getLock().acquireWriteLock(BUCKET_LOCK,
-              volumeName, bucketName));
-      acquiredLock = getOmLockDetails().isLockAcquired();
-      omBucketInfo = getBucketInfo(omMetadataManager, volumeName, bucketName);
-      // check bucket and volume quota
-      long preAllocatedKeySize = newLocationList.size()
-          * ozoneManager.getScmBlockSize();
-      long hadAllocatedKeySize =
-          openKeyInfo.getLatestVersionLocations().getLocationList().size()
-              * ozoneManager.getScmBlockSize();
-      ReplicationConfig repConfig = openKeyInfo.getReplicationConfig();
-      long totalAllocatedSpace = QuotaUtil.getReplicatedSize(
-          preAllocatedKeySize, repConfig) + QuotaUtil.getReplicatedSize(
-          hadAllocatedKeySize, repConfig);
-      checkBucketQuotaInBytes(omMetadataManager, omBucketInfo,
-          totalAllocatedSpace);
-      // Append new block
-      openKeyInfo.appendNewBlocks(newLocationList, false);
-
-      // Set modification time.
-      openKeyInfo.setModificationTime(keyArgs.getModificationTime());
-
-      // Set the UpdateID to current transactionLogIndex
-      openKeyInfo = openKeyInfo.toBuilder()
-          .setUpdateID(trxnLogIndex)
-          .build();
-
-      // Add to cache.
-      addOpenTableCacheEntry(trxnLogIndex, omMetadataManager, openKeyName, 
keyName,
-              openKeyInfo);
-
-      omResponse.setAllocateBlockResponse(AllocateBlockResponse.newBuilder()
-              .setKeyLocation(blockLocation).build());
-      long volumeId = omMetadataManager.getVolumeId(volumeName);
-      omClientResponse = getOmClientResponse(clientID, omResponse,
-              openKeyInfo, omBucketInfo.copyObject(), volumeId);
-      LOG.debug("Allocated block for Volume:{}, Bucket:{}, OpenKey:{}",
-              volumeName, bucketName, openKeyName);
-    } catch (IOException | InvalidPathException ex) {
-      omMetrics.incNumBlockAllocateCallFails();
-      exception = ex;
-      omClientResponse = new OMAllocateBlockResponseWithFSO(
-          createErrorOMResponse(omResponse, exception), getBucketLayout());
-      LOG.error("Allocate Block failed. Volume:{}, Bucket:{}, OpenKey:{}. " +
-              "Exception:{}", volumeName, bucketName, openKeyName, exception);
-    } finally {
-      if (acquiredLock) {
-        mergeOmLockDetails(
-            omMetadataManager.getLock().releaseWriteLock(
-                BUCKET_LOCK, volumeName, bucketName));
-      }
-      if (omClientResponse != null) {
-        omClientResponse.setOmLockDetails(getOmLockDetails());
-      }
-    }
-
-    markForAudit(auditLogger, buildAuditMessage(OMAction.ALLOCATE_BLOCK, 
auditMap,
-            exception, getOmRequest().getUserInfo()));
-
-    return omClientResponse;
-  }
-
-  private OmKeyInfo getOpenKeyInfo(OMMetadataManager omMetadataManager,
+  protected OmKeyInfo getOpenKeyInfo(OMMetadataManager omMetadataManager,
       String openKeyName, String keyName) throws IOException {
     String fileName = OzoneFSUtils.getFileName(keyName);
     return OMFileRequest.getOmKeyInfoFromFileTable(true,
             omMetadataManager, openKeyName, fileName);
   }
 
-  private String getOpenKeyName(String volumeName, String bucketName,
-      String keyName, long clientID, OzoneManager ozoneManager)
+  @Override
+  protected String getOpenKeyName(String volumeName, String bucketName,
+      String keyName, long clientID, OMMetadataManager omMetadataManager)
           throws IOException {
-    OMMetadataManager omMetadataManager = ozoneManager.getMetadataManager();
-
     return new OmFSOFile.Builder()
           .setVolumeName(volumeName)
           .setBucketName(bucketName)
@@ -219,18 +61,30 @@ private String getOpenKeyName(String volumeName, String 
bucketName,
           .build().getOpenFileName(clientID);
   }
 
-  private void addOpenTableCacheEntry(long trxnLogIndex,
+  @Override
+  protected void addOpenTableCacheEntry(long trxnLogIndex,
       OMMetadataManager omMetadataManager, String openKeyName, String keyName,
       OmKeyInfo openKeyInfo) {
     OMFileRequest.addOpenFileTableCacheEntry(omMetadataManager, openKeyName,
         openKeyInfo, keyName, trxnLogIndex);
   }
 
+  @Override
   @Nonnull
-  private OMClientResponse getOmClientResponse(long clientID,
+  protected OMClientResponse getOmClientResponse(long clientID,
       OMResponse.Builder omResponse, OmKeyInfo openKeyInfo,
-      OmBucketInfo omBucketInfo, long volumeId) {
+      OmBucketInfo omBucketInfo, OMMetadataManager omMetadataManager)
+          throws IOException {
+    long volumeId = omMetadataManager.getVolumeId(openKeyInfo.getVolumeName());
     return new OMAllocateBlockResponseWithFSO(omResponse.build(), openKeyInfo,
             clientID, getBucketLayout(), volumeId, omBucketInfo.getObjectID());
   }
+
+  @Override
+  @Nonnull
+  protected OMClientResponse getOmClientErrorResponse(
+      OMResponse.Builder omResponse, Exception exception) {
+    return new OMAllocateBlockResponseWithFSO(
+        createErrorOMResponse(omResponse, exception), getBucketLayout());
+  }
 }


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

Reply via email to