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.