HADOOP-18003. Add a method appendIfAbsent for CallerContext (#3644)

Cherry-picked from 573b358f by Owen O'Malley
This commit is contained in:
litao 2021-11-15 21:44:49 +08:00 committed by Owen O'Malley
parent f9d40ed7b7
commit 0029f22d7d
2 changed files with 51 additions and 0 deletions

View File

@ -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);
}

View File

@ -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();