You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by am...@apache.org on 2019/12/02 09:28:15 UTC

[ignite] branch master updated: IGNITE-12353 Additional sql benchmarks which covers Date types and inlining usage. This closes #7040.

This is an automated email from the ASF dual-hosted git repository.

amashenkov 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 1599912  IGNITE-12353 Additional sql benchmarks which covers Date types and inlining usage. This closes #7040.
1599912 is described below

commit 1599912004061b1c83ce055739feca156d8e1a48
Author: zstan <st...@gmail.com>
AuthorDate: Mon Dec 2 12:28:03 2019 +0300

    IGNITE-12353 Additional sql benchmarks which covers Date types and inlining usage. This closes #7040.
---
 .../config/benchmark-native-sql-inline.properties  |  85 +++++++++++++
 .../apache/ignite/yardstick/jdbc/JdbcUtils.java    |  77 +++++++++++-
 .../jdbc/NativeSqlMixedDateInlineBenchmark.java    | 139 +++++++++++++++++++++
 3 files changed, 299 insertions(+), 2 deletions(-)

diff --git a/modules/yardstick/config/benchmark-native-sql-inline.properties b/modules/yardstick/config/benchmark-native-sql-inline.properties
new file mode 100644
index 0000000..758d577
--- /dev/null
+++ b/modules/yardstick/config/benchmark-native-sql-inline.properties
@@ -0,0 +1,85 @@
+#
+# 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.
+#
+
+#
+# Contains benchmarks for mixed queries with different inline size usage.
+#
+
+now0=`date +'%H%M%S'`
+
+# JVM options.
+JVM_OPTS=${JVM_OPTS}" -DIGNITE_QUIET=false"
+
+JVM_OPTS=${JVM_OPTS}" \
+-Xms8g \
+-Xmx8g \
+-Xloggc:./gc${now0}.log \
+-XX:+PrintGCDetails \
+-verbose:gc \
+-XX:+UseG1GC \
+-XX:+PrintGCDateStamps \
+"
+
+#Ignite version
+ver="RELEASE-"
+
+# List of default probes.
+# Add DStatProbe or VmStatProbe if your OS supports it (e.g. if running on Linux).
+BENCHMARK_DEFAULT_PROBES=ThroughputLatencyProbe,PercentileProbe,DStatProbe
+
+# Packages where the specified benchmark is searched by reflection mechanism.
+BENCHMARK_PACKAGES=org.yardstickframework,org.apache.ignite.yardstick
+
+# Flag which indicates to restart the servers before every benchmark execution.
+RESTART_SERVERS=true
+
+# Probe point writer class name.
+# BENCHMARK_WRITER=
+
+# The benchmark is applicable only for 1 server and 1 driver
+SERVER_HOSTS=127.0.0.1
+DRIVER_HOSTS=127.0.0.1
+
+# Remote username.
+# REMOTE_USER=
+
+# Number of nodes, used to wait for the specified number of nodes to start.
+nodesNum=$((`echo ${SERVER_HOSTS} | tr ',' '\n' | wc -l` + `echo ${DRIVER_HOSTS} | tr ',' '\n' | wc -l`))
+
+# Backups count.
+b=1
+
+# Warmup.
+w=30
+
+# Duration.
+d=300
+
+# Threads count.
+t=4
+
+# Sync mode.
+sm=PRIMARY_SYNC
+
+# Jobs.
+j=10
+
+# Run configuration which contains all benchmarks.
+# Note that each benchmark is set to run for 300 seconds (5 min) with warm-up set to 60 seconds (1 minute).
+CONFIGS="\
+-cfg ${SCRIPT_DIR}/../config/ignite-localhost-persistence-config.xml -nn ${nodesNum} -b ${b} -w ${w} -d ${d} -t ${t} -sm ${sm} --sqlRange 1 -dn NativeSqlMixedDateInlineBenchmark -sn IgniteNode -ds ${ver}sql-insert-delete-native-r1-${b}-backup -cl,\
+"
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/jdbc/JdbcUtils.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/jdbc/JdbcUtils.java
index 23fd04f..a3927b4 100644
--- a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/jdbc/JdbcUtils.java
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/jdbc/JdbcUtils.java
@@ -17,6 +17,8 @@
 
 package org.apache.ignite.yardstick.jdbc;
 
+import java.math.BigDecimal;
+import java.time.LocalDate;
 import org.apache.ignite.IgniteSemaphore;
 import org.apache.ignite.cache.CacheAtomicityMode;
 import org.apache.ignite.cache.query.SqlFieldsQuery;
@@ -45,8 +47,8 @@ public class JdbcUtils {
             if (sem.tryAcquire()) {
                 println(cfg, "Create table...");
 
-                StringBuilder qry = new StringBuilder("CREATE TABLE test_long (id LONG PRIMARY KEY, val LONG)" +
-                    " WITH \"wrap_value=true");
+                StringBuilder qry =
+                    new StringBuilder("CREATE TABLE test_long (id LONG PRIMARY KEY, val LONG) WITH \"wrap_value=true");
 
                 if (atomicMode != null)
                     qry.append(", atomicity=").append(atomicMode.name());
@@ -88,4 +90,75 @@ public class JdbcUtils {
             sem.release();
         }
     }
+
+    /**
+     * Common method to fill test stand with data.
+     *
+     * @param cfg Benchmark configuration.
+     * @param ignite Ignite instance.
+     * @param tblName Table name for fill and creation.
+     * @param range Data key range.
+     * @param atomicMode Cache creation atomicity mode.
+     */
+    public static void fillTableWithIdx(BenchmarkConfiguration cfg,
+                                        IgniteEx ignite,
+                                        String tblName,
+                                        long range,
+                                        CacheAtomicityMode atomicMode) {
+        IgniteSemaphore sem = ignite.semaphore("sql-setup", 1, true, true);
+
+        try {
+            if (sem.tryAcquire()) {
+                println(cfg, "Create table...");
+
+                StringBuilder qry = new StringBuilder(String.format("CREATE TABLE %s (", tblName) +
+                    "id LONG PRIMARY KEY, " +
+                    "DEC_COL DECIMAL, " +
+                    "DATE_COL DATE, " +
+                    "BIG_INT_COL BIGINT" +
+                    ") WITH \"wrap_value=true");
+
+                if (atomicMode != null)
+                    qry.append(", atomicity=").append(atomicMode.name());
+
+                qry.append("\";");
+
+                String qryStr = qry.toString();
+
+                println(cfg, "Creating table with schema: " + qryStr);
+
+                GridQueryProcessor qProc = ignite.context().query();
+
+                qProc.querySqlFields(new SqlFieldsQuery(qryStr), true);
+
+                println(cfg, "Populate data...");
+
+                for (long r = 1; r < range; ++r) {
+                    qProc.querySqlFields(
+                        new SqlFieldsQuery(String.format("INSERT INTO %s VALUES (?, ?, ?, ?)", tblName))
+                            .setArgs(r, new BigDecimal(r + 1), LocalDate.ofEpochDay(r), r + 2), true);
+
+                    if (r % 10000 == 0)
+                        println(cfg, "Populate " + r);
+                }
+
+                qProc.querySqlFields(new SqlFieldsQuery(String.format("CREATE INDEX idx1 ON %s (DEC_COL, " +
+                    "DATE_COL) inline_size 16", tblName)), true);
+
+                qProc.querySqlFields(new SqlFieldsQuery(String.format("CREATE INDEX idx2 ON %s (DATE_COL, " +
+                    "BIG_INT_COL) inline_size 16", tblName)), true);
+
+                println(cfg, "Finished populating data");
+            }
+            else {
+                // Acquire (wait setup by other client) and immediately release/
+                println(cfg, "Waits for setup...");
+
+                sem.acquire();
+            }
+        }
+        finally {
+            sem.release();
+        }
+    }
 }
diff --git a/modules/yardstick/src/main/java/org/apache/ignite/yardstick/jdbc/NativeSqlMixedDateInlineBenchmark.java b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/jdbc/NativeSqlMixedDateInlineBenchmark.java
new file mode 100644
index 0000000..df263e4
--- /dev/null
+++ b/modules/yardstick/src/main/java/org/apache/ignite/yardstick/jdbc/NativeSqlMixedDateInlineBenchmark.java
@@ -0,0 +1,139 @@
+/*
+ * 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.jdbc;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.ignite.cache.query.FieldsQueryCursor;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.processors.query.GridQueryProcessor;
+import org.apache.ignite.yardstick.IgniteAbstractBenchmark;
+import org.yardstickframework.BenchmarkConfiguration;
+import org.yardstickframework.BenchmarkUtils;
+
+import static org.apache.ignite.yardstick.jdbc.JdbcUtils.fillTableWithIdx;
+
+/**
+ * Native sql benchmark that performs mixed insert/delete/select operations.
+ */
+public class NativeSqlMixedDateInlineBenchmark extends IgniteAbstractBenchmark {
+    /** */
+    private static final String TBL_NAME = NativeSqlMixedDateInlineBenchmark.class.getSimpleName().toUpperCase();
+
+    /** Digit pattern. */
+    private static final Pattern DIGIT_PATTERN = Pattern.compile("[0-9]+");
+
+    /** Dummy counter, just for possible jvm optimisation disable purpose. */
+    private long resCount;
+
+    /** */
+    private Integer getGroupNumber(Map<Object, Object> ctx) {
+        long tid = Thread.currentThread().getId();
+
+        Integer cnt = (Integer)ctx.get(tid);
+
+        if (cnt == null) {
+            Matcher matcher = DIGIT_PATTERN.matcher(Thread.currentThread().getName());
+
+            if (matcher.find()) {
+                cnt = Integer.parseInt(matcher.group());
+
+                ctx.put(tid, ++cnt);
+            }
+        }
+
+        return cnt;
+    }
+
+    /**
+     * Benchmarked action that inserts and immediately deletes row.
+     *
+     * @param ctx Operation context.
+     */
+    @Override public boolean test(Map<Object, Object> ctx) throws Exception {
+        long insertKey = getGroupNumber(ctx) * args.range() + nextRandom(args.range() - 1);
+
+        String insertQry = String.format("INSERT INTO %s VALUES (?, ?, ?, ?)", TBL_NAME);
+
+        SqlFieldsQuery insert1 = new SqlFieldsQuery(insertQry);
+        insert1.setArgs(insertKey, new BigDecimal(insertKey + 1), LocalDate.ofEpochDay(insertKey), insertKey + 2);
+
+        ++insertKey;
+
+        SqlFieldsQuery insert2 = new SqlFieldsQuery(insertQry);
+        insert2.setArgs(insertKey, new BigDecimal(insertKey + 1), LocalDate.ofEpochDay(insertKey), insertKey + 2);
+
+        GridQueryProcessor qryProc = ((IgniteEx)ignite()).context().query();
+
+        long selectKey = nextRandom(args.range());
+
+        SqlFieldsQuery select1 = new SqlFieldsQuery(String.format("select * FROM %s where DATE_COL >= ? " +
+            "and DATE_COL < ? and DEC_COL= ?", TBL_NAME));
+        select1.setArgs(LocalDate.ofEpochDay(selectKey), LocalDate.ofEpochDay(selectKey + 1), selectKey + 1);
+
+        SqlFieldsQuery select2 = new SqlFieldsQuery(String.format("select * FROM %s where DATE_COL = ? " +
+            "and DEC_COL= ?", TBL_NAME));
+        select2.setArgs(LocalDate.ofEpochDay(selectKey), selectKey + 1);
+
+        SqlFieldsQuery delete1 = new SqlFieldsQuery(String.format("DELETE FROM %s WHERE id = ?", TBL_NAME));
+        delete1.setArgs(--insertKey);
+
+        SqlFieldsQuery delete2 = new SqlFieldsQuery(String.format("DELETE FROM %s WHERE DATE_COL = ?", TBL_NAME));
+        delete2.setArgs(LocalDate.ofEpochDay(++insertKey));
+
+        try (FieldsQueryCursor<List<?>> insCur1 = qryProc.querySqlFields(insert1, false);
+             FieldsQueryCursor<List<?>> insCur2 = qryProc.querySqlFields(insert2, false);
+             FieldsQueryCursor<List<?>> selCur1 = qryProc.querySqlFields(select1, false);
+             FieldsQueryCursor<List<?>> selCur2 = qryProc.querySqlFields(select2, false);
+             FieldsQueryCursor<List<?>> delCur1 = qryProc.querySqlFields(delete1, false);
+             FieldsQueryCursor<List<?>> delCur2 = qryProc.querySqlFields(delete2, false)) {
+
+            resCount += insCur1.getAll().size();
+            resCount += insCur2.getAll().size();
+            resCount += selCur1.getAll().size();
+            resCount += selCur2.getAll().size();
+            resCount += delCur1.getAll().size();
+            resCount += delCur2.getAll().size();
+        }
+        catch (Exception e) {
+            BenchmarkUtils.error("error: ", e);
+        }
+
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void setUp(BenchmarkConfiguration cfg) throws Exception {
+        super.setUp(cfg);
+
+        fillTableWithIdx(cfg, (IgniteEx)ignite(), TBL_NAME, args.range(), args.atomicMode());
+    }
+
+    /** {@inheritDoc} */
+    @Override public void tearDown() throws Exception {
+        super.tearDown();
+
+        BenchmarkUtils.println("Summary results: " + resCount);
+    }
+}