You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2015/11/24 12:42:26 UTC

[07/25] ignite git commit: ignite-yardstick: added debug info into IgniteTransactionalWriteInvokeBenchmark

ignite-yardstick: added debug info into IgniteTransactionalWriteInvokeBenchmark


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/fa7a4bce
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/fa7a4bce
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/fa7a4bce

Branch: refs/heads/ignite-1282
Commit: fa7a4bce65421da4f86c72e78850d987278f8e8f
Parents: d71f612
Author: ashutak <as...@gridgain.com>
Authored: Mon Nov 23 16:26:29 2015 +0300
Committer: ashutak <as...@gridgain.com>
Committed: Mon Nov 23 16:26:29 2015 +0300

----------------------------------------------------------------------
 .../IgniteAtomicInvokeRetryBenchmark.java       |   2 +-
 .../failover/IgniteConsistencyException.java    |  64 +++++++++
 ...IgniteTransactionalInvokeRetryBenchmark.java |   2 +-
 ...IgniteTransactionalWriteInvokeBenchmark.java | 135 ++++++++++++++-----
 .../IgniteTransactionalWriteReadBenchmark.java  |   2 +-
 5 files changed, 171 insertions(+), 34 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/fa7a4bce/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteAtomicInvokeRetryBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteAtomicInvokeRetryBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteAtomicInvokeRetryBenchmark.java
index c0567ef..6e65746 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteAtomicInvokeRetryBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteAtomicInvokeRetryBenchmark.java
@@ -110,7 +110,7 @@ public class IgniteAtomicInvokeRetryBenchmark extends IgniteFailoverAbstractBenc
 
                                 }
 
-                                throw new IllegalStateException("Cache and local map are in inconsistent state " +
+                                throw new IgniteConsistencyException("Cache and local map are in inconsistent state " +
                                     "[badKeys=" + badCacheEntries.keySet() + ']');
                             }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/fa7a4bce/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteConsistencyException.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteConsistencyException.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteConsistencyException.java
new file mode 100644
index 0000000..e1fcbfa
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteConsistencyException.java
@@ -0,0 +1,64 @@
+/*
+ * 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.yardstick.cache.failover;
+
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Ignite consistency exception.
+ */
+public class IgniteConsistencyException extends RuntimeException {
+    /** */
+    private static final long serialVersionUID = 0;
+
+    /**
+     * Create empty exception.
+     */
+    public IgniteConsistencyException() {
+        // No-op.
+    }
+
+    /**
+     * Creates new exception with given error message.
+     *
+     * @param msg Error message.
+     */
+    public IgniteConsistencyException(String msg) {
+        super(msg);
+    }
+
+    /**
+     * Creates new grid exception with given throwable as a cause and
+     * source of error message.
+     *
+     * @param cause Non-null throwable cause.
+     */
+    public IgniteConsistencyException(Throwable cause) {
+        this(cause.getMessage(), cause);
+    }
+
+    /**
+     * Creates new exception with given error message and optional nested exception.
+     *
+     * @param msg Error message.
+     * @param cause Optional nested exception (can be {@code null}).
+     */
+    public IgniteConsistencyException(String msg, @Nullable Throwable cause) {
+        super(msg, cause);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/fa7a4bce/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalInvokeRetryBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalInvokeRetryBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalInvokeRetryBenchmark.java
index f8a1689..16b0959 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalInvokeRetryBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalInvokeRetryBenchmark.java
@@ -122,7 +122,7 @@ public class IgniteTransactionalInvokeRetryBenchmark extends IgniteFailoverAbstr
                                     }
                                 }
 
-                                throw new IllegalStateException("Cache and local map are in inconsistent state.");
+                                throw new IgniteConsistencyException("Cache and local map are in inconsistent state.");
                             }
 
                             println("Cache validation successfully finished in "

http://git-wip-us.apache.org/repos/asf/ignite/blob/fa7a4bce/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalWriteInvokeBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalWriteInvokeBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalWriteInvokeBenchmark.java
index 2c4050b..a52ea78 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalWriteInvokeBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalWriteInvokeBenchmark.java
@@ -17,14 +17,25 @@
 
 package org.apache.ignite.yardstick.cache.failover;
 
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Callable;
 import javax.cache.processor.EntryProcessorException;
 import javax.cache.processor.MutableEntry;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteDataStreamer;
 import org.apache.ignite.cache.CacheEntryProcessor;
+import org.apache.ignite.cache.affinity.Affinity;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.internal.IgniteKernal;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
+import org.apache.ignite.internal.util.typedef.F;
+import org.yardstickframework.BenchmarkConfiguration;
 
 import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
 import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
@@ -44,12 +55,40 @@ import static org.yardstickframework.BenchmarkUtils.println;
  * </ul>
  */
 public class IgniteTransactionalWriteInvokeBenchmark extends IgniteFailoverAbstractBenchmark<String, Long> {
+    /** */
+    private static final Long INITIAL_VALUE = 1L;
+
     /** {@inheritDoc} */
-    @Override public boolean test(Map<Object, Object> ctx) throws Exception {
-        final int k = nextRandom(args.range());
+    @Override public void setUp(BenchmarkConfiguration cfg) throws Exception {
+        super.setUp(cfg);
 
         assert args.keysCount() > 0 : "Count of keys: " + args.keysCount();
 
+        println(cfg, "Populating data...");
+
+        long start = System.nanoTime();
+
+        if (cfg.memberId() == 0) {
+            try (IgniteDataStreamer<String, Long> dataLdr = ignite().dataStreamer(cacheName())) {
+                for (int k = 0; k < args.range() && !Thread.currentThread().isInterrupted(); k++) {
+                    dataLdr.addData("key-" + k + "-master", INITIAL_VALUE);
+
+                    for (int i = 0; i < args.keysCount(); i++)
+                        dataLdr.addData("key-" + k + "-" + i, INITIAL_VALUE);
+
+                    if (k % 100000 == 0)
+                        println(cfg, "Populated accounts: " + k);
+                }
+            }
+        }
+
+        println(cfg, "Finished populating data in " + ((System.nanoTime() - start) / 1_000_000) + " ms.");
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean test(Map<Object, Object> ctx) throws Exception {
+        final int k = nextRandom(args.range());
+
         final String[] keys = new String[args.keysCount()];
 
         final String masterKey = "key-" + k + "-master";
@@ -59,8 +98,10 @@ public class IgniteTransactionalWriteInvokeBenchmark extends IgniteFailoverAbstr
 
         final int scenario = nextRandom(2);
 
-        return doInTransaction(ignite().transactions(), PESSIMISTIC, REPEATABLE_READ, new Callable<Boolean>() {
-            @Override public Boolean call() throws Exception {
+        final Set<String> badKeys = new LinkedHashSet<>();
+
+        doInTransaction(ignite().transactions(), PESSIMISTIC, REPEATABLE_READ, new Callable<Void>() {
+            @Override public Void call() throws Exception {
                 final int timeout = args.cacheOperationTimeoutMillis();
 
                 switch (scenario) {
@@ -81,46 +122,40 @@ public class IgniteTransactionalWriteInvokeBenchmark extends IgniteFailoverAbstr
 
                         Set<Long> values = new HashSet<>(map.values());
 
-                        if (values.size() != 1) {
-                            // Print all usefull information and finish.
-                            println(cfg, "Got different values for keys [map=" + map + "]");
-
-                            println(cfg, "Cache content:");
-
-                            for (int k = 0; k < args.range(); k++) {
-                                for (int i = 0; i < args.keysCount(); i++) {
-                                    String key = "key-" + k + "-" + i;
-
-                                    asyncCache.get(key);
-                                    Long val = asyncCache.<Long>future().get(timeout);
-
-                                    if (val != null)
-                                        println(cfg, "Entry [key=" + key + ", val=" + val + "]");
-                                }
-                            }
-
-                            throw new IllegalStateException("Found different values for keys (see above information).");
-                        }
+                        if (values.size() != 1)
+                            throw new IgniteConsistencyException("Found different values for keys [map="+map+"]");
 
                         break;
                     case 1: // Invoke scenario.
                         asyncCache.get(masterKey);
                         Long val = asyncCache.<Long>future().get(timeout);
 
-                        asyncCache.put(masterKey, val == null ? 0 : val + 1);
+                        if (val == null)
+                            badKeys.add(masterKey);
+
+                        asyncCache.put(masterKey, val == null ? -1 : val + 1);
                         asyncCache.future().get(timeout);
 
                         for (String key : keys) {
-                            asyncCache.invoke(key, new IncrementCacheEntryProcessor());
-                            asyncCache.future().get(timeout);
+                            asyncCache.invoke(key, new IncrementCacheEntryProcessor(), cacheName());
+                            Object o = asyncCache.future().get(timeout);
+
+                            if (o != null)
+                                badKeys.add(key);
                         }
 
                         break;
                 }
 
-                return true;
+                return null;
             }
         });
+
+        if (!F.isEmpty(badKeys))
+            throw new IgniteConsistencyException("Found unexpected null-value(s) for the following " +
+                "key(s) (look for debug information on server nodes): " + badKeys);
+
+        return true;
     }
 
     /** {@inheritDoc} */
@@ -130,14 +165,52 @@ public class IgniteTransactionalWriteInvokeBenchmark extends IgniteFailoverAbstr
 
     /**
      */
-    private static class IncrementCacheEntryProcessor implements CacheEntryProcessor<String, Long, Void> {
+    private static class IncrementCacheEntryProcessor implements CacheEntryProcessor<String, Long, Object> {
         /** */
         private static final long serialVersionUID = 0;
 
         /** {@inheritDoc} */
-        @Override public Void process(MutableEntry<String, Long> entry,
+        @Override public Object process(MutableEntry<String, Long> entry,
             Object... arguments) throws EntryProcessorException {
-            entry.setValue(entry.getValue() == null ? 0 : entry.getValue() + 1);
+            if (entry.getValue() == null) {
+                String cacheName = (String)arguments[0];
+
+                IgniteKernal kernal = (IgniteKernal)entry.unwrap(Ignite.class);
+
+                Affinity<String> aff = kernal.affinity(cacheName);
+
+                final int partIdx = aff.partition(entry.getKey());
+
+                final Collection<ClusterNode> nodes = aff.mapKeyToPrimaryAndBackups(entry.getKey());
+
+                List<GridDhtLocalPartition> locPartitions = kernal.cachex(cacheName).context().topology().
+                    localPartitions();
+
+                GridDhtLocalPartition part = null;
+
+                for (GridDhtLocalPartition p : locPartitions) {
+                    if (p.id() == partIdx) {
+                        part = p;
+
+                        break;
+                    }
+                }
+
+                kernal.log().warning("Found unexpected null-value, debug info:"
+                        + "\n    entry=" + entry
+                        + "\n    key=" + entry.getKey()
+                        + "\n    locNodeId=" + kernal.cluster().localNode().id()
+                        + "\n    primaryAndBackupsNodes=" + nodes
+                        + "\n    part=" + part
+                        + "\n    partIdx=" + partIdx
+                        + "\n    locParts=" + locPartitions
+                        + "\n    allPartMap=" + kernal.cachex(cacheName).context().topology().partitionMap(true)
+                );
+
+                return new Object(); // non-null value.
+            }
+
+            entry.setValue(entry.getValue() + 1);
 
             return null;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/fa7a4bce/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalWriteReadBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalWriteReadBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalWriteReadBenchmark.java
index f278e8a..c4314ed 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalWriteReadBenchmark.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/cache/failover/IgniteTransactionalWriteReadBenchmark.java
@@ -80,7 +80,7 @@ public class IgniteTransactionalWriteReadBenchmark extends IgniteFailoverAbstrac
                         }
                     }
 
-                    throw new IllegalStateException("Found different values for keys (see above information).");
+                    throw new IgniteConsistencyException("Found different values for keys (see above information).");
                 }
 
                 final Long oldVal = map.get(keys[0]);