You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by om...@apache.org on 2022/03/14 17:42:49 UTC

[hadoop] 05/08: HADOOP-18003. Add a method appendIfAbsent for CallerContext (#3644)

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

omalley pushed a commit to branch branch-3.3
in repository https://gitbox.apache.org/repos/asf/hadoop.git

commit 0029f22d7dfc77d64aad4202e23a1fc90517fd2a
Author: litao <to...@gmail.com>
AuthorDate: Mon Nov 15 21:44:49 2021 +0800

    HADOOP-18003. Add a method appendIfAbsent for CallerContext (#3644)
    
    Cherry-picked from 573b358f by Owen O'Malley
---
 .../java/org/apache/hadoop/ipc/CallerContext.java  | 20 ++++++++++++++
 .../org/apache/hadoop/ipc/TestCallerContext.java   | 31 ++++++++++++++++++++++
 2 files changed, 51 insertions(+)

diff --git a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/CallerContext.java b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/CallerContext.java
index 378b83d..9f9c974 100644
--- a/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/CallerContext.java
+++ b/hadoop-common-project/hadoop-common/src/main/java/org/apache/hadoop/ipc/CallerContext.java
@@ -228,6 +228,26 @@ public final class CallerContext {
       return this;
     }
 
+    /**
+     * Append new field which contains key and value to the context
+     * if the key("key:") is absent.
+     * @param key the key of field.
+     * @param value the value of field.
+     * @return the builder.
+     */
+    public Builder appendIfAbsent(String key, String value) {
+      if (sb.toString().contains(key + KEY_VALUE_SEPARATOR)) {
+        return this;
+      }
+      if (isValid(key) && isValid(value)) {
+        if (sb.length() > 0) {
+          sb.append(fieldSeparator);
+        }
+        sb.append(key).append(KEY_VALUE_SEPARATOR).append(value);
+      }
+      return this;
+    }
+
     public CallerContext build() {
       return new CallerContext(this);
     }
diff --git a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/TestCallerContext.java b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/TestCallerContext.java
index fc1057b..bb4a119 100644
--- a/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/TestCallerContext.java
+++ b/hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/ipc/TestCallerContext.java
@@ -42,6 +42,37 @@ public class TestCallerContext {
         builder.build().getContext());
   }
 
+  @Test
+  public void testBuilderAppendIfAbsent() {
+    Configuration conf = new Configuration();
+    conf.set(HADOOP_CALLER_CONTEXT_SEPARATOR_KEY, "$");
+    CallerContext.Builder builder = new CallerContext.Builder(null, conf);
+    builder.append("key1", "value1");
+    Assert.assertEquals("key1:value1",
+        builder.build().getContext());
+
+    // Append an existed key with different value.
+    builder.appendIfAbsent("key1", "value2");
+    String[] items = builder.build().getContext().split("\\$");
+    Assert.assertEquals(1, items.length);
+    Assert.assertEquals("key1:value1",
+        builder.build().getContext());
+
+    // Append an absent key.
+    builder.appendIfAbsent("key2", "value2");
+    String[] items2 = builder.build().getContext().split("\\$");
+    Assert.assertEquals(2, items2.length);
+    Assert.assertEquals("key1:value1$key2:value2",
+        builder.build().getContext());
+
+    // Append a key that is a substring of an existing key.
+    builder.appendIfAbsent("key", "value");
+    String[] items3 = builder.build().getContext().split("\\$");
+    Assert.assertEquals(3, items3.length);
+    Assert.assertEquals("key1:value1$key2:value2$key:value",
+        builder.build().getContext());
+  }
+
   @Test(expected = IllegalArgumentException.class)
   public void testNewBuilder() {
     Configuration conf = new Configuration();

---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org