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

weichiu pushed a commit to branch HDDS-7593
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/HDDS-7593 by this push:
     new f5f737dc5c HDDS-10190. [hsync] Handle lease recovery for file without 
blocks. (#6094)
f5f737dc5c is described below

commit f5f737dc5cdb8e8658952e4361d70bf0eb6a781e
Author: ashishkumar50 <[email protected]>
AuthorDate: Sat Jan 27 00:13:17 2024 +0530

    HDDS-10190. [hsync] Handle lease recovery for file without blocks. (#6094)
    
    Co-authored-by: ashishk <[email protected]>
---
 .../apache/hadoop/fs/ozone/TestLeaseRecovery.java  | 21 ++++++++++++++
 .../om/request/file/OMRecoverLeaseRequest.java     | 32 ++++++++++++----------
 .../apache/hadoop/fs/ozone/OzoneFileSystem.java    | 18 ++++++------
 .../hadoop/fs/ozone/RootedOzoneFileSystem.java     | 18 ++++++------
 .../apache/hadoop/fs/ozone/OzoneFileSystem.java    | 18 ++++++------
 .../hadoop/fs/ozone/RootedOzoneFileSystem.java     | 18 ++++++------
 6 files changed, 78 insertions(+), 47 deletions(-)

diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestLeaseRecovery.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestLeaseRecovery.java
index 68c2d43471..a40c7f5275 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestLeaseRecovery.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/fs/ozone/TestLeaseRecovery.java
@@ -433,6 +433,27 @@ public class TestLeaseRecovery {
     }
   }
 
+  @Test
+  public void testRecoveryWithoutBlocks() throws Exception {
+    RootedOzoneFileSystem fs = (RootedOzoneFileSystem)FileSystem.get(conf);
+
+    final FSDataOutputStream stream = fs.create(file, true);
+    try {
+      stream.hsync();
+      assertFalse(fs.isFileClosed(file));
+
+      int count = 0;
+      while (count++ < 15 && !fs.recoverLease(file)) {
+        Thread.sleep(1000);
+      }
+      // The lease should have been recovered.
+      assertTrue(fs.isFileClosed(file), "File should be closed");
+
+    } finally {
+      closeIgnoringKeyNotFound(stream);
+    }
+  }
+
   private void verifyData(byte[] data, int dataSize, Path filePath, 
RootedOzoneFileSystem fs) throws IOException {
     try (FSDataInputStream fdis = fs.open(filePath)) {
       int bufferSize = dataSize > data.length ? dataSize / 2 : dataSize;
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
index addcc54977..6d997ed272 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/request/file/OMRecoverLeaseRequest.java
@@ -248,29 +248,31 @@ public class OMRecoverLeaseRequest extends OMKeyRequest {
     List<OmKeyLocationInfo> keyLocationInfoList = 
keyLatestVersionLocations.getLocationList();
     OmKeyLocationInfoGroup openKeyLatestVersionLocations = 
openKeyInfo.getLatestVersionLocations();
     List<OmKeyLocationInfo> openKeyLocationInfoList = 
openKeyLatestVersionLocations.getLocationList();
-    OmKeyLocationInfo finalBlock;
+
+    OmKeyLocationInfo finalBlock = null;
     boolean returnKeyInfo = true;
     if (openKeyLocationInfoList.size() > keyLocationInfoList.size() &&
-        openKeyModificationTime > keyInfo.getModificationTime()) {
+        openKeyModificationTime > keyInfo.getModificationTime() &&
+        openKeyLocationInfoList.size() > 0) {
       finalBlock = openKeyLocationInfoList.get(openKeyLocationInfoList.size() 
- 1);
       returnKeyInfo = false;
-    } else {
+    } else if (keyLocationInfoList.size() > 0) {
       finalBlock = keyLocationInfoList.get(keyLocationInfoList.size() - 1);
     }
-
-    // set token to last block if enabled
-    if (ozoneManager.isGrpcBlockTokenEnabled()) {
-      String remoteUser = getRemoteUser().getShortUserName();
-      OzoneBlockTokenSecretManager secretManager = 
ozoneManager.getBlockTokenSecretManager();
-      finalBlock.setToken(secretManager.generateToken(remoteUser, 
finalBlock.getBlockID(),
-          EnumSet.of(READ, WRITE), finalBlock.getLength()));
+    if (finalBlock != null) {
+      // set token to last block if enabled
+      if (ozoneManager.isGrpcBlockTokenEnabled()) {
+        String remoteUser = getRemoteUser().getShortUserName();
+        OzoneBlockTokenSecretManager secretManager = 
ozoneManager.getBlockTokenSecretManager();
+        finalBlock.setToken(secretManager.generateToken(remoteUser, 
finalBlock.getBlockID(),
+            EnumSet.of(READ, WRITE), finalBlock.getLength()));
+      }
+      // refresh last block pipeline
+      ContainerWithPipeline containerWithPipeline =
+          
ozoneManager.getScmClient().getContainerClient().getContainerWithPipeline(finalBlock.getContainerID());
+      finalBlock.setPipeline(containerWithPipeline.getPipeline());
     }
 
-    // refresh last block pipeline
-    ContainerWithPipeline containerWithPipeline =
-        
ozoneManager.getScmClient().getContainerClient().getContainerWithPipeline(finalBlock.getContainerID());
-    finalBlock.setPipeline(containerWithPipeline.getPipeline());
-
     RecoverLeaseResponse.Builder rb = RecoverLeaseResponse.newBuilder();
     rb.setKeyInfo(returnKeyInfo ? 
keyInfo.getNetworkProtobuf(getOmRequest().getVersion(), true) :
         openKeyInfo.getNetworkProtobuf(getOmRequest().getVersion(), true));
diff --git 
a/hadoop-ozone/ozonefs-hadoop3/src/main/java/org/apache/hadoop/fs/ozone/OzoneFileSystem.java
 
b/hadoop-ozone/ozonefs-hadoop3/src/main/java/org/apache/hadoop/fs/ozone/OzoneFileSystem.java
index 415801a789..b6cc22bbad 100644
--- 
a/hadoop-ozone/ozonefs-hadoop3/src/main/java/org/apache/hadoop/fs/ozone/OzoneFileSystem.java
+++ 
b/hadoop-ozone/ozonefs-hadoop3/src/main/java/org/apache/hadoop/fs/ozone/OzoneFileSystem.java
@@ -155,15 +155,17 @@ public class OzoneFileSystem extends BasicOzoneFileSystem
 
     // finalize the final block and get block length
     List<OmKeyLocationInfo> locationInfoList = 
keyInfo.getLatestVersionLocations().getLocationList();
-    OmKeyLocationInfo block = locationInfoList.get(locationInfoList.size() - 
1);
-    try {
-      block.setLength(getAdapter().finalizeBlock(block));
-    } catch (Throwable e) {
-      if (!forceRecovery) {
-        throw e;
+    if (!locationInfoList.isEmpty()) {
+      OmKeyLocationInfo block = locationInfoList.get(locationInfoList.size() - 
1);
+      try {
+        block.setLength(getAdapter().finalizeBlock(block));
+      } catch (Throwable e) {
+        if (!forceRecovery) {
+          throw e;
+        }
+        LOG.warn("Failed to finalize block. Continue to recover the file since 
{} is enabled.",
+            FORCE_LEASE_RECOVERY_ENV, e);
       }
-      LOG.warn("Failed to finalize block. Continue to recover the file since 
{} is enabled.",
-          FORCE_LEASE_RECOVERY_ENV, e);
     }
 
     // recover and commit file
diff --git 
a/hadoop-ozone/ozonefs-hadoop3/src/main/java/org/apache/hadoop/fs/ozone/RootedOzoneFileSystem.java
 
b/hadoop-ozone/ozonefs-hadoop3/src/main/java/org/apache/hadoop/fs/ozone/RootedOzoneFileSystem.java
index f5216cb451..e6eba955e4 100644
--- 
a/hadoop-ozone/ozonefs-hadoop3/src/main/java/org/apache/hadoop/fs/ozone/RootedOzoneFileSystem.java
+++ 
b/hadoop-ozone/ozonefs-hadoop3/src/main/java/org/apache/hadoop/fs/ozone/RootedOzoneFileSystem.java
@@ -159,15 +159,17 @@ public class RootedOzoneFileSystem extends 
BasicRootedOzoneFileSystem
 
     // finalize the final block and get block length
     List<OmKeyLocationInfo> locationInfoList = 
keyInfo.getLatestVersionLocations().getLocationList();
-    OmKeyLocationInfo block = locationInfoList.get(locationInfoList.size() - 
1);
-    try {
-      block.setLength(getAdapter().finalizeBlock(block));
-    } catch (Throwable e) {
-      if (!forceRecovery) {
-        throw e;
+    if (!locationInfoList.isEmpty()) {
+      OmKeyLocationInfo block = locationInfoList.get(locationInfoList.size() - 
1);
+      try {
+        block.setLength(getAdapter().finalizeBlock(block));
+      } catch (Throwable e) {
+        if (!forceRecovery) {
+          throw e;
+        }
+        LOG.warn("Failed to finalize block. Continue to recover the file since 
{} is enabled.",
+            FORCE_LEASE_RECOVERY_ENV, e);
       }
-      LOG.warn("Failed to finalize block. Continue to recover the file since 
{} is enabled.",
-          FORCE_LEASE_RECOVERY_ENV, e);
     }
 
     // recover and commit file
diff --git 
a/hadoop-ozone/ozonefs/src/main/java/org/apache/hadoop/fs/ozone/OzoneFileSystem.java
 
b/hadoop-ozone/ozonefs/src/main/java/org/apache/hadoop/fs/ozone/OzoneFileSystem.java
index 415801a789..b6cc22bbad 100644
--- 
a/hadoop-ozone/ozonefs/src/main/java/org/apache/hadoop/fs/ozone/OzoneFileSystem.java
+++ 
b/hadoop-ozone/ozonefs/src/main/java/org/apache/hadoop/fs/ozone/OzoneFileSystem.java
@@ -155,15 +155,17 @@ public class OzoneFileSystem extends BasicOzoneFileSystem
 
     // finalize the final block and get block length
     List<OmKeyLocationInfo> locationInfoList = 
keyInfo.getLatestVersionLocations().getLocationList();
-    OmKeyLocationInfo block = locationInfoList.get(locationInfoList.size() - 
1);
-    try {
-      block.setLength(getAdapter().finalizeBlock(block));
-    } catch (Throwable e) {
-      if (!forceRecovery) {
-        throw e;
+    if (!locationInfoList.isEmpty()) {
+      OmKeyLocationInfo block = locationInfoList.get(locationInfoList.size() - 
1);
+      try {
+        block.setLength(getAdapter().finalizeBlock(block));
+      } catch (Throwable e) {
+        if (!forceRecovery) {
+          throw e;
+        }
+        LOG.warn("Failed to finalize block. Continue to recover the file since 
{} is enabled.",
+            FORCE_LEASE_RECOVERY_ENV, e);
       }
-      LOG.warn("Failed to finalize block. Continue to recover the file since 
{} is enabled.",
-          FORCE_LEASE_RECOVERY_ENV, e);
     }
 
     // recover and commit file
diff --git 
a/hadoop-ozone/ozonefs/src/main/java/org/apache/hadoop/fs/ozone/RootedOzoneFileSystem.java
 
b/hadoop-ozone/ozonefs/src/main/java/org/apache/hadoop/fs/ozone/RootedOzoneFileSystem.java
index 2784626287..36aa0e5f27 100644
--- 
a/hadoop-ozone/ozonefs/src/main/java/org/apache/hadoop/fs/ozone/RootedOzoneFileSystem.java
+++ 
b/hadoop-ozone/ozonefs/src/main/java/org/apache/hadoop/fs/ozone/RootedOzoneFileSystem.java
@@ -152,15 +152,17 @@ public class RootedOzoneFileSystem extends 
BasicRootedOzoneFileSystem
 
     // finalize the final block and get block length
     List<OmKeyLocationInfo> keyLocationInfoList = 
keyInfo.getLatestVersionLocations().getLocationList();
-    OmKeyLocationInfo block = 
keyLocationInfoList.get(keyLocationInfoList.size() - 1);
-    try {
-      block.setLength(getAdapter().finalizeBlock(block));
-    } catch (Throwable e) {
-      if (!forceRecovery) {
-        throw e;
+    if (!keyLocationInfoList.isEmpty()) {
+      OmKeyLocationInfo block = 
keyLocationInfoList.get(keyLocationInfoList.size() - 1);
+      try {
+        block.setLength(getAdapter().finalizeBlock(block));
+      } catch (Throwable e) {
+        if (!forceRecovery) {
+          throw e;
+        }
+        LOG.warn("Failed to finalize block. Continue to recover the file since 
{} is enabled.",
+            FORCE_LEASE_RECOVERY_ENV, e);
       }
-      LOG.warn("Failed to finalize block. Continue to recover the file since 
{} is enabled.",
-          FORCE_LEASE_RECOVERY_ENV, e);
     }
 
     // recover and commit file


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

Reply via email to