From 0f2acd36c851a4f4ebdf5eff976e94289aa09bf2 Mon Sep 17 00:00:00 2001 From: Alexander Paschenko Date: Mon, 16 Oct 2017 15:18:46 +0300 Subject: [PATCH] IGNITE-6637 Statements cache clear on cache destroy. --- .../processors/query/h2/IgniteH2Indexing.java | 8 ++-- .../cache/index/H2DynamicTableSelfTest.java | 43 +++++++++++++++++++ 2 files changed, 48 insertions(+), 3 deletions(-) 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 0fdc2e48b9a9e..541b80f2f9c2d 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 @@ -59,7 +59,6 @@ import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.GridTopic; import org.apache.ignite.internal.IgniteInternalFuture; -import org.apache.ignite.internal.processors.cache.query.SqlFieldsQueryEx; import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion; import org.apache.ignite.internal.processors.cache.CacheEntryImpl; import org.apache.ignite.internal.processors.cache.CacheObject; @@ -79,6 +78,7 @@ import org.apache.ignite.internal.processors.cache.query.GridCacheTwoStepQuery; import org.apache.ignite.internal.processors.cache.query.IgniteQueryErrorCode; import org.apache.ignite.internal.processors.cache.query.QueryTable; +import org.apache.ignite.internal.processors.cache.query.SqlFieldsQueryEx; import org.apache.ignite.internal.processors.cache.version.GridCacheVersion; import org.apache.ignite.internal.processors.query.CacheQueryObjectValueContext; import org.apache.ignite.internal.processors.query.GridQueryCacheObjectsIterator; @@ -103,10 +103,10 @@ import org.apache.ignite.internal.processors.query.h2.opt.DistributedJoinMode; import org.apache.ignite.internal.processors.query.h2.opt.GridH2DefaultTableEngine; import org.apache.ignite.internal.processors.query.h2.opt.GridH2IndexBase; +import org.apache.ignite.internal.processors.query.h2.opt.GridH2PlainRowFactory; import org.apache.ignite.internal.processors.query.h2.opt.GridH2QueryContext; import org.apache.ignite.internal.processors.query.h2.opt.GridH2Row; import org.apache.ignite.internal.processors.query.h2.opt.GridH2RowDescriptor; -import org.apache.ignite.internal.processors.query.h2.opt.GridH2PlainRowFactory; import org.apache.ignite.internal.processors.query.h2.opt.GridH2Table; import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQueryParser; import org.apache.ignite.internal.processors.query.h2.sql.GridSqlQuerySplitter; @@ -2342,6 +2342,8 @@ private boolean isDefaultSchema(String schemaName) { } } + stmtCache.clear(); + for (H2TableDescriptor tbl : rmvTbls) { for (Index idx : tbl.table().getIndexes()) idx.close(null); @@ -2364,7 +2366,7 @@ private boolean isDefaultSchema(String schemaName) { /** * Remove all cached queries from cached two-steps queries. */ - public void clearCachedQueries() { + private void clearCachedQueries() { twoStepCache.clear(); } diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java index b108bb3f71c10..c56db84cbbb5d 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/H2DynamicTableSelfTest.java @@ -48,6 +48,7 @@ import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.binary.BinaryMarshaller; import org.apache.ignite.internal.processors.cache.DynamicCacheDescriptor; +import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.IgniteInternalCache; import org.apache.ignite.internal.processors.query.GridQueryProperty; import org.apache.ignite.internal.processors.query.GridQueryTypeDescriptor; @@ -996,6 +997,39 @@ public void testTableAndIndexRecreate() { execute("drop table \"PUBLIC\".t"); } + /** + * @throws Exception If test failed. + */ + public void testQueryLocalWithRecreate() throws Exception { + execute("CREATE TABLE A(id int primary key, name varchar, surname varchar) WITH \"cache_name=cache," + + "template=replicated\""); + + // In order for local queries to work, let's use non client node. + IgniteInternalCache cache = grid(0).cachex("cache"); + + assertNotNull(cache); + + executeLocal(cache.context(), "INSERT INTO A(id, name, surname) values (1, 'X', 'Y')"); + + assertEqualsCollections(Collections.singletonList(Arrays.asList(1, "X", "Y")), + executeLocal(cache.context(), "SELECT id, name, surname FROM A")); + + execute("DROP TABLE A"); + + execute("CREATE TABLE A(id int primary key, name varchar, surname varchar) WITH \"cache_name=cache\""); + + cache = grid(0).cachex("cache"); + + assertNotNull(cache); + + try { + executeLocal(cache.context(), "INSERT INTO A(id, name, surname) values (1, 'X', 'Y')"); + } + finally { + execute("DROP TABLE A"); + } + } + /** * Test that it's impossible to create tables with same name regardless of key/value wrapping settings. */ @@ -1442,6 +1476,15 @@ private List> execute(Ignite node, String sql) { return queryProcessor(node).querySqlFieldsNoCache(new SqlFieldsQuery(sql).setSchema("PUBLIC"), true).getAll(); } + /** + * Execute DDL statement on given node. + * + * @param sql Statement. + */ + private List> executeLocal(GridCacheContext cctx, String sql) { + return queryProcessor(cctx.grid()).querySqlFields(cctx, new SqlFieldsQuery(sql).setLocal(true), true).getAll(); + } + /** * @return Client node. */