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 ae7110eaf2 HDDS-5852. Optimize streaming chunk write on exception 
(#4839)
ae7110eaf2 is described below

commit ae7110eaf22b4c380f34467eb78231c881dfd40a
Author: Sadanand Shenoy <[email protected]>
AuthorDate: Mon Jan 15 18:19:07 2024 +0530

    HDDS-5852. Optimize streaming chunk write on exception (#4839)
---
 .../hadoop/hdds/scm/storage/BlockDataStreamOutput.java |  4 ++--
 .../hadoop/ozone/client/io/KeyDataStreamOutput.java    | 18 ++++++++++++++++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git 
a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/BlockDataStreamOutput.java
 
b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/BlockDataStreamOutput.java
index f878659afa..005402efa7 100644
--- 
a/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/BlockDataStreamOutput.java
+++ 
b/hadoop-hdds/client/src/main/java/org/apache/hadoop/hdds/scm/storage/BlockDataStreamOutput.java
@@ -377,7 +377,7 @@ public class BlockDataStreamOutput implements 
ByteBufferStreamOutput {
    * @return minimum commit index replicated to all nodes
    * @throws IOException IOException in case watch gets timed out
    */
-  private void watchForCommit(boolean bufferFull) throws IOException {
+  public void watchForCommit(boolean bufferFull) throws IOException {
     checkOpen();
     try {
       XceiverClientReply reply = bufferFull ?
@@ -405,7 +405,7 @@ public class BlockDataStreamOutput implements 
ByteBufferStreamOutput {
    * @param force true if no data was written since most recent putBlock and
    *            stream is being closed
    */
-  private void executePutBlock(boolean close,
+  public void executePutBlock(boolean close,
       boolean force) throws IOException {
     checkOpen();
     long flushPos = totalDataFlushedLength;
diff --git 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/KeyDataStreamOutput.java
 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/KeyDataStreamOutput.java
index 2368cd78e9..e5a43819a3 100644
--- 
a/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/KeyDataStreamOutput.java
+++ 
b/hadoop-ozone/client/src/main/java/org/apache/hadoop/ozone/client/io/KeyDataStreamOutput.java
@@ -30,6 +30,7 @@ import 
org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
 import org.apache.hadoop.hdds.scm.pipeline.Pipeline;
 import org.apache.hadoop.hdds.scm.pipeline.PipelineID;
 import org.apache.hadoop.hdds.scm.storage.AbstractDataStreamOutput;
+import org.apache.hadoop.hdds.scm.storage.BlockDataStreamOutput;
 import org.apache.hadoop.ozone.om.helpers.OmKeyInfo;
 import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfo;
 import org.apache.hadoop.ozone.om.helpers.OmKeyLocationInfoGroup;
@@ -260,6 +261,23 @@ public class KeyDataStreamOutput extends 
AbstractDataStreamOutput
     long containerId = streamEntry.getBlockID().getContainerID();
     Collection<DatanodeDetails> failedServers = streamEntry.getFailedServers();
     Preconditions.checkNotNull(failedServers);
+    if (!containerExclusionException) {
+      BlockDataStreamOutputEntry currentStreamEntry =
+          blockDataStreamOutputEntryPool.getCurrentStreamEntry();
+      if (currentStreamEntry != null) {
+        try {
+          BlockDataStreamOutput blockDataStreamOutput =
+              (BlockDataStreamOutput) currentStreamEntry
+                  .getByteBufStreamOutput();
+          blockDataStreamOutput.executePutBlock(false, false);
+          blockDataStreamOutput.watchForCommit(false);
+        } catch (IOException e) {
+          LOG.error(
+              "Failed to execute putBlock/watchForCommit. " +
+                  "Continuing to write chunks" + "in new block", e);
+        }
+      }
+    }
     ExcludeList excludeList = blockDataStreamOutputEntryPool.getExcludeList();
     long bufferedDataLen = blockDataStreamOutputEntryPool.computeBufferData();
     if (!failedServers.isEmpty()) {


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

Reply via email to