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> {