From c3e91201623d6bdcfaa460a0c81bddb112eaa3eb Mon Sep 17 00:00:00 2001 From: Dmitriy Govorukhin Date: Fri, 18 Aug 2017 19:48:28 +0300 Subject: [PATCH 1/3] IGNITE-6035 WIP. Dirty fix. --- .../processors/cache/GridCacheProcessor.java | 4 ++-- .../cache/persistence/MetadataStorage.java | 2 +- .../processors/query/GridQueryIndexing.java | 2 +- .../processors/query/GridQueryProcessor.java | 11 +++++------ .../IgniteClientCacheInitializationFailTest.java | 2 +- .../IgnitePersistentStoreCacheGroupsTest.java | 2 +- .../query/h2/opt/GridH2SpatialIndex.java | 4 ++-- .../internal/processors/query/h2/H2Schema.java | 9 +++++---- .../processors/query/h2/H2TableDescriptor.java | 7 +++---- .../processors/query/h2/IgniteH2Indexing.java | 10 ++++++---- .../processors/query/h2/database/H2TreeIndex.java | 15 ++++++++++++--- .../processors/query/h2/opt/GridH2IndexBase.java | 2 +- .../processors/query/h2/opt/GridH2Table.java | 9 ++++++--- 13 files changed, 46 insertions(+), 33 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java index 2e543c735015f..41af6262320e3 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java @@ -1016,7 +1016,7 @@ private void stopCacheOnReconnect(GridCacheContext cctx, List assert desc != null : cctx.name(); - ctx.query().onCacheStop0(cctx.name()); + ctx.query().onCacheStop0(cctx.name(), false); ctx.query().onCacheStart0(cctx, desc.schema()); } } @@ -1142,7 +1142,7 @@ private void stopCache(GridCacheAdapter cache, boolean cancel, boolean des cache.stop(); - ctx.kernalContext().query().onCacheStop(ctx); + ctx.kernalContext().query().onCacheStop(ctx, destroy); if (isNearEnabled(ctx)) { GridDhtCacheAdapter dht = ctx.near().dht(); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/MetadataStorage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/MetadataStorage.java index 359e54ebe7cc9..e667807b6d6a4 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/MetadataStorage.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/MetadataStorage.java @@ -291,7 +291,7 @@ private static void storeRow( PageUtils.putUnsignedByte(dstPageAddr, dstOff, len); dstOff++; - PageHandler.copyMemory(srcPageAddr, dstPageAddr, srcOff, dstOff, len); + PageHandler.copyMemory(srcPageAddr, srcOff, dstPageAddr, dstOff, len); srcOff += len; dstOff += len; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java index 9184327f75d8a..1c8a0d497c62f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java @@ -181,7 +181,7 @@ public void registerCache(String cacheName, String schemaName, GridCacheContext< * @param cacheName Cache name. * @throws IgniteCheckedException If failed to drop cache schema. */ - public void unregisterCache(String cacheName) throws IgniteCheckedException; + public void unregisterCache(String cacheName, boolean destroy) throws IgniteCheckedException; /** * Registers type if it was not known before or updates it otherwise. diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java index 1d154d39e69b9..d1e76dc9a608a 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java @@ -65,7 +65,6 @@ import org.apache.ignite.internal.processors.cache.GridCacheAdapter; import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.KeyCacheObject; -import org.apache.ignite.internal.processors.cache.StoredCacheData; import org.apache.ignite.internal.processors.cache.query.CacheQueryFuture; import org.apache.ignite.internal.processors.cache.query.CacheQueryType; import org.apache.ignite.internal.processors.cache.query.GridCacheQueryType; @@ -837,7 +836,7 @@ public void onCacheStart(GridCacheContext cctx, QuerySchema schema) throws Ignit /** * @param cctx Cache context. */ - public void onCacheStop(GridCacheContext cctx) { + public void onCacheStop(GridCacheContext cctx, boolean destroy) { if (idx == null) return; @@ -845,7 +844,7 @@ public void onCacheStop(GridCacheContext cctx) { return; try { - onCacheStop0(cctx.name()); + onCacheStop0(cctx.name(),destroy); } finally { busyLock.leaveBusy(); @@ -1412,7 +1411,7 @@ private void registerCache0(String cacheName, String schemaName, GridCacheContex cacheNames.add(CU.mask(cacheName)); } catch (IgniteCheckedException | RuntimeException e) { - onCacheStop0(cacheName); + onCacheStop0(cacheName, false); throw e; } @@ -1425,7 +1424,7 @@ private void registerCache0(String cacheName, String schemaName, GridCacheContex * * @param cacheName Cache name. */ - public void onCacheStop0(String cacheName) { + public void onCacheStop0(String cacheName, boolean destroy) { if (idx == null) return; @@ -1463,7 +1462,7 @@ public void onCacheStop0(String cacheName) { // Notify indexing. try { - idx.unregisterCache(cacheName); + idx.unregisterCache(cacheName,destroy); } catch (Exception e) { U.error(log, "Failed to clear indexing on cache unregister (will ignore): " + cacheName, e); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClientCacheInitializationFailTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClientCacheInitializationFailTest.java index 51a806ea2ad45..fa6dd707c5f35 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClientCacheInitializationFailTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteClientCacheInitializationFailTest.java @@ -291,7 +291,7 @@ private static class FailedIndexing implements GridQueryIndexing { } /** {@inheritDoc} */ - @Override public void unregisterCache(String spaceName) throws IgniteCheckedException { + @Override public void unregisterCache(String spaceName, boolean destroy) throws IgniteCheckedException { // No-op } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePersistentStoreCacheGroupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePersistentStoreCacheGroupsTest.java index b39b8cb6b6f9b..dccb43ade05fd 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePersistentStoreCacheGroupsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePersistentStoreCacheGroupsTest.java @@ -186,7 +186,7 @@ public void testClusterRestartCachesWithH2Indexes() throws Exception { startGrids(3); - awaitPartitionMapExchange(); + //awaitPartitionMapExchange(); node = ignite(0); diff --git a/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java b/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java index d83e860def35c..d1f775ea82559 100644 --- a/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java +++ b/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java @@ -249,7 +249,7 @@ private SpatialKey getEnvelope(SearchRow row, long rowId) { } /** {@inheritDoc} */ - @Override public void destroy() { + @Override public void destroy(boolean rmIndex) { Lock l = lock.writeLock(); l.lock(); @@ -263,7 +263,7 @@ private SpatialKey getEnvelope(SearchRow row, long rowId) { l.unlock(); } - super.destroy(); + super.destroy(rmIndex); } /** {@inheritDoc} */ diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java index deca4b2a2d9d8..63a4f5f53b396 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java @@ -110,10 +110,11 @@ public void remove(H2TableDescriptor tbl) { * * @param tbl Table to be removed. */ - public void drop(H2TableDescriptor tbl) { - tbl.onDrop(); + public void drop(H2TableDescriptor tbl, boolean rmvIndex) { + tbl.onDrop(rmvIndex); + + tbls.remove(tbl.tableName(), rmvIndex); - tbls.remove(tbl.tableName()); typeToTbl.remove(tbl.typeName()); } @@ -122,7 +123,7 @@ public void drop(H2TableDescriptor tbl) { */ public void dropAll() { for (H2TableDescriptor tbl : tbls.values()) - tbl.onDrop(); + tbl.onDrop(false); tbls.clear(); typeToTbl.clear(); diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java index 589f90ed6a4cb..03b84cb4fe432 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java @@ -310,9 +310,8 @@ public GridH2IndexBase createUserIndex(GridQueryIndexDescriptor idxDesc) { return idx.createSortedIndex(schema, idxDesc.name(), tbl, false, cols, idxDesc.inlineSize()); } - else if (idxDesc.type() == QueryIndexType.GEOSPATIAL) { + else if (idxDesc.type() == QueryIndexType.GEOSPATIAL) return H2Utils.createSpatialIndex(tbl, idxDesc.name(), cols.toArray(new IndexColumn[cols.size()])); - } throw new IllegalStateException("Index type: " + idxDesc.type()); } @@ -340,10 +339,10 @@ private Index createHashIndex(GridH2Table tbl, String idxName, List /** * Handle drop. */ - void onDrop() { + void onDrop(boolean rmvIndex) { idx.removeDataTable(tbl); - tbl.destroy(); + tbl.destroy(rmvIndex); U.closeQuiet(luceneIdx); } 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 6896f18d6a175..648b568d2eddc 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 @@ -583,9 +583,11 @@ private void onSqlException() { * @param tbl Table to unregister. * @throws IgniteCheckedException If failed to unregister. */ - private void dropTable(H2TableDescriptor tbl) throws IgniteCheckedException { + private void dropTable(H2TableDescriptor tbl, boolean rmvIndex) throws IgniteCheckedException { assert tbl != null; + tbl.table().rmIndex.set(rmvIndex); + if (log.isDebugEnabled()) log.debug("Removing query index table: " + tbl.fullTableName()); @@ -2156,7 +2158,7 @@ private boolean isDefaultSchema(String schemaName) { } /** {@inheritDoc} */ - @Override public void unregisterCache(String cacheName) { + @Override public void unregisterCache(String cacheName, boolean destroy) { String schemaName = schema(cacheName); boolean dflt = isDefaultSchema(schemaName); @@ -2176,13 +2178,13 @@ private boolean isDefaultSchema(String schemaName) { for (H2TableDescriptor tbl : schema.tables()) { if (F.eq(tbl.cache().name(), cacheName)) { try { - dropTable(tbl); + dropTable(tbl,destroy); } catch (IgniteCheckedException e) { U.error(log, "Failed to drop table on cache stop (will ignore): " + tbl.fullTableName(), e); } - schema.drop(tbl); + schema.drop(tbl, destroy); rmvTbls.add(tbl); } diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java index d186623f32b45..d940691852651 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteSystemProperties; @@ -66,6 +67,9 @@ public class H2TreeIndex extends GridH2IndexBase { /** Cache context. */ private GridCacheContext cctx; + /** */ + private final AtomicBoolean destroy = new AtomicBoolean(); + /** * @param cctx Cache context. * @param tbl Table. @@ -306,10 +310,14 @@ private List getAvailableInlineColumns(IndexColumn[] cols) { } /** {@inheritDoc} */ - @Override public void destroy() { + @Override public void destroy(boolean rmvIndex) { + boolean needEvt = false; + try { if (cctx.affinityNode()) { - if (!cctx.kernalContext().cache().context().database().persistenceEnabled()) { + if (!cctx.kernalContext().cache().context().database().persistenceEnabled() + || rmvIndex && (needEvt = destroy.compareAndSet(false, true))) { + for (int i = 0; i < segments.length; i++) { H2Tree tree = segments[i]; @@ -324,7 +332,8 @@ private List getAvailableInlineColumns(IndexColumn[] cols) { throw new IgniteException(e); } finally { - super.destroy(); + if (needEvt) + super.destroy(rmvIndex); } } diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java index 5d5fb56341d66..238663cb4a22e 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java @@ -158,7 +158,7 @@ protected final void initDistributedJoinMessaging(GridH2Table tbl) { * We use this method instead of {@link #close(Session)} because that method * is used by H2 internally. */ - public void destroy() { + public void destroy(boolean rmv) { if (msgLsnr != null) kernalContext().io().removeMessageListener(msgTopic, msgLsnr); } 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 f76cb5fd42393..575cfb1414fc6 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 @@ -109,6 +109,9 @@ public class GridH2Table extends TableBase { /** Identifier as string. */ private final String identifierStr; + /** */ + public final ThreadLocal rmIndex = new ThreadLocal<>(); + /** * Creates table. * @@ -319,7 +322,7 @@ private void ensureNotDestroyed() { // We have to call destroy here if we are who has removed this index from the table. if (idx instanceof GridH2IndexBase) - ((GridH2IndexBase)idx).destroy(); + ((GridH2IndexBase)idx).destroy(rmIndex.get()); } } @@ -343,7 +346,7 @@ private void ensureNotDestroyed() { /** * Destroy the table. */ - public void destroy() { + public void destroy(boolean rmvIndex) { lock(true); try { @@ -355,7 +358,7 @@ public void destroy() { for (int i = 1, len = idxs.size(); i < len; i++) if (idxs.get(i) instanceof GridH2IndexBase) - index(i).destroy(); + index(i).destroy(rmvIndex); } finally { unlock(true); From e43e47f5635265c6269ac663f6521d7d1306dccc Mon Sep 17 00:00:00 2001 From: Dmitriy Govorukhin Date: Mon, 21 Aug 2017 11:40:41 +0300 Subject: [PATCH 2/3] IGNITE-6035 WIP. Refactoring --- .../processors/query/GridQueryIndexing.java | 1 + .../processors/query/GridQueryProcessor.java | 15 +++++++++++---- .../IgnitePersistentStoreCacheGroupsTest.java | 4 ++-- .../internal/processors/query/h2/H2Schema.java | 9 +++++---- .../processors/query/h2/H2TableDescriptor.java | 4 ++-- .../processors/query/h2/IgniteH2Indexing.java | 10 +++++----- .../processors/query/h2/database/H2TreeIndex.java | 13 ++----------- .../processors/query/h2/opt/GridH2Table.java | 4 ++-- 8 files changed, 30 insertions(+), 30 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java index 1c8a0d497c62f..8eecfc21a4bdd 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java @@ -179,6 +179,7 @@ public void registerCache(String cacheName, String schemaName, GridCacheContext< * Unregisters cache. * * @param cacheName Cache name. + * @param destroy Destroy flag. * @throws IgniteCheckedException If failed to drop cache schema. */ public void unregisterCache(String cacheName, boolean destroy) throws IgniteCheckedException; diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java index d1e76dc9a608a..b1c6c06be6d22 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java @@ -835,6 +835,7 @@ public void onCacheStart(GridCacheContext cctx, QuerySchema schema) throws Ignit /** * @param cctx Cache context. + * @param destroy Destroy flag. */ public void onCacheStop(GridCacheContext cctx, boolean destroy) { if (idx == null) @@ -844,7 +845,7 @@ public void onCacheStop(GridCacheContext cctx, boolean destroy) { return; try { - onCacheStop0(cctx.name(),destroy); + onCacheStop0(cctx.name(), destroy); } finally { busyLock.leaveBusy(); @@ -1370,8 +1371,12 @@ public void dynamicTableDrop(String cacheName, String tblName, boolean ifExists) * @param cands Candidates. * @throws IgniteCheckedException If failed. */ - private void registerCache0(String cacheName, String schemaName, GridCacheContext cctx, - Collection cands) throws IgniteCheckedException { + private void registerCache0( + String cacheName, + String schemaName, + GridCacheContext cctx, + Collection cands + ) throws IgniteCheckedException { synchronized (stateMux) { if (idx != null) idx.registerCache(cacheName, schemaName, cctx); @@ -1411,6 +1416,7 @@ private void registerCache0(String cacheName, String schemaName, GridCacheContex cacheNames.add(CU.mask(cacheName)); } catch (IgniteCheckedException | RuntimeException e) { + //todo ??? onCacheStop0(cacheName, false); throw e; @@ -1423,6 +1429,7 @@ private void registerCache0(String cacheName, String schemaName, GridCacheContex * Use with {@link #busyLock} where appropriate. * * @param cacheName Cache name. + * @param destroy Destroy flag. */ public void onCacheStop0(String cacheName, boolean destroy) { if (idx == null) @@ -1462,7 +1469,7 @@ public void onCacheStop0(String cacheName, boolean destroy) { // Notify indexing. try { - idx.unregisterCache(cacheName,destroy); + idx.unregisterCache(cacheName, destroy); } catch (Exception e) { U.error(log, "Failed to clear indexing on cache unregister (will ignore): " + cacheName, e); diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePersistentStoreCacheGroupsTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePersistentStoreCacheGroupsTest.java index dccb43ade05fd..dc6517731e226 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePersistentStoreCacheGroupsTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/IgnitePersistentStoreCacheGroupsTest.java @@ -186,12 +186,12 @@ public void testClusterRestartCachesWithH2Indexes() throws Exception { startGrids(3); - //awaitPartitionMapExchange(); - node = ignite(0); node.active(true); + awaitPartitionMapExchange(); + checkPersons(caches, node); checkPersonsQuery(caches, node); diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java index 63a4f5f53b396..9c110997c7d1b 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Schema.java @@ -110,10 +110,10 @@ public void remove(H2TableDescriptor tbl) { * * @param tbl Table to be removed. */ - public void drop(H2TableDescriptor tbl, boolean rmvIndex) { - tbl.onDrop(rmvIndex); + public void drop(H2TableDescriptor tbl) { + tbl.onDrop(); - tbls.remove(tbl.tableName(), rmvIndex); + tbls.remove(tbl.tableName()); typeToTbl.remove(tbl.typeName()); } @@ -123,9 +123,10 @@ public void drop(H2TableDescriptor tbl, boolean rmvIndex) { */ public void dropAll() { for (H2TableDescriptor tbl : tbls.values()) - tbl.onDrop(false); + tbl.onDrop(); tbls.clear(); + typeToTbl.clear(); } } diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java index 03b84cb4fe432..5abfc4bb1c102 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2TableDescriptor.java @@ -339,10 +339,10 @@ private Index createHashIndex(GridH2Table tbl, String idxName, List /** * Handle drop. */ - void onDrop(boolean rmvIndex) { + void onDrop() { idx.removeDataTable(tbl); - tbl.destroy(rmvIndex); + tbl.destroy(); U.closeQuiet(luceneIdx); } 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 648b568d2eddc..fd13c9b1e2f5d 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 @@ -583,11 +583,9 @@ private void onSqlException() { * @param tbl Table to unregister. * @throws IgniteCheckedException If failed to unregister. */ - private void dropTable(H2TableDescriptor tbl, boolean rmvIndex) throws IgniteCheckedException { + private void dropTable(H2TableDescriptor tbl) throws IgniteCheckedException { assert tbl != null; - tbl.table().rmIndex.set(rmvIndex); - if (log.isDebugEnabled()) log.debug("Removing query index table: " + tbl.fullTableName()); @@ -2178,13 +2176,15 @@ private boolean isDefaultSchema(String schemaName) { for (H2TableDescriptor tbl : schema.tables()) { if (F.eq(tbl.cache().name(), cacheName)) { try { - dropTable(tbl,destroy); + tbl.table().rmIndex.set(destroy); + + dropTable(tbl); } catch (IgniteCheckedException e) { U.error(log, "Failed to drop table on cache stop (will ignore): " + tbl.fullTableName(), e); } - schema.drop(tbl, destroy); + schema.drop(tbl); rmvTbls.add(tbl); } diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java index d940691852651..0bb227a9e0a08 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteException; import org.apache.ignite.IgniteSystemProperties; @@ -67,9 +66,6 @@ public class H2TreeIndex extends GridH2IndexBase { /** Cache context. */ private GridCacheContext cctx; - /** */ - private final AtomicBoolean destroy = new AtomicBoolean(); - /** * @param cctx Cache context. * @param tbl Table. @@ -311,13 +307,9 @@ private List getAvailableInlineColumns(IndexColumn[] cols) { /** {@inheritDoc} */ @Override public void destroy(boolean rmvIndex) { - boolean needEvt = false; - try { if (cctx.affinityNode()) { - if (!cctx.kernalContext().cache().context().database().persistenceEnabled() - || rmvIndex && (needEvt = destroy.compareAndSet(false, true))) { - + if (!cctx.kernalContext().cache().context().database().persistenceEnabled() || rmvIndex) { for (int i = 0; i < segments.length; i++) { H2Tree tree = segments[i]; @@ -332,8 +324,7 @@ private List getAvailableInlineColumns(IndexColumn[] cols) { throw new IgniteException(e); } finally { - if (needEvt) - super.destroy(rmvIndex); + super.destroy(rmvIndex); } } 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 575cfb1414fc6..b093a75d80f8d 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 @@ -346,7 +346,7 @@ private void ensureNotDestroyed() { /** * Destroy the table. */ - public void destroy(boolean rmvIndex) { + public void destroy() { lock(true); try { @@ -358,7 +358,7 @@ public void destroy(boolean rmvIndex) { for (int i = 1, len = idxs.size(); i < len; i++) if (idxs.get(i) instanceof GridH2IndexBase) - index(i).destroy(rmvIndex); + index(i).destroy(rmIndex.get()); } finally { unlock(true); From 368c32d569340e6212c79bb7b637e88fbdd32dd2 Mon Sep 17 00:00:00 2001 From: Dmitriy Govorukhin Date: Mon, 21 Aug 2017 12:23:08 +0300 Subject: [PATCH 3/3] IGNITE-6035 fix review comments --- .../processors/query/GridQueryProcessor.java | 3 +-- .../processors/query/h2/IgniteH2Indexing.java | 4 +++- .../query/h2/database/H2TreeIndex.java | 12 +++++------- .../query/h2/opt/GridH2IndexBase.java | 2 ++ .../processors/query/h2/opt/GridH2Table.java | 17 +++++++++++++---- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java index b1c6c06be6d22..d5ac8fcb39762 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java @@ -1416,8 +1416,7 @@ private void registerCache0( cacheNames.add(CU.mask(cacheName)); } catch (IgniteCheckedException | RuntimeException e) { - //todo ??? - onCacheStop0(cacheName, false); + onCacheStop0(cacheName, true); throw e; } 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 fd13c9b1e2f5d..0f97a4ba1e975 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 @@ -2176,7 +2176,9 @@ private boolean isDefaultSchema(String schemaName) { for (H2TableDescriptor tbl : schema.tables()) { if (F.eq(tbl.cache().name(), cacheName)) { try { - tbl.table().rmIndex.set(destroy); + boolean removeIdx = !ctx.cache().context().database().persistenceEnabled() || destroy; + + tbl.table().setRemoveIndexOnDestroy(removeIdx); dropTable(tbl); } diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java index 0bb227a9e0a08..de5dc7533309c 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java @@ -308,15 +308,13 @@ private List getAvailableInlineColumns(IndexColumn[] cols) { /** {@inheritDoc} */ @Override public void destroy(boolean rmvIndex) { try { - if (cctx.affinityNode()) { - if (!cctx.kernalContext().cache().context().database().persistenceEnabled() || rmvIndex) { - for (int i = 0; i < segments.length; i++) { - H2Tree tree = segments[i]; + if (cctx.affinityNode() && rmvIndex) { + for (int i = 0; i < segments.length; i++) { + H2Tree tree = segments[i]; - tree.destroy(); + tree.destroy(); - dropMetaPage(tree.getName(), i); - } + dropMetaPage(tree.getName(), i); } } } diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java index 238663cb4a22e..919ff58a00bfb 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java @@ -157,6 +157,8 @@ protected final void initDistributedJoinMessaging(GridH2Table tbl) { * Attempts to destroys index and release all the resources. * We use this method instead of {@link #close(Session)} because that method * is used by H2 internally. + * + * @param rmv Flag remove. */ public void destroy(boolean rmv) { if (msgLsnr != null) 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 b093a75d80f8d..107e3bb93e709 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 @@ -109,8 +109,8 @@ public class GridH2Table extends TableBase { /** Identifier as string. */ private final String identifierStr; - /** */ - public final ThreadLocal rmIndex = new ThreadLocal<>(); + /** Flag remove index or not when table will be destroyed. */ + private volatile boolean rmIndex; /** * Creates table. @@ -322,7 +322,7 @@ private void ensureNotDestroyed() { // We have to call destroy here if we are who has removed this index from the table. if (idx instanceof GridH2IndexBase) - ((GridH2IndexBase)idx).destroy(rmIndex.get()); + ((GridH2IndexBase)idx).destroy(rmIndex); } } @@ -358,13 +358,22 @@ public void destroy() { for (int i = 1, len = idxs.size(); i < len; i++) if (idxs.get(i) instanceof GridH2IndexBase) - index(i).destroy(rmIndex.get()); + index(i).destroy(rmIndex); } finally { unlock(true); } } + /** + * If flag {@code True}, index will be destroyed when table {@link #destroy()}. + * + * @param rmIndex Flag indicate remove index on destroy or not. + */ + public void setRemoveIndexOnDestroy(boolean rmIndex){ + this.rmIndex = rmIndex; + } + /** {@inheritDoc} */ @Override public void unlock(Session ses) { Boolean exclusive = sessions.remove(ses);