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

shashikant pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hadoop-ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new 26d8375  HDDS-3703. Avoid file lookup calls in writeChunk hotpath 
(#1013)
26d8375 is described below

commit 26d83753792908e840fe6fc9629bed45bb6fa114
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Fri Jun 5 10:35:59 2020 +0200

    HDDS-3703. Avoid file lookup calls in writeChunk hotpath (#1013)
---
 .../container/common/impl/ChunkLayOutVersion.java  | 22 ++++++++--------------
 .../ozone/container/keyvalue/KeyValueHandler.java  |  7 ++-----
 .../container/keyvalue/helpers/ChunkUtils.java     |  9 +++++++++
 .../keyvalue/impl/ChunkManagerDispatcher.java      |  6 +++---
 .../keyvalue/impl/FilePerBlockStrategy.java        | 12 +++++++-----
 .../keyvalue/interfaces/ChunkManager.java          |  4 ++--
 .../client/rpc/TestContainerStateMachine.java      |  6 +++---
 7 files changed, 34 insertions(+), 32 deletions(-)

diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ChunkLayOutVersion.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ChunkLayOutVersion.java
index ff4ba41..e0341fa 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ChunkLayOutVersion.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/common/impl/ChunkLayOutVersion.java
@@ -41,14 +41,14 @@ public enum ChunkLayOutVersion {
   FILE_PER_CHUNK(1, "One file per chunk") {
     @Override
     public File getChunkFile(File chunkDir, BlockID blockID,
-        ChunkInfo info) throws StorageContainerException {
-      return chunkDir.toPath().resolve(info.getChunkName()).toFile();
+        ChunkInfo info) {
+      return new File(chunkDir, info.getChunkName());
     }
   },
   FILE_PER_BLOCK(2, "One file per block") {
     @Override
     public File getChunkFile(File chunkDir, BlockID blockID,
-        ChunkInfo info) throws StorageContainerException {
+        ChunkInfo info) {
       return new File(chunkDir, blockID.getLocalID() + ".block");
     }
   };
@@ -117,12 +117,12 @@ public enum ChunkLayOutVersion {
   }
 
   public abstract File getChunkFile(File chunkDir,
-      BlockID blockID, ChunkInfo info) throws StorageContainerException;
+      BlockID blockID, ChunkInfo info);
 
   public File getChunkFile(ContainerData containerData, BlockID blockID,
       ChunkInfo info) throws StorageContainerException {
-    File chunksLoc = verifyChunkDirExists(containerData);
-    return getChunkFile(chunksLoc, blockID, info);
+    File chunkDir = getChunkDir(containerData);
+    return getChunkFile(chunkDir, blockID, info);
   }
 
   @Override
@@ -130,7 +130,7 @@ public enum ChunkLayOutVersion {
     return "ChunkLayout:v" + version;
   }
 
-  private static File verifyChunkDirExists(ContainerData containerData)
+  private static File getChunkDir(ContainerData containerData)
       throws StorageContainerException {
     Preconditions.checkNotNull(containerData, "Container data can't be null");
 
@@ -140,13 +140,7 @@ public enum ChunkLayOutVersion {
       throw new StorageContainerException("Unable to get Chunks directory.",
           UNABLE_TO_FIND_DATA_DIR);
     }
-    File chunksLoc = new File(chunksPath);
-    if (!chunksLoc.exists()) {
-      LOG.error("Chunks path does not exist");
-      throw new StorageContainerException("Unable to get Chunks directory.",
-          UNABLE_TO_FIND_DATA_DIR);
-    }
-    return chunksLoc;
+    return new File(chunksPath);
   }
 
 }
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
index 26e98c2..1cfd648 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/KeyValueHandler.java
@@ -421,10 +421,7 @@ public class KeyValueHandler extends Handler {
       Preconditions.checkNotNull(blockData);
 
       if (!request.getPutBlock().hasEof() || request.getPutBlock().getEof()) {
-        for (ContainerProtos.ChunkInfo chunkInfo : blockData.getChunks()) {
-          chunkManager.finishWriteChunk(kvContainer, blockData.getBlockID(),
-              ChunkInfo.getFromProtoBuf(chunkInfo));
-        }
+        chunkManager.finishWriteChunks(kvContainer, blockData);
       }
 
       long bcsId =
@@ -773,7 +770,7 @@ public class KeyValueHandler extends Handler {
       // here. There is no need to maintain this info in openContainerBlockMap.
       chunkManager
           .writeChunk(kvContainer, blockID, chunkInfo, data, 
dispatcherContext);
-      chunkManager.finishWriteChunk(kvContainer, blockID, chunkInfo);
+      chunkManager.finishWriteChunks(kvContainer, blockData);
 
       List<ContainerProtos.ChunkInfo> chunks = new LinkedList<>();
       chunks.add(chunkInfoProto);
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/ChunkUtils.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/ChunkUtils.java
index df0279f..e1fac6f 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/ChunkUtils.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/helpers/ChunkUtils.java
@@ -261,6 +261,15 @@ public final class ChunkUtils {
     return Boolean.parseBoolean(overWrite);
   }
 
+  public static void verifyChunkFileExists(File file)
+      throws StorageContainerException {
+    if (!file.exists()) {
+      throw new StorageContainerException(
+          "Chunk file not found: " + file.getPath(),
+          UNABLE_TO_FIND_CHUNK);
+    }
+  }
+
   @VisibleForTesting
   static <T> T processFileExclusively(Path path, Supplier<T> op) {
     for (;;) {
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/ChunkManagerDispatcher.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/ChunkManagerDispatcher.java
index 42e96a1..3d2b815 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/ChunkManagerDispatcher.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/ChunkManagerDispatcher.java
@@ -70,11 +70,11 @@ public class ChunkManagerDispatcher implements ChunkManager 
{
   }
 
   @Override
-  public void finishWriteChunk(KeyValueContainer kvContainer, BlockID blockID,
-      ChunkInfo info) throws IOException {
+  public void finishWriteChunks(KeyValueContainer kvContainer,
+      BlockData blockData) throws IOException {
 
     selectHandler(kvContainer)
-        .finishWriteChunk(kvContainer, blockID, info);
+        .finishWriteChunks(kvContainer, blockData);
   }
 
   @Override
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/FilePerBlockStrategy.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/FilePerBlockStrategy.java
index 2aa89a4..7e7e5f4 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/FilePerBlockStrategy.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/impl/FilePerBlockStrategy.java
@@ -55,6 +55,7 @@ import static 
org.apache.hadoop.hdds.protocol.datanode.proto.ContainerProtos.Res
 import static 
org.apache.hadoop.ozone.container.common.impl.ChunkLayOutVersion.FILE_PER_BLOCK;
 import static 
org.apache.hadoop.ozone.container.common.transport.server.ratis.DispatcherContext.WriteChunkStage.COMMIT_DATA;
 import static 
org.apache.hadoop.ozone.container.keyvalue.helpers.ChunkUtils.validateChunkForOverwrite;
+import static 
org.apache.hadoop.ozone.container.keyvalue.helpers.ChunkUtils.verifyChunkFileExists;
 
 /**
  * This class is for performing chunk related operations.
@@ -163,10 +164,11 @@ public class FilePerBlockStrategy implements ChunkManager 
{
   }
 
   @Override
-  public void finishWriteChunk(KeyValueContainer container, BlockID blockID,
-      ChunkInfo info) throws IOException {
-    File chunkFile = getChunkFile(container, blockID, info);
+  public void finishWriteChunks(KeyValueContainer container,
+      BlockData blockData) throws IOException {
+    File chunkFile = getChunkFile(container, blockData.getBlockID(), null);
     files.close(chunkFile);
+    verifyChunkFileExists(chunkFile);
   }
 
   private void deleteChunk(Container container, BlockID blockID,
@@ -227,7 +229,7 @@ public class FilePerBlockStrategy implements ChunkManager {
     public FileChannel getChannel(File file, boolean sync)
         throws StorageContainerException {
       try {
-        return files.get(file.getAbsolutePath(),
+        return files.get(file.getPath(),
             () -> open(file, sync)).getChannel();
       } catch (ExecutionException e) {
         if (e.getCause() instanceof IOException) {
@@ -248,7 +250,7 @@ public class FilePerBlockStrategy implements ChunkManager {
 
     public void close(File file) {
       if (file != null) {
-        files.invalidate(file.getAbsolutePath());
+        files.invalidate(file.getPath());
       }
     }
 
diff --git 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/interfaces/ChunkManager.java
 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/interfaces/ChunkManager.java
index fe49e84..8db72f7 100644
--- 
a/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/interfaces/ChunkManager.java
+++ 
b/hadoop-hdds/container-service/src/main/java/org/apache/hadoop/ozone/container/keyvalue/interfaces/ChunkManager.java
@@ -97,8 +97,8 @@ public interface ChunkManager {
     // if applicable
   }
 
-  default void finishWriteChunk(KeyValueContainer kvContainer, BlockID blockID,
-      ChunkInfo info) throws IOException {
+  default void finishWriteChunks(KeyValueContainer kvContainer,
+      BlockData blockData) throws IOException {
     // no-op
   }
 }
diff --git 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachine.java
 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachine.java
index 1972dac..6431b70 100644
--- 
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachine.java
+++ 
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/client/rpc/TestContainerStateMachine.java
@@ -156,12 +156,12 @@ public class TestContainerStateMachine {
 
     key.close();
     // Make sure the container is marked unhealthy
-    Assert.assertTrue(
+    Assert.assertEquals(
+        ContainerProtos.ContainerDataProto.State.UNHEALTHY,
         cluster.getHddsDatanodes().get(0).getDatanodeStateMachine()
             .getContainer().getContainerSet()
             .getContainer(omKeyLocationInfo.getContainerID())
-            .getContainerState()
-            == ContainerProtos.ContainerDataProto.State.UNHEALTHY);
+            .getContainerState());
   }
 
   @Test


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

Reply via email to