You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by al...@apache.org on 2020/09/10 09:30:03 UTC
[ignite] branch master updated: IGNITE-13411 Optimize tracing with
NoopTracingSpi - Fixes #8224.
This is an automated email from the ASF dual-hosted git repository.
alexpl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new 98ca3eb IGNITE-13411 Optimize tracing with NoopTracingSpi - Fixes #8224.
98ca3eb is described below
commit 98ca3ebd07ba98945f69c14524745ececf39a07a
Author: Aleksey Plekhanov <pl...@gmail.com>
AuthorDate: Thu Sep 10 12:25:55 2020 +0300
IGNITE-13411 Optimize tracing with NoopTracingSpi - Fixes #8224.
Signed-off-by: Aleksey Plekhanov <pl...@gmail.com>
---
.../jmh/misc/JmhTracingContextBenchmark.java | 112 +++++++++++++++++++++
.../cache/transactions/IgniteTransactionsImpl.java | 16 +--
.../cache/transactions/TransactionProxyImpl.java | 31 ++++--
.../ignite/internal/processors/tracing/MTC.java | 30 +++---
.../ignite/internal/util/nio/GridNioServer.java | 4 +-
.../tcp/internal/GridNioServerWrapper.java | 27 +++--
.../tcp/internal/InboundConnectionHandler.java | 7 +-
.../apache/ignite/spi/tracing/NoopTracingSpi.java | 2 +
8 files changed, 176 insertions(+), 53 deletions(-)
diff --git a/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/misc/JmhTracingContextBenchmark.java b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/misc/JmhTracingContextBenchmark.java
new file mode 100644
index 0000000..0a65056
--- /dev/null
+++ b/modules/benchmarks/src/main/java/org/apache/ignite/internal/benchmarks/jmh/misc/JmhTracingContextBenchmark.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.benchmarks.jmh.misc;
+
+import java.util.concurrent.TimeUnit;
+import org.apache.ignite.internal.processors.tracing.MTC;
+import org.apache.ignite.internal.processors.tracing.NoopTracing;
+import org.apache.ignite.internal.processors.tracing.Span;
+import org.apache.ignite.internal.processors.tracing.SpanType;
+import org.apache.ignite.internal.processors.tracing.Tracing;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Threads;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+
+/**
+ * Benchmarks {@link MTC} class.
+ */
+@State(Scope.Benchmark)
+@Fork(1)
+@Threads(1)
+@BenchmarkMode(Mode.Throughput)
+@OutputTimeUnit(TimeUnit.MICROSECONDS)
+@Warmup(iterations = 3, time = 2)
+@Measurement(iterations = 3, time = 3)
+public class JmhTracingContextBenchmark {
+ /** Tracing. */
+ Tracing tracing = new NoopTracing();
+
+ /**
+ * Setup.
+ */
+ @Setup(Level.Iteration)
+ public void setup() {
+ MTC.supportInitial(tracing.create(SpanType.TX));
+ }
+
+ /** */
+ @Benchmark
+ public void traceSurroundings(Blackhole bh) {
+ for (int i = 0; i < 100; i++) {
+ try (MTC.TraceSurroundings ts = MTC.support(tracing.create(SpanType.TX_CLOSE, MTC.span()))) {
+ bh.consume(0);
+ }
+ }
+ }
+
+ /** */
+ @Benchmark
+ public void spanThreadLocal() {
+ for (int i = 0; i < 100; i++) {
+ Span span = tracing.create(SpanType.TX);
+ MTC.supportInitial(span);
+ MTC.span().addTag("isolation", () -> "isolation");
+ MTC.span().addTag("concurrency", () -> "concurrency");
+ MTC.span().addTag("timeout", () -> "timeout");
+ MTC.span().addTag("label", () -> "label");
+ }
+ }
+
+ /** */
+ @Benchmark
+ public void spanCached() {
+ for (int i = 0; i < 100; i++) {
+ Span span = tracing.create(SpanType.TX);
+ MTC.supportInitial(span);
+ span.addTag("isolation", () -> "isolation");
+ span.addTag("concurrency", () -> "concurrency");
+ span.addTag("timeout", () -> "timeout");
+ span.addTag("label", () -> "label");
+ }
+ }
+
+ /**
+ * @param args Args.
+ * @throws Exception Exception.
+ */
+ public static void main(String[] args) throws Exception {
+ final Options options = new OptionsBuilder()
+ .include(JmhTracingContextBenchmark.class.getSimpleName())
+ .build();
+
+ new Runner(options).run();
+ }
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTransactionsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTransactionsImpl.java
index b6ce2a0..33d80ce 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTransactionsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTransactionsImpl.java
@@ -25,6 +25,7 @@ import org.apache.ignite.internal.processors.cache.GridCacheContext;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal;
import org.apache.ignite.internal.processors.tracing.MTC;
+import org.apache.ignite.internal.processors.tracing.Span;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.internal.A;
import org.apache.ignite.internal.util.typedef.internal.CU;
@@ -167,17 +168,16 @@ public class IgniteTransactionsImpl<K, V> implements IgniteTransactionsEx {
) {
cctx.kernalContext().gateway().readLock();
- MTC.supportInitial(cctx.kernalContext().tracing().create(
- TX,
- null,
- lb));
+ Span span = cctx.kernalContext().tracing().create(TX, null, lb);
- MTC.span().addTag("isolation", isolation::name);
- MTC.span().addTag("concurrency", concurrency::name);
- MTC.span().addTag("timeout", () -> String.valueOf(timeout));
+ MTC.supportInitial(span);
+
+ span.addTag("isolation", isolation::name);
+ span.addTag("concurrency", concurrency::name);
+ span.addTag("timeout", () -> String.valueOf(timeout));
if (lb != null)
- MTC.span().addTag("label", () -> lb);
+ span.addTag("label", () -> lb);
try {
GridNearTxLocal tx = cctx.tm().userTx(sysCacheCtx);
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TransactionProxyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TransactionProxyImpl.java
index d9d6839..3cc390e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TransactionProxyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/TransactionProxyImpl.java
@@ -29,6 +29,7 @@ import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal;
import org.apache.ignite.internal.processors.tracing.MTC;
+import org.apache.ignite.internal.processors.tracing.Span;
import org.apache.ignite.internal.util.future.IgniteFinishedFutureImpl;
import org.apache.ignite.internal.util.future.IgniteFutureImpl;
import org.apache.ignite.internal.util.tostring.GridToStringExclude;
@@ -305,8 +306,10 @@ public class TransactionProxyImpl<K, V> implements TransactionProxy, Externaliza
/** {@inheritDoc} */
@Override public void commit() {
+ Span span = MTC.span();
+
try (TraceSurroundings ignored =
- MTC.support(cctx.kernalContext().tracing().create(TX_COMMIT, MTC.span()))) {
+ MTC.support(cctx.kernalContext().tracing().create(TX_COMMIT, span))) {
enter();
try {
@@ -325,14 +328,16 @@ public class TransactionProxyImpl<K, V> implements TransactionProxy, Externaliza
}
}
finally {
- MTC.span().end();
+ span.end();
}
}
/** {@inheritDoc} */
@Override public IgniteFuture<Void> commitAsync() throws IgniteException {
+ Span span = MTC.span();
+
try (TraceSurroundings ignored =
- MTC.support(cctx.kernalContext().tracing().create(TX_COMMIT, MTC.span()))) {
+ MTC.support(cctx.kernalContext().tracing().create(TX_COMMIT, span))) {
enter();
try {
@@ -343,14 +348,16 @@ public class TransactionProxyImpl<K, V> implements TransactionProxy, Externaliza
}
}
finally {
- MTC.span().end();
+ span.end();
}
}
/** {@inheritDoc} */
@Override public void close() {
+ Span span = MTC.span();
+
try (TraceSurroundings ignored =
- MTC.support(cctx.kernalContext().tracing().create(TX_CLOSE, MTC.span()))) {
+ MTC.support(cctx.kernalContext().tracing().create(TX_CLOSE, span))) {
enter();
try {
@@ -364,14 +371,16 @@ public class TransactionProxyImpl<K, V> implements TransactionProxy, Externaliza
}
}
finally {
- MTC.span().end();
+ span.end();
}
}
/** {@inheritDoc} */
@Override public void rollback() {
+ Span span = MTC.span();
+
try (TraceSurroundings ignored =
- MTC.support(cctx.kernalContext().tracing().create(TX_ROLLBACK, MTC.span()))) {
+ MTC.support(cctx.kernalContext().tracing().create(TX_ROLLBACK, span))) {
enter();
try {
@@ -390,14 +399,16 @@ public class TransactionProxyImpl<K, V> implements TransactionProxy, Externaliza
}
}
finally {
- MTC.span().end();
+ span.end();
}
}
/** {@inheritDoc} */
@Override public IgniteFuture<Void> rollbackAsync() throws IgniteException {
+ Span span = MTC.span();
+
try (TraceSurroundings ignored =
- MTC.support(cctx.kernalContext().tracing().create(TX_ROLLBACK, MTC.span()))) {
+ MTC.support(cctx.kernalContext().tracing().create(TX_ROLLBACK, span))) {
enter();
try {
@@ -408,7 +419,7 @@ public class TransactionProxyImpl<K, V> implements TransactionProxy, Externaliza
}
}
finally {
- MTC.span().end();
+ span.end();
}
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java
index 8e4457f..eb35d9f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/tracing/MTC.java
@@ -18,8 +18,6 @@ package org.apache.ignite.internal.processors.tracing;
import org.jetbrains.annotations.NotNull;
-import static org.apache.ignite.internal.processors.tracing.MTC.TraceSurroundings.NOOP_UNCLOSED_SURROUNDINGS;
-
/**
* Mapped tracing context.
*
@@ -40,22 +38,21 @@ public class MTC {
}
/**
- * Attach given span to current thread if it isn't null or attach empty span if it is null. Detach given span, close
+ * Attach given span to current thread if it isn't null or NOOP_SPAN. Detach given span, close
* it and return previous span when {@link TraceSurroundings#close()} would be called.
*
* @param startSpan Span which should be added to current thread.
- * @return {@link TraceSurroundings} for manage span life cycle.
+ * @return {@link TraceSurroundings} for manage span life cycle or null in case of null or no-op span.
*/
public static TraceSurroundings support(Span startSpan) {
+ if (startSpan == null || startSpan == NOOP_SPAN)
+ return null;
+
Span oldSpan = span();
- if (startSpan != null && startSpan != NOOP_SPAN) {
- span.set(startSpan);
+ span.set(startSpan);
- return new TraceSurroundings(oldSpan, true);
- }
- else
- return oldSpan == NOOP_SPAN ? NOOP_UNCLOSED_SURROUNDINGS : new TraceSurroundings(oldSpan, false);
+ return new TraceSurroundings(oldSpan, true);
}
/**
@@ -68,16 +65,18 @@ public class MTC {
}
/**
- * Attach given span to current thread if it isn't null or attach empty span if it is null.
+ * Attach given span to current thread if it isn't null or NOOP_SPAN.
*
* @param startSpan Span which should be added to current thread.
- * @return {@link TraceSurroundings} for manage span life cycle.
+ * @return {@link TraceSurroundings} for manage span life cycle or null in case of null or no-op span.
*/
public static TraceSurroundings supportContinual(Span startSpan) {
+ if (startSpan == null || startSpan == NOOP_SPAN)
+ return null;
+
Span oldSpan = span();
- if (startSpan != null && startSpan != NOOP_SPAN)
- span.set(startSpan);
+ span.set(startSpan);
return new TraceSurroundings(oldSpan, false);
}
@@ -93,9 +92,6 @@ public class MTC {
/** {@code true} if current span should be ended at close moment. */
private final boolean endRequired;
- /** Precreated instance of current class for performance target. */
- static final TraceSurroundings NOOP_UNCLOSED_SURROUNDINGS = new TraceSurroundings(NOOP_SPAN, false);
-
/**
* @param oldSpan Old span for restoring after close.
* @param endRequired {@code true} if current span should be ended at close moment.
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
index bfae1f7..7faeeda 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
@@ -1572,7 +1572,7 @@ public class GridNioServer<T> {
Span span = tracing.create(SpanType.COMMUNICATION_SOCKET_WRITE, req.span());
try (TraceSurroundings ignore = span.equals(NoopSpan.INSTANCE) ? null : MTC.support(span)) {
- MTC.span().addTag(SpanTags.MESSAGE, () -> traceName(msg));
+ span.addTag(SpanTags.MESSAGE, () -> traceName(msg));
assert msg != null;
@@ -1753,7 +1753,7 @@ public class GridNioServer<T> {
Span span = tracing.create(SpanType.COMMUNICATION_SOCKET_WRITE, req.span());
try (TraceSurroundings ignore = span.equals(NoopSpan.INSTANCE) ? null : MTC.support(span)) {
- MTC.span().addTag(SpanTags.MESSAGE, () -> traceName(msg));
+ span.addTag(SpanTags.MESSAGE, () -> traceName(msg));
if (writer != null)
writer.setCurrentWriteClass(msg.getClass());
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java
index d8a5ba3..33f8c49 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/GridNioServerWrapper.java
@@ -26,9 +26,11 @@ import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.channels.Channel;
import java.nio.channels.SocketChannel;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
+import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
@@ -46,6 +48,8 @@ import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.IgniteTooManyOpenFilesException;
import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException;
+import org.apache.ignite.internal.managers.GridManager;
+import org.apache.ignite.internal.managers.tracing.GridTracingManager;
import org.apache.ignite.internal.processors.metric.GridMetricManager;
import org.apache.ignite.internal.processors.timeout.GridSpiTimeoutObject;
import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
@@ -875,7 +879,13 @@ public class GridNioServerWrapper {
IgniteBiInClosure<GridNioSession, Integer> queueSizeMonitor =
!clientMode && cfg.slowClientQueueLimit() > 0 ? this::checkClientQueueSize : null;
- GridNioFilter[] filters;
+ List<GridNioFilter> filters = new ArrayList<>();
+
+ if (tracing instanceof GridTracingManager && ((GridManager)tracing).enabled())
+ filters.add(new GridNioTracerFilter(log, tracing));
+
+ filters.add(new GridNioCodecFilter(parser, log, true));
+ filters.add(new GridConnectionBytesVerifyFilter(log));
if (stateProvider.isSslEnabled()) {
GridNioSslFilter sslFilter =
@@ -887,19 +897,8 @@ public class GridNioServerWrapper {
sslFilter.wantClientAuth(true);
sslFilter.needClientAuth(true);
- filters = new GridNioFilter[] {
- new GridNioTracerFilter(log, tracing),
- new GridNioCodecFilter(parser, log, true),
- new GridConnectionBytesVerifyFilter(log),
- sslFilter
- };
+ filters.add(sslFilter);
}
- else
- filters = new GridNioFilter[] {
- new GridNioTracerFilter(log, tracing),
- new GridNioCodecFilter(parser, log, true),
- new GridConnectionBytesVerifyFilter(log)
- };
GridNioServer.Builder<Message> builder = GridNioServer.<Message>builder()
.address(cfg.localHost())
@@ -918,7 +917,7 @@ public class GridNioServerWrapper {
.directMode(true)
.writeTimeout(cfg.socketWriteTimeout())
.selectorSpins(cfg.selectorSpins())
- .filters(filters)
+ .filters(filters.toArray(new GridNioFilter[filters.size()]))
.writerFactory(writerFactory)
.skipRecoveryPredicate(skipRecoveryPred)
.messageQueueSizeListener(queueSizeMonitor)
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/InboundConnectionHandler.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/InboundConnectionHandler.java
index a5b5918..4bc69ae 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/InboundConnectionHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/internal/InboundConnectionHandler.java
@@ -32,6 +32,7 @@ import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.managers.discovery.IgniteDiscoverySpi;
import org.apache.ignite.internal.processors.failure.FailureProcessor;
import org.apache.ignite.internal.processors.tracing.MTC;
+import org.apache.ignite.internal.processors.tracing.Span;
import org.apache.ignite.internal.processors.tracing.SpanTags;
import org.apache.ignite.internal.util.future.GridFutureAdapter;
import org.apache.ignite.internal.util.nio.GridCommunicationClient;
@@ -263,8 +264,10 @@ public class InboundConnectionHandler extends GridNioServerListenerAdapter<Messa
/** {@inheritDoc} */
@Override public void onMessage(final GridNioSession ses, Message msg) {
- MTC.span().addLog(() -> "Communication received");
- MTC.span().addTag(SpanTags.MESSAGE, () -> traceName(msg));
+ Span span = MTC.span();
+
+ span.addLog(() -> "Communication received");
+ span.addTag(SpanTags.MESSAGE, () -> traceName(msg));
ConnectionKey connKey = ses.meta(CONN_IDX_META);
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/tracing/NoopTracingSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/tracing/NoopTracingSpi.java
index 9ddb63d..c12714b 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/tracing/NoopTracingSpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/tracing/NoopTracingSpi.java
@@ -22,12 +22,14 @@ import org.apache.ignite.spi.IgniteSpiAdapter;
import org.apache.ignite.spi.IgniteSpiConsistencyChecked;
import org.apache.ignite.spi.IgniteSpiException;
import org.apache.ignite.spi.IgniteSpiMultipleInstancesSupport;
+import org.apache.ignite.spi.IgniteSpiNoop;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* Noop and null-safe implementation of Tracing SPI.
*/
+@IgniteSpiNoop
@IgniteSpiMultipleInstancesSupport(value = true)
@IgniteSpiConsistencyChecked(optional = true)
public class NoopTracingSpi extends IgniteSpiAdapter implements TracingSpi<NoopSpiSpecificSpan> {