ignite-gg-11181 - scanCount with offheap index fix
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a0c6ae54 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a0c6ae54 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a0c6ae54 Branch: refs/heads/ignite-3216 Commit: a0c6ae542cdc1f885b038beef168a35b14e23ad5 Parents: e409b67 Author: Sergi Vladykin <sergi.vlady...@gmail.com> Authored: Mon Jun 6 00:14:05 2016 +0300 Committer: Sergi Vladykin <sergi.vlady...@gmail.com> Committed: Mon Jun 6 00:14:05 2016 +0300 ---------------------------------------------------------------------- .../unsafe/GridOffheapSnapTreeSelfTest.java | 2 +- .../query/h2/opt/GridH2AbstractKeyValueRow.java | 23 +-- .../query/h2/opt/GridH2KeyValueRowOffheap.java | 17 +- .../cache/IgniteCacheOffheapIndexScanTest.java | 195 +++++++++++++++++++ .../IgniteCacheQuerySelfTestSuite.java | 2 + 5 files changed, 226 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/a0c6ae54/modules/core/src/test/java/org/apache/ignite/internal/util/offheap/unsafe/GridOffheapSnapTreeSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/internal/util/offheap/unsafe/GridOffheapSnapTreeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/util/offheap/unsafe/GridOffheapSnapTreeSelfTest.java index 463b6dc..92d9ec2 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/util/offheap/unsafe/GridOffheapSnapTreeSelfTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/util/offheap/unsafe/GridOffheapSnapTreeSelfTest.java @@ -313,7 +313,7 @@ public class GridOffheapSnapTreeSelfTest extends GridCommonAbstractTest { } @Override public int hashCode() { - return ptr; + throw new IllegalStateException(); } @Override public String toString() { http://git-wip-us.apache.org/repos/asf/ignite/blob/a0c6ae54/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java index ca5442a..fe6851d 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2AbstractKeyValueRow.java @@ -351,41 +351,37 @@ public abstract class GridH2AbstractKeyValueRow extends GridH2Row { /** {@inheritDoc} */ @Override public void setKeyAndVersion(SearchRow old) { - assert false; + throw new IllegalStateException(); } /** {@inheritDoc} */ @Override public void setKey(long key) { - assert false; + throw new IllegalStateException(); } /** {@inheritDoc} */ @Override public Row getCopy() { - assert false; - - return null; + throw new IllegalStateException(); } /** {@inheritDoc} */ @Override public void setDeleted(boolean deleted) { - assert false; + throw new IllegalStateException(); } /** {@inheritDoc} */ @Override public long getKey() { - assert false; - - return 0; + throw new IllegalStateException(); } /** {@inheritDoc} */ @Override public void setSessionId(int sesId) { - assert false; + throw new IllegalStateException(); } /** {@inheritDoc} */ @Override public void setVersion(int ver) { - assert false; + throw new IllegalStateException(); } /** @@ -469,4 +465,9 @@ public abstract class GridH2AbstractKeyValueRow extends GridH2Row { throw new IllegalStateException(); } } + + /** {@inheritDoc} */ + @Override public final int hashCode() { + throw new IllegalStateException(); + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/a0c6ae54/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOffheap.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOffheap.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOffheap.java index 2dd9f25..ee68431 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOffheap.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2KeyValueRowOffheap.java @@ -170,7 +170,7 @@ public class GridH2KeyValueRowOffheap extends GridH2AbstractKeyValueRow { } } else - assert false : col; + throw new IllegalStateException("Column: " + col); Data data = Data.create(null, bytes); @@ -378,4 +378,19 @@ public class GridH2KeyValueRowOffheap extends GridH2AbstractKeyValueRow { @Override protected void addOffheapRowId(SB sb) { sb.a('-').a(ptr); } + + /** {@inheritDoc} */ + @Override public boolean equals(Object obj) { + if (this == obj) + return true; + + if (obj instanceof GridH2KeyValueRowOffheap) { + GridH2KeyValueRowOffheap row = (GridH2KeyValueRowOffheap)obj; + + if (pointer() == row.pointer()) + return true; + } + + return false; + } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/a0c6ae54/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapIndexScanTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapIndexScanTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapIndexScanTest.java new file mode 100644 index 0000000..dbc8a65 --- /dev/null +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapIndexScanTest.java @@ -0,0 +1,195 @@ +/* + * 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.processors.cache; + +import java.io.Serializable; +import java.util.concurrent.Callable; +import java.util.concurrent.atomic.AtomicBoolean; +import org.apache.ignite.IgniteCache; +import org.apache.ignite.cache.CacheMemoryMode; +import org.apache.ignite.cache.query.SqlFieldsQuery; +import org.apache.ignite.cache.query.annotations.QuerySqlField; +import org.apache.ignite.configuration.CacheConfiguration; +import org.apache.ignite.configuration.IgniteConfiguration; +import org.apache.ignite.internal.IgniteInternalFuture; +import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi; +import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder; +import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder; +import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest; + +import static org.apache.ignite.cache.CacheMode.LOCAL; + +/** + * Based scanCount with offheap index issue. + */ +public class IgniteCacheOffheapIndexScanTest extends GridCommonAbstractTest { + /** */ + private static TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true); + + /** */ + private static IgniteCache<Integer, Object> cache; + + /** {@inheritDoc} */ + @Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception { + IgniteConfiguration cfg = super.getConfiguration(gridName); + + TcpDiscoverySpi disco = new TcpDiscoverySpi(); + + disco.setIpFinder(ipFinder); + + cfg.setDiscoverySpi(disco); + + CacheConfiguration<?,?> cacheCfg = new CacheConfiguration<>(); + + cacheCfg.setCacheMode(LOCAL); + cacheCfg.setMemoryMode(CacheMemoryMode.OFFHEAP_TIERED); + cacheCfg.setSqlOnheapRowCacheSize(256); + cacheCfg.setIndexedTypes( + Integer.class, Person.class + ); + + cfg.setCacheConfiguration(cacheCfg); + + return cfg; + } + + /** {@inheritDoc} */ + @Override protected void beforeTestsStarted() throws Exception { + startGridsMultiThreaded(1, false); + + cache = grid(0).cache(null); + } + + /** {@inheritDoc} */ + @Override protected void afterTestsStopped() throws Exception { + stopAllGrids(); + } + + /** + * @throws Exception If failed. + */ + public void testQueryPlan() throws Exception { + for (int i = 0 ; i < 1000; i++) + cache.put(i, new Person(i, "firstName" + i, "lastName" + i, i % 100)); + + final AtomicBoolean end = new AtomicBoolean(); + + IgniteInternalFuture<?> fut = multithreadedAsync(new Callable<Void>() { + @Override public Void call() throws Exception { + while(!end.get()) + cache.query(new SqlFieldsQuery("select _val from Person")).getAll(); + + return null; + } + }, 5); + + for (int i = 0; i < 150; i++) { + String plan = (String)cache.query(new SqlFieldsQuery( + "explain analyze select count(*) from Person where salary = 50")).getAll().get(0).get(0); + + assertTrue(plan, plan.contains("scanCount: 11 ")); + + Thread.sleep(100); + } + + end.set(true); + + fut.get(); + } + + /** + * Person record used for query test. + */ + public static class Person implements Serializable { + /** Person ID. */ + @QuerySqlField(index = true) + private int id; + + /** Organization ID. */ + @QuerySqlField(index = true) + private int orgId; + + /** First name (not-indexed). */ + @QuerySqlField + private String firstName; + + /** Last name (not indexed). */ + @QuerySqlField + private String lastName; + + /** Salary. */ + @QuerySqlField(index = true) + private double salary; + + /** + * Constructs empty person. + */ + public Person() { + // No-op. + } + + /** + * Constructs person record that is not linked to any organization. + * + * @param id Person ID. + * @param firstName First name. + * @param lastName Last name. + * @param salary Salary. + */ + public Person(int id, String firstName, String lastName, double salary) { + this(id, 0, firstName, lastName, salary); + } + + /** + * Constructs person record. + * + * @param id Person ID. + * @param orgId Organization ID. + * @param firstName First name. + * @param lastName Last name. + * @param salary Salary. + */ + public Person(int id, int orgId, String firstName, String lastName, double salary) { + this.id = id; + this.orgId = orgId; + this.firstName = firstName; + this.lastName = lastName; + this.salary = salary; + } + + /** {@inheritDoc} */ + @Override public boolean equals(Object o) { + return this == o || (o instanceof Person) && id == ((Person)o).id; + } + + /** {@inheritDoc} */ + @Override public int hashCode() { + return id; + } + + /** {@inheritDoc} */ + @Override public String toString() { + return "Person [firstName=" + firstName + + ", id=" + id + + ", orgId=" + orgId + + ", lastName=" + lastName + + ", salary=" + salary + + ']'; + } + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/ignite/blob/a0c6ae54/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java index 3c0e424..c82fd79 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java +++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java @@ -29,6 +29,7 @@ import org.apache.ignite.internal.processors.cache.IgniteCacheCollocatedQuerySel import org.apache.ignite.internal.processors.cache.IgniteCacheDuplicateEntityConfigurationSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheLargeResultSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheOffheapEvictQueryTest; +import org.apache.ignite.internal.processors.cache.IgniteCacheOffheapIndexScanTest; import org.apache.ignite.internal.processors.cache.IgniteCacheOffheapTieredMultithreadedSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCachePartitionedQueryMultiThreadedSelfTest; import org.apache.ignite.internal.processors.cache.IgniteCacheQueryEvictsMultiThreadedSelfTest; @@ -100,6 +101,7 @@ public class IgniteCacheQuerySelfTestSuite extends TestSuite { suite.addTestSuite(IgniteCacheOffheapEvictQueryTest.class); suite.addTestSuite(IgniteCacheSqlQueryMultiThreadedSelfTest.class); suite.addTestSuite(IgniteCacheOffheapTieredMultithreadedSelfTest.class); + suite.addTestSuite(IgniteCacheOffheapIndexScanTest.class); suite.addTestSuite(IgniteCacheQueryNodeRestartSelfTest.class); suite.addTestSuite(IgniteCacheQueryNodeRestartSelfTest2.class); suite.addTestSuite(IgniteCacheClientQueryReplicatedNodeRestartSelfTest.class);