Repository: ignite Updated Branches: refs/heads/master d9be16f23 -> 2c13a0156
IGNITE-10534: SQL: fixed local cache check for DDL operations. This closes #5574. Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/2c13a015 Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/2c13a015 Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/2c13a015 Branch: refs/heads/master Commit: 2c13a01561d49702a70c364497b97f3ccf8944e6 Parents: d9be16f Author: Yuriy Gerzhedovich <[email protected]> Authored: Mon Dec 10 11:51:49 2018 +0300 Committer: devozerov <[email protected]> Committed: Mon Dec 10 11:51:49 2018 +0300 ---------------------------------------------------------------------- .../query/h2/ddl/DdlStatementsProcessor.java | 19 +++---- .../cache/GridCacheDynamicLoadOnClientTest.java | 56 ++++++++++++++------ 2 files changed, 48 insertions(+), 27 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/2c13a015/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java index 6308eab..ca46828 100644 --- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java +++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/ddl/DdlStatementsProcessor.java @@ -29,6 +29,7 @@ import java.util.UUID; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.IgniteCluster; import org.apache.ignite.IgniteSystemProperties; +import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.QueryEntity; import org.apache.ignite.cache.QueryIndex; import org.apache.ignite.cache.QueryIndexType; @@ -36,7 +37,6 @@ import org.apache.ignite.cache.query.FieldsQueryCursor; import org.apache.ignite.configuration.CacheConfiguration; import org.apache.ignite.internal.GridKernalContext; import org.apache.ignite.internal.IgniteInternalFuture; -import org.apache.ignite.internal.processors.cache.GridCacheContext; import org.apache.ignite.internal.processors.cache.QueryCursorImpl; import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal; import org.apache.ignite.internal.processors.cache.mvcc.MvccUtils; @@ -136,7 +136,7 @@ public class DdlStatementsProcessor { assert tbl.rowDescriptor() != null; - isDdlSupported(tbl); + ensureDdlSupported(tbl); QueryIndex newIdx = new QueryIndex(); @@ -170,7 +170,7 @@ public class DdlStatementsProcessor { GridH2Table tbl = idx.dataTableForIndex(cmd0.schemaName(), cmd0.indexName()); if (tbl != null) { - isDdlSupported(tbl); + ensureDdlSupported(tbl); fut = ctx.query().dynamicIndexDrop(tbl.cacheName(), cmd0.schemaName(), cmd0.indexName(), cmd0.ifExists()); @@ -277,7 +277,7 @@ public class DdlStatementsProcessor { assert tbl.rowDescriptor() != null; - isDdlSupported(tbl); + ensureDdlSupported(tbl); QueryIndex newIdx = new QueryIndex(); @@ -312,7 +312,7 @@ public class DdlStatementsProcessor { GridH2Table tbl = idx.dataTableForIndex(cmd.schemaName(), cmd.indexName()); if (tbl != null) { - isDdlSupported(tbl); + ensureDdlSupported(tbl); fut = ctx.query().dynamicIndexDrop(tbl.cacheName(), cmd.schemaName(), cmd.indexName(), cmd.ifExists()); @@ -525,13 +525,10 @@ public class DdlStatementsProcessor { * Check if table supports DDL statement. * * @param tbl Table. + * @throws IgniteSQLException If failed. */ - private static void isDdlSupported(GridH2Table tbl) { - GridCacheContext cctx = tbl.cacheContext(); - - assert cctx != null; - - if (cctx.isLocal()) + private static void ensureDdlSupported(GridH2Table tbl) throws IgniteSQLException { + if (tbl.cacheInfo().config().getCacheMode() == CacheMode.LOCAL) throw new IgniteSQLException("DDL statements are not supported on LOCAL caches", IgniteQueryErrorCode.UNSUPPORTED_OPERATION); } http://git-wip-us.apache.org/repos/asf/ignite/blob/2c13a015/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheDynamicLoadOnClientTest.java ---------------------------------------------------------------------- diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheDynamicLoadOnClientTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheDynamicLoadOnClientTest.java index 5cc559e..4fbb139 100644 --- a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheDynamicLoadOnClientTest.java +++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheDynamicLoadOnClientTest.java @@ -24,6 +24,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Collection; +import org.apache.ignite.IgniteCache; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.QueryEntity; import org.apache.ignite.cache.QueryIndex; @@ -55,15 +56,15 @@ public class GridCacheDynamicLoadOnClientTest extends GridCommonAbstractTest { /** Full table name. */ private static final String FULL_TABLE_NAME = PERSON_SCHEMA + "." + PERSON_CACHE; - /** Number of nodes. */ - private static final int NODES = 2; - /** Client or server mode for configuration. */ protected boolean client; /** Instance of client node. */ private static IgniteEx clientNode; + /** Instance of client node. */ + private static IgniteEx srvNode; + /** {@inheritDoc} */ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception { return super.getConfiguration(igniteInstanceName).setClientMode(client); @@ -75,11 +76,11 @@ public class GridCacheDynamicLoadOnClientTest extends GridCommonAbstractTest { client = false; - startGridsMultiThreaded(NODES - 1); + srvNode = (IgniteEx)startGridsMultiThreaded(1); client = true; - clientNode = startGrid(NODES - 1); + clientNode = startGrid(1); } /** {@inheritDoc} */ @@ -137,7 +138,7 @@ public class GridCacheDynamicLoadOnClientTest extends GridCommonAbstractTest { SqlFieldsQuery qry = new SqlFieldsQuery("SELECT * FROM " + FULL_TABLE_NAME); - Assert.assertEquals(CACHE_ELEMENT_COUNT - 1, clientNode.cache(PERSON_CACHE).query(qry).getAll().size()); + Assert.assertEquals(CACHE_ELEMENT_COUNT - 1, getDefaultCacheOnClient().query(qry).getAll().size()); } /** @@ -156,7 +157,7 @@ public class GridCacheDynamicLoadOnClientTest extends GridCommonAbstractTest { SqlFieldsQuery qry = new SqlFieldsQuery("SELECT * FROM " + FULL_TABLE_NAME); - Assert.assertEquals(CACHE_ELEMENT_COUNT + 1, clientNode.cache(PERSON_CACHE).query(qry).getAll().size()); + Assert.assertEquals(CACHE_ELEMENT_COUNT + 1, getDefaultCacheOnClient().query(qry).getAll().size()); } /** @@ -174,7 +175,7 @@ public class GridCacheDynamicLoadOnClientTest extends GridCommonAbstractTest { SqlFieldsQuery qry = new SqlFieldsQuery("SELECT * FROM " + FULL_TABLE_NAME + " WHERE name = 'new_name'"); - Assert.assertEquals(CACHE_ELEMENT_COUNT, clientNode.cache(PERSON_CACHE).query(qry).getAll().size()); + Assert.assertEquals(CACHE_ELEMENT_COUNT, getDefaultCacheOnClient().query(qry).getAll().size()); } /** @@ -203,12 +204,32 @@ public class GridCacheDynamicLoadOnClientTest extends GridCommonAbstractTest { } /** + * Test DDL operation for not started cache on client node. + */ + public void testCreateIdxOnClient() { + getDefaultCacheOnClient().query(new SqlFieldsQuery("CREATE INDEX IDX_11 ON " + FULL_TABLE_NAME + " (name asc)")).getAll(); + } + + /** + * Test DDL operation for not started cache on client node. + */ + public void testDropIdxOnClient() { + srvNode.getOrCreateCache(DEFAULT_CACHE_NAME).query(new SqlFieldsQuery("CREATE INDEX IDX_TST ON " + FULL_TABLE_NAME + " (name desc)")).getAll(); + + //Due to client receive created index asynchronously we need add the ugly sleep. + doSleep(2000); + + getDefaultCacheOnClient().query(new SqlFieldsQuery("DROP INDEX " + PERSON_SCHEMA + ".IDX_TST")).getAll(); + } + + + /** * Test from client node to get cache elements through cache API. */ public void testClientSqlFieldsQuery() { SqlFieldsQuery qry = new SqlFieldsQuery("SELECT * FROM " + FULL_TABLE_NAME); - Assert.assertEquals(CACHE_ELEMENT_COUNT, clientNode.cache(PERSON_CACHE).query(qry).getAll().size()); + Assert.assertEquals(CACHE_ELEMENT_COUNT, getDefaultCacheOnClient().query(qry).getAll().size()); } /** @@ -217,16 +238,20 @@ public class GridCacheDynamicLoadOnClientTest extends GridCommonAbstractTest { public void testClientSqlQuery() { SqlQuery<Integer, Person> qry = new SqlQuery<>(PERSON_CACHE, "FROM " + PERSON_CACHE); - Assert.assertEquals(CACHE_ELEMENT_COUNT, - clientNode.cache(PERSON_CACHE).query(qry).getAll().size()); + Assert.assertEquals(CACHE_ELEMENT_COUNT, clientNode.getOrCreateCache(PERSON_CACHE).query(qry).getAll().size()); + } + + /** + * @return Default cache on client node. + */ + private IgniteCache getDefaultCacheOnClient() { + return clientNode.getOrCreateCache(DEFAULT_CACHE_NAME); } /** * Create cache at server node and put some values into the cache. */ private void createAndFillServerCache() { - IgniteEx srvNode = grid(0); - srvNode.createCache(cacheConfiguration()); for (int i = 0; i < CACHE_ELEMENT_COUNT; i++) @@ -246,9 +271,8 @@ public class GridCacheDynamicLoadOnClientTest extends GridCommonAbstractTest { person.setKeyType(Integer.class.getName()); person.setValueType(Person.class.getName()); person.addQueryField("orgId", Integer.class.getName(), null); - person.addQueryField("id", Integer.class.getName(), null); person.addQueryField("name", String.class.getName(), null); - person.setIndexes(F.asList(new QueryIndex("orgId"), new QueryIndex("id"), new QueryIndex("name"))); + person.setIndexes(F.asList(new QueryIndex("orgId"), new QueryIndex("name"))); ccfg.setQueryEntities(F.asList(person)); @@ -296,7 +320,7 @@ public class GridCacheDynamicLoadOnClientTest extends GridCommonAbstractTest { * @param orgId Organization ID. * @param name Name. */ - public Person(int orgId, String name) { + Person(int orgId, String name) { this.orgId = orgId; this.name = name; }
