You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@james.apache.org by bt...@apache.org on 2021/05/25 00:15:41 UTC
[james-project] 02/02: JAMES-3587 Optimize MDCBuilder::build
This is an automated email from the ASF dual-hosted git repository.
btellier pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/james-project.git
commit 1a45cbe249517d867cc1daa5220c117476dd41fa
Author: Benoit Tellier <bt...@linagora.com>
AuthorDate: Wed May 19 21:47:42 2021 +0700
JAMES-3587 Optimize MDCBuilder::build
MDC::build represents 0.40% of CPU time according to flame graphs conducted
during performance tests.
- Avoids the allocation of MDCCloseable objects
- Avoids two intermediate collects
---
.../java/org/apache/james/util/MDCBuilder.java | 47 +++++--------------
.../java/org/apache/james/util/MDCBuilderTest.java | 53 ----------------------
2 files changed, 11 insertions(+), 89 deletions(-)
diff --git a/server/container/util/src/main/java/org/apache/james/util/MDCBuilder.java b/server/container/util/src/main/java/org/apache/james/util/MDCBuilder.java
index aefb7f7..5255f07 100644
--- a/server/container/util/src/main/java/org/apache/james/util/MDCBuilder.java
+++ b/server/container/util/src/main/java/org/apache/james/util/MDCBuilder.java
@@ -21,7 +21,6 @@ package org.apache.james.util;
import java.io.Closeable;
import java.io.IOException;
-import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Supplier;
@@ -30,7 +29,6 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
-import com.github.steveash.guavate.Guavate;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
@@ -72,28 +70,6 @@ public class MDCBuilder {
private static final Logger LOGGER = LoggerFactory.getLogger(MDCBuilder.class);
- public static class Closeables implements Closeable {
- private final List<Closeable> closeables;
-
- public Closeables(List<Closeable> closeables) {
- Preconditions.checkNotNull(closeables);
- this.closeables = ImmutableList.copyOf(closeables);
- }
-
- @Override
- public void close() throws IOException {
- closeables.forEach(this::closeQuietly);
- }
-
- private void closeQuietly(Closeable closeable) {
- try {
- closeable.close();
- } catch (IOException e) {
- LOGGER.warn("Failed to close Closeable", e);
- }
- }
- }
-
public static MDCBuilder create() {
return new MDCBuilder();
}
@@ -172,12 +148,12 @@ public class MDCBuilder {
@VisibleForTesting
Map<String, String> buildContextMap() {
- return ImmutableMap.<String, String>builder()
- .putAll(nestedBuilder.build()
- .stream()
- .map(MDCBuilder::buildContextMap)
- .flatMap(map -> map.entrySet().stream())
- .collect(Guavate.toImmutableMap(Map.Entry::getKey, Map.Entry::getValue)))
+ ImmutableMap.Builder<String, String> result = ImmutableMap.builder();
+
+ nestedBuilder.build()
+ .forEach(mdcBuilder -> result.putAll(mdcBuilder.buildContextMap()));
+
+ return result
.putAll(contextMap.build())
.build();
}
@@ -191,12 +167,11 @@ public class MDCBuilder {
}
public Closeable build() {
- return new Closeables(
- buildContextMap()
- .entrySet()
- .stream()
- .map(entry -> MDC.putCloseable(entry.getKey(), entry.getValue()))
- .collect(Guavate.toImmutableList()));
+ Map<String, String> contextMap = buildContextMap();
+ contextMap.forEach(MDC::put);
+
+ return () -> contextMap.keySet()
+ .forEach(MDC::remove);
}
}
diff --git a/server/container/util/src/test/java/org/apache/james/util/MDCBuilderTest.java b/server/container/util/src/test/java/org/apache/james/util/MDCBuilderTest.java
index dad7682..bf074fd 100644
--- a/server/container/util/src/test/java/org/apache/james/util/MDCBuilderTest.java
+++ b/server/container/util/src/test/java/org/apache/james/util/MDCBuilderTest.java
@@ -22,15 +22,9 @@ package org.apache.james.util;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatNullPointerException;
-import java.io.Closeable;
-import java.io.IOException;
-
import org.junit.jupiter.api.Test;
-import com.google.common.collect.ImmutableList;
-
class MDCBuilderTest {
-
private static final String KEY_1 = "key1";
private static final String KEY_2 = "key2";
private static final String VALUE_1 = "value1";
@@ -91,51 +85,4 @@ class MDCBuilderTest {
.containsEntry(KEY_1, VALUE_1)
.containsEntry(KEY_2, VALUE_2);
}
-
- @Test
- void closeablesConstructorShouldThrowOnNullList() {
- assertThatNullPointerException()
- .isThrownBy(() -> new MDCBuilder.Closeables(null));
- }
-
- @Test
- void closeablesCloseShouldNotThrowWhenEmpty() throws IOException {
- new MDCBuilder.Closeables(ImmutableList.of())
- .close();
- }
-
- @Test
- void closeablesCloseShouldCallAllUnderlyingCloseables() throws IOException {
- ImmutableList.Builder<String> builder = ImmutableList.builder();
-
- Closeable closeable1 = () -> builder.add(VALUE_1);
- Closeable closeable2 = () -> builder.add(VALUE_2);
-
- new MDCBuilder.Closeables(
- ImmutableList.of(closeable1, closeable2))
- .close();
-
- assertThat(builder.build())
- .containsExactly(VALUE_1, VALUE_2);
- }
-
-
- @Test
- void closeablesCloseShouldCallAllUnderlyingCloseablesWhenError() throws IOException {
- ImmutableList.Builder<String> builder = ImmutableList.builder();
-
- Closeable closeable1 = () -> builder.add(VALUE_1);
- Closeable closeable2 = () -> {
- throw new IOException();
- };
- Closeable closeable3 = () -> builder.add(VALUE_2);
-
- new MDCBuilder.Closeables(
- ImmutableList.of(closeable1, closeable2, closeable3))
- .close();
-
- assertThat(builder.build())
- .containsExactly(VALUE_1, VALUE_2);
- }
-
}
---------------------------------------------------------------------
To unsubscribe, e-mail: notifications-unsubscribe@james.apache.org
For additional commands, e-mail: notifications-help@james.apache.org