You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dp...@apache.org on 2019/08/21 08:57:04 UTC
[ignite] branch ignite-2.7.6 updated: IGNITE-12061 Fix inline size
change. - Fixes #6795.
This is an automated email from the ASF dual-hosted git repository.
dpavlov pushed a commit to branch ignite-2.7.6
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/ignite-2.7.6 by this push:
new eab996a IGNITE-12061 Fix inline size change. - Fixes #6795.
eab996a is described below
commit eab996ad3f83d7b22c7e318788c34145ccd2d0ba
Author: Evgeny Stanilovskiy <es...@gridgain.com>
AuthorDate: Wed Aug 21 11:56:49 2019 +0300
IGNITE-12061 Fix inline size change. - Fixes #6795.
Signed-off-by: Dmitriy Pavlov <dp...@apache.org>
---
.../cache/persistence/tree/BPlusTree.java | 5 +-
.../processors/query/h2/IgniteH2Indexing.java | 6 ++
.../processors/query/h2/database/H2Tree.java | 8 +-
.../processors/query/h2/opt/GridH2Table.java | 21 +++++-
.../processors/cache/index/BasicIndexTest.java | 87 ++++++++++++++++++++++
.../DynamicIndexAbstractConcurrentSelfTest.java | 7 +-
.../cache/index/DynamicIndexAbstractSelfTest.java | 17 +++++
7 files changed, 143 insertions(+), 8 deletions(-)
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/BPlusTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/BPlusTree.java
index fd7fba6..76709e1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/BPlusTree.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/tree/BPlusTree.java
@@ -94,6 +94,9 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
/** Wrapper for tree pages operations. Noop by default. Override for test purposes. */
public static volatile PageHandlerWrapper<Result> pageHndWrapper = (tree, hnd) -> hnd;
+ /** Destroy msg. */
+ public static final String CONC_DESTROY_MSG = "Tree is being concurrently destroyed: ";
+
/** */
private static volatile boolean interrupted;
@@ -972,7 +975,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
*/
private void checkDestroyed() {
if (destroyed.get())
- throw new IllegalStateException("Tree is being concurrently destroyed: " + getName());
+ throw new IllegalStateException(CONC_DESTROY_MSG + getName());
}
/** {@inheritDoc} */
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index 5adb6f16..bfe2d30 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
@@ -918,6 +918,12 @@ public class IgniteH2Indexing implements GridQueryIndexing {
throws IgniteCheckedException{
String sql = H2Utils.indexDropSql(schemaName, idxName, ifExists);
+ GridH2Table tbl = dataTableForIndex(schemaName, idxName);
+
+ assert tbl != null;
+
+ tbl.setRemoveIndexOnDestroy(true);
+
executeSql(schemaName, sql);
}
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
index 4c6c0c0..5822318 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2Tree.java
@@ -57,6 +57,9 @@ public abstract class H2Tree extends BPlusTree<GridH2SearchRow, GridH2Row> {
private final H2RowFactory rowStore;
/** */
+ public static final String IGNITE_THROTTLE_INLINE_SIZE_CALCULATION = "IGNITE_THROTTLE_INLINE_SIZE_CALCULATION";
+
+ /** */
private final int inlineSize;
/** */
@@ -97,7 +100,8 @@ public abstract class H2Tree extends BPlusTree<GridH2SearchRow, GridH2Row> {
private final H2RowCache rowCache;
/** How often real invocation of inline size calculation will be skipped. */
- private static final int THROTTLE_INLINE_SIZE_CALCULATION = 1_000;
+ private final int inlineSizeThrottleThreshold =
+ IgniteSystemProperties.getInteger(IGNITE_THROTTLE_INLINE_SIZE_CALCULATION, 1_000);
/** Counter of inline size calculation for throttling real invocations. */
private final ThreadLocal<Long> inlineSizeCalculationCntr = ThreadLocal.withInitial(() -> 0L);
@@ -436,7 +440,7 @@ public abstract class H2Tree extends BPlusTree<GridH2SearchRow, GridH2Row> {
inlineSizeCalculationCntr.set(++invokeCnt);
- boolean throttle = invokeCnt % THROTTLE_INLINE_SIZE_CALCULATION != 0;
+ boolean throttle = invokeCnt % inlineSizeThrottleThreshold != 0;
if (throttle)
return;
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
index a612b63..0389ae5 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2Table.java
@@ -445,8 +445,7 @@ public class GridH2Table extends TableBase {
assert desc != null;
GridH2KeyValueRowOnheap row0 = (GridH2KeyValueRowOnheap)desc.createRow(row);
- GridH2KeyValueRowOnheap prevRow0 = prevRow != null ? (GridH2KeyValueRowOnheap)desc.createRow(prevRow) :
- null;
+ GridH2KeyValueRowOnheap prevRow0 = prevRow != null ? (GridH2KeyValueRowOnheap)desc.createRow(prevRow) : null;
row0.prepareValuesCache();
@@ -697,6 +696,8 @@ public class GridH2Table extends TableBase {
lock(true);
try {
+ ensureNotDestroyed();
+
ArrayList<Index> idxs = new ArrayList<>(this.idxs);
Index targetIdx = (h2Idx instanceof GridH2ProxyIndex) ?
@@ -714,12 +715,24 @@ public class GridH2Table extends TableBase {
idx.getSchema().findIndex(session, idx.getName()) != null)
database.removeSchemaObject(session, idx);
+ GridCacheContext cctx0 = cache();
+
+ if (cctx0 != null && idx instanceof GridH2IndexBase) {
+ cctx0.shared().database().checkpointReadLock();
+
+ try {
+ ((GridH2IndexBase)idx).destroy(rmIndex);
+ }
+ finally {
+ cctx0.shared().database().checkpointReadUnlock();
+ }
+ }
+
continue;
}
i++;
}
-
this.idxs = idxs;
}
finally {
@@ -1065,4 +1078,4 @@ public class GridH2Table extends TableBase {
return true;
}
-}
\ No newline at end of file
+}
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/BasicIndexTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/BasicIndexTest.java
index feb330b..8da8dc8 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/BasicIndexTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/BasicIndexTest.java
@@ -25,6 +25,8 @@ import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Objects;
+
+import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCache;
import org.apache.ignite.cache.CacheKeyConfiguration;
import org.apache.ignite.cache.QueryEntity;
@@ -41,8 +43,11 @@ import org.apache.ignite.internal.util.typedef.internal.U;
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.GridStringLogger;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import static org.apache.ignite.internal.processors.query.h2.database.H2Tree.IGNITE_THROTTLE_INLINE_SIZE_CALCULATION;
+
/**
* A set of basic tests for caches with indexes.
*/
@@ -62,6 +67,9 @@ public class BasicIndexTest extends GridCommonAbstractTest {
/** */
private String affKeyFieldName;
+ /** Server listening logger. */
+ private GridStringLogger srvLog;
+
/** {@inheritDoc} */
@Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
assertNotNull(indexes);
@@ -107,6 +115,9 @@ public class BasicIndexTest extends GridCommonAbstractTest {
igniteCfg.setCacheConfiguration(ccfg);
+ if (srvLog != null)
+ igniteCfg.setGridLogger(srvLog);
+
if (isPersistenceEnabled) {
igniteCfg.setDataStorageConfiguration(new DataStorageConfiguration()
.setDefaultDataRegionConfiguration(
@@ -307,6 +318,82 @@ public class BasicIndexTest extends GridCommonAbstractTest {
}
/** */
+ public void testInlineSizeChange() throws Exception {
+ try {
+ System.setProperty(IGNITE_THROTTLE_INLINE_SIZE_CALCULATION, "1");
+
+ isPersistenceEnabled = true;
+
+ indexes = Collections.singletonList(new QueryIndex("valStr"));
+
+ inlineSize = 33;
+
+ srvLog = new GridStringLogger(false, this.log);
+
+ String msg1 = "curSize=1";
+
+ String msg2 = "curSize=2";
+
+ String msg3 = "curSize=3";
+
+ Ignite ig0 = startGrid();
+
+ ig0.cluster().active(true);
+
+ populateCache();
+
+ IgniteCache<Key, Val> cache = grid().cache(DEFAULT_CACHE_NAME);
+
+ cache.query(new SqlFieldsQuery("create index \"idx1\" on Val(valLong) INLINE_SIZE 1 PARALLEL 28"));
+
+ List<List<?>> res = cache.query(new SqlFieldsQuery("explain select * from Val where valLong > ?").setArgs(10)).getAll();
+
+ log.info("exp: " + res.get(0).get(0));
+
+ assertTrue(srvLog.toString().contains(msg1));
+
+ srvLog.reset();
+
+ cache.query(new SqlFieldsQuery("drop index \"idx1\"")).getAll();
+
+ cache.query(new SqlFieldsQuery("create index \"idx1\" on Val(valLong) INLINE_SIZE 2 PARALLEL 28"));
+
+ cache.query(new SqlFieldsQuery("explain select * from Val where valLong > ?").setArgs(10)).getAll();
+
+ String ss = srvLog.toString();
+
+ assertTrue(srvLog.toString().contains(msg2));
+
+ srvLog.reset();
+
+ cache.query(new SqlFieldsQuery("drop index \"idx1\"")).getAll();
+
+ stopAllGrids();
+
+ ig0 = startGrid(0);
+
+ ig0.cluster().active(true);
+
+ cache = ig0.cache(DEFAULT_CACHE_NAME);
+
+ cache.query(new SqlFieldsQuery("create index \"idx1\" on Val(valLong) INLINE_SIZE 3 PARALLEL 28"));
+
+ cache.query(new SqlFieldsQuery("explain select * from Val where valLong > ?").setArgs(10)).getAll();
+
+ assertTrue(srvLog.toString().contains(msg3));
+
+ srvLog.reset();
+ }
+ finally {
+ System.clearProperty(IGNITE_THROTTLE_INLINE_SIZE_CALCULATION);
+
+ stopAllGrids();
+
+ cleanPersistenceDir();
+ }
+ }
+
+ /** */
public void testDynamicIndexesWithPersistence() throws Exception {
indexes = Collections.emptyList();
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractConcurrentSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractConcurrentSelfTest.java
index bf98491..96a3dd1 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractConcurrentSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractConcurrentSelfTest.java
@@ -610,7 +610,12 @@ public abstract class DynamicIndexAbstractConcurrentSelfTest extends DynamicInde
while (!stopped.get()) {
Ignite node = grid(ThreadLocalRandom.current().nextInt(1, 5));
- assertSqlSimpleData(node, SQL_SIMPLE_FIELD_1, KEY_AFTER - SQL_ARG_1);
+ try {
+ assertSqlSimpleData(node, SQL_SIMPLE_FIELD_1, KEY_AFTER - SQL_ARG_1);
+ }
+ catch (Exception e) {
+ awaitConcDestroyException(e);
+ }
}
return null;
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java
index 0bab750..000b80b 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/DynamicIndexAbstractSelfTest.java
@@ -50,6 +50,8 @@ 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 static org.apache.ignite.internal.processors.cache.persistence.tree.BPlusTree.CONC_DESTROY_MSG;
+
/**
* Tests for dynamic index creation.
*/
@@ -401,6 +403,21 @@ public abstract class DynamicIndexAbstractSelfTest extends AbstractSchemaSelfTes
}
/**
+ * Wait appropriate exception.
+ *
+ * @param e Exception to be processed.
+ * @throws Exception If failed.
+ */
+ protected void awaitConcDestroyException(Exception e) throws Exception {
+ for (Throwable th = e; th != null; th = th.getCause()) {
+ if (th.getMessage().contains(CONC_DESTROY_MSG))
+ return;
+ }
+
+ throw e;
+ }
+
+ /**
* Assert SQL simple data state.
*
* @param node Node.