Return-Path: X-Original-To: apmail-ignite-commits-archive@minotaur.apache.org Delivered-To: apmail-ignite-commits-archive@minotaur.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 59B7E18892 for ; Tue, 10 Nov 2015 07:15:20 +0000 (UTC) Received: (qmail 84382 invoked by uid 500); 10 Nov 2015 07:15:20 -0000 Delivered-To: apmail-ignite-commits-archive@ignite.apache.org Received: (qmail 84235 invoked by uid 500); 10 Nov 2015 07:15:19 -0000 Mailing-List: contact commits-help@ignite.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@ignite.apache.org Delivered-To: mailing list commits@ignite.apache.org Received: (qmail 83269 invoked by uid 99); 10 Nov 2015 07:15:18 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 10 Nov 2015 07:15:18 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 9F177E0B11; Tue, 10 Nov 2015 07:15:18 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: sboikov@apache.org To: commits@ignite.apache.org Date: Tue, 10 Nov 2015 07:15:41 -0000 Message-Id: <4a30a173c1554c42ac008e456dabe0b8@git.apache.org> In-Reply-To: References: X-Mailer: ASF-Git Admin Mailer Subject: [24/34] ignite git commit: IGNITE-1168 REST return sql metadata for all caches in one request. - Fixes #181. IGNITE-1168 REST return sql metadata for all caches in one request. - Fixes #181. Signed-off-by: Andrey Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/354358cc Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/354358cc Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/354358cc Branch: refs/heads/ignite-1758 Commit: 354358cc4ec9a8f15e75d132c7a57d2361b5722b Parents: 621ecac Author: Andrey Authored: Mon Nov 9 10:41:04 2015 +0700 Committer: Andrey Committed: Mon Nov 9 10:41:04 2015 +0700 ---------------------------------------------------------------------- .../JettyRestProcessorAbstractSelfTest.java | 105 ++++++++------- .../discovery/GridDiscoveryManager.java | 5 +- .../handlers/cache/GridCacheCommandHandler.java | 128 +++++++++++++++---- .../top/GridTopologyCommandHandler.java | 4 - 4 files changed, 166 insertions(+), 76 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/354358cc/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java index c9c4ced..4c73f78 100644 --- a/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/internal/processors/rest/JettyRestProcessorAbstractSelfTest.java @@ -40,15 +40,14 @@ import org.apache.ignite.cache.query.SqlQuery; import org.apache.ignite.cache.query.annotations.QuerySqlField; import org.apache.ignite.cluster.ClusterNode; import org.apache.ignite.configuration.CacheConfiguration; -import org.apache.ignite.internal.processors.cache.GridCacheProcessor; import org.apache.ignite.internal.processors.cache.IgniteCacheProxy; -import org.apache.ignite.internal.processors.cache.IgniteInternalCache; import org.apache.ignite.internal.processors.cache.query.GridCacheSqlIndexMetadata; import org.apache.ignite.internal.processors.cache.query.GridCacheSqlMetadata; import org.apache.ignite.internal.processors.rest.handlers.GridRestCommandHandler; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.internal.util.typedef.internal.U; +import org.apache.ignite.internal.util.typedef.P1; import org.apache.ignite.lang.IgniteBiPredicate; import org.apache.ignite.lang.IgnitePredicate; import org.apache.ignite.testframework.GridTestUtils; @@ -919,14 +918,16 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro } /** - * @param meta Metadata for Ignite cache. + * @param metas Metadata for Ignite caches. * @throws Exception If failed. */ - private void testMetadata(GridCacheSqlMetadata meta) throws Exception { + private void testMetadata(Collection metas) throws Exception { Map params = F.asMap("cmd", GridRestCommand.CACHE_METADATA.key()); - if (meta.cacheName() != null) - params.put("cacheName", meta.cacheName()); + String cacheNameArg = F.first(metas).cacheName(); + + if (cacheNameArg != null) + params.put("cacheName", cacheNameArg); String ret = content(params); @@ -935,53 +936,68 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro info("Cache metadata result: " + ret); - jsonEquals(ret, pattern("\\{.+\\}", true)); + jsonEquals(ret, pattern("\\[.+\\]", true)); + + Collection results = (Collection)JSONObject.fromObject(ret).get("response"); + + assertEquals(metas.size(), results.size()); + assertEquals(cacheNameArg, F.first(results).get("cacheName")); + + for (Map res : results) { + final Object cacheName = res.get("cacheName"); - Map res = (Map)JSONObject.fromObject(ret).get("response"); + GridCacheSqlMetadata meta = F.find(metas, null, new P1() { + @Override public boolean apply(GridCacheSqlMetadata meta) { + return F.eq(meta.cacheName(), cacheName); + } + }); - Collection types = (Collection)res.get("types"); + assertNotNull("REST return metadata for unexpected cache: " + cacheName, meta); - assertNotNull(types); - assertEqualsCollections(meta.types(), types); + Collection types = (Collection)res.get("types"); - Map keyClasses = (Map)res.get("keyClasses"); + assertNotNull(types); + assertEqualsCollections(meta.types(), types); - assertNotNull(keyClasses); - assertTrue(meta.keyClasses().equals(keyClasses)); + Map keyClasses = (Map)res.get("keyClasses"); - Map valClasses = (Map)res.get("valClasses"); + assertNotNull(keyClasses); + assertTrue(meta.keyClasses().equals(keyClasses)); - assertNotNull(valClasses); - assertTrue(meta.valClasses().equals(valClasses)); + Map valClasses = (Map)res.get("valClasses"); - Map fields = (Map)res.get("fields"); + assertNotNull(valClasses); + assertTrue(meta.valClasses().equals(valClasses)); - assertNotNull(fields); - assertTrue(meta.fields().equals(fields)); + Map fields = (Map)res.get("fields"); - Map indexesByType = (Map)res.get("indexes"); + assertNotNull(fields); + assertTrue(meta.fields().equals(fields)); - assertNotNull(indexesByType); - assertEquals(meta.indexes().size(), indexesByType.size()); + Map indexesByType = (Map)res.get("indexes"); - for (Map.Entry> metaIndexes : meta.indexes().entrySet()) { - Collection indexes = (Collection)indexesByType.get(metaIndexes.getKey()); + assertNotNull(indexesByType); + assertEquals(meta.indexes().size(), indexesByType.size()); - assertNotNull(indexes); - assertEquals(metaIndexes.getValue().size(), indexes.size()); + for (Map.Entry> metaIndexes : meta.indexes().entrySet()) { + Collection indexes = (Collection)indexesByType.get(metaIndexes.getKey()); - for (final GridCacheSqlIndexMetadata metaIdx : metaIndexes.getValue()) { - Map idx = F.find(indexes, null, new IgnitePredicate() { - @Override public boolean apply(Map map) { - return metaIdx.name().equals(map.get("name")); - } - }); + assertNotNull(indexes); + assertEquals(metaIndexes.getValue().size(), indexes.size()); - assertNotNull(idx); + for (final GridCacheSqlIndexMetadata metaIdx : metaIndexes.getValue()) { + Map idx = F.find(indexes, null, new P1() { + @Override public boolean apply(Map map) { + return metaIdx.name().equals(map.get("name")); + } + }); - assertEqualsCollections(metaIdx.fields(), (Collection)idx.get("fields")); - assertEqualsCollections(metaIdx.descendings(), (Collection)idx.get("descendings")); - assertEquals(metaIdx.unique(), idx.get("unique")); + assertNotNull(idx); + + assertEqualsCollections(metaIdx.fields(), (Collection)idx.get("fields")); + assertEqualsCollections(metaIdx.descendings(), (Collection)idx.get("descendings")); + assertEquals(metaIdx.unique(), idx.get("unique")); + } } } } @@ -990,16 +1006,13 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro * @throws Exception If failed. */ public void testMetadataLocal() throws Exception { - GridCacheProcessor cacheProc = grid(0).context().cache(); + IgniteCacheProxy cache = F.first(grid(0).context().cache().publicCaches()); - for (IgniteInternalCache cache : cacheProc.caches()) { - if (CU.isSystemCache(cache.name())) - continue; + assertNotNull("Should have configured public cache!", cache); - GridCacheSqlMetadata meta = F.first(cache.context().queries().sqlMetadata()); + Collection meta = cache.context().queries().sqlMetadata(); - testMetadata(meta); - } + testMetadata(meta); } /** @@ -1013,9 +1026,9 @@ public abstract class JettyRestProcessorAbstractSelfTest extends AbstractRestPro IgniteCacheProxy c = (IgniteCacheProxy)grid(1).createCache(partialCacheCfg); - GridCacheSqlMetadata meta = F.first(c.context().queries().sqlMetadata()); + Collection metas = c.context().queries().sqlMetadata(); - testMetadata(meta); + testMetadata(metas); } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/354358cc/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java index 6aba211..cd2f49c 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java @@ -1594,7 +1594,7 @@ public class GridDiscoveryManager extends GridManagerAdapter { /** * @param node Node to check. - * @return Cache names accessible on the given node. + * @return Public cache names accessible on the given node. */ public Map nodeCaches(ClusterNode node) { Map caches = U.newHashMap(registeredCaches.size()); @@ -1604,7 +1604,8 @@ public class GridDiscoveryManager extends GridManagerAdapter { CachePredicate pred = entry.getValue(); - if (pred != null && pred.cacheNode(node)) + if (!CU.isSystemCache(cacheName) && !CU.isIgfsCache(ctx.config(), cacheName) && + pred != null && pred.cacheNode(node)) caches.put(cacheName, pred.cacheMode); } http://git-wip-us.apache.org/repos/asf/ignite/blob/354358cc/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java index 1bbc754..65dca08 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java @@ -18,10 +18,13 @@ package org.apache.ignite.internal.processors.rest.handlers.cache; import java.io.Serializable; +import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.EnumSet; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -35,10 +38,18 @@ import org.apache.ignite.cache.CacheMetrics; import org.apache.ignite.cache.CacheMode; import org.apache.ignite.cache.CachePeekMode; import org.apache.ignite.cluster.ClusterGroup; +import org.apache.ignite.cluster.ClusterNode; +import org.apache.ignite.compute.ComputeJob; +import org.apache.ignite.compute.ComputeJobAdapter; +import org.apache.ignite.compute.ComputeJobResult; +import org.apache.ignite.compute.ComputeTaskAdapter; import org.apache.ignite.internal.GridKernalContext; +import org.apache.ignite.internal.IgniteEx; import org.apache.ignite.internal.IgniteInternalFuture; import org.apache.ignite.internal.IgniteKernal; +import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager; import org.apache.ignite.internal.processors.cache.GridCacheAdapter; +import org.apache.ignite.internal.processors.cache.IgniteCacheProxy; import org.apache.ignite.internal.processors.cache.IgniteInternalCache; import org.apache.ignite.internal.processors.cache.query.GridCacheSqlMetadata; import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx; @@ -370,20 +381,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter { } case CACHE_METADATA: { - IgniteInternalCache cache = ctx.cache().cache(cacheName); - - if (cache != null) { - GridCacheSqlMetadata res = F.first(cache.context().queries().sqlMetadata()); - - fut = new GridFinishedFuture<>(new GridRestResponse(res)); - } - else { - ClusterGroup prj = ctx.grid().cluster().forDataNodes(cacheName); - - ctx.task().setThreadContext(TC_NO_FAILOVER, true); - - fut = ctx.closure().callAsync(BALANCE, new MetadataCommand(cacheName), prj.nodes()); - } + fut = ctx.task().execute(MetadataTask.class, cacheName); break; } @@ -903,27 +901,109 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter { } /** */ - private static class MetadataCommand implements Callable, Serializable { + @GridInternal + private static class MetadataTask extends ComputeTaskAdapter { /** */ private static final long serialVersionUID = 0L; /** */ - private final String cacheName; + @IgniteInstanceResource + private IgniteEx ignite; /** */ - @IgniteInstanceResource - private Ignite g; + private String cacheName; - /** - * @param cacheName Cache name. - */ - private MetadataCommand(String cacheName) { + /** {@inheritDoc} */ + @Nullable @Override public Map map(List subgrid, + @Nullable String cacheName) throws IgniteException { this.cacheName = cacheName; + + GridDiscoveryManager discovery = ignite.context().discovery(); + + boolean sameCaches = true; + + int hash = discovery.nodeCaches(F.first(subgrid)).hashCode(); + + for (int i = 1; i < subgrid.size(); i++) { + if (hash != discovery.nodeCaches(subgrid.get(i)).hashCode()) { + sameCaches = false; + + break; + } + } + + Map map = U.newHashMap(sameCaches ? 1 : subgrid.size()); + + if (sameCaches) + map.put(new MetadataJob(), ignite.localNode()); + else { + for (ClusterNode node : subgrid) + map.put(new MetadataJob(), node); + } + + return map; } /** {@inheritDoc} */ - @Override public GridRestResponse call() throws Exception { - return new GridRestResponse(F.first(cache(g, cacheName).context().queries().sqlMetadata())); + @SuppressWarnings("ThrowableResultOfMethodCallIgnored") + @Nullable @Override public GridRestResponse reduce(List results) throws IgniteException { + Map map = new HashMap<>(); + + for (ComputeJobResult r : results) { + if (!r.isCancelled() && r.getException() == null) { + for (GridCacheSqlMetadata m : r.>getData()) { + if (!map.containsKey(m.cacheName())) + map.put(m.cacheName(), m); + } + } + } + + Collection metas = new ArrayList<>(map.size()); + + // Metadata for current cache must be first in list. + GridCacheSqlMetadata cacheMeta = map.remove(cacheName); + + if (cacheMeta != null) + metas.add(cacheMeta); + + metas.addAll(map.values()); + + return new GridRestResponse(metas); + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(MetadataTask.class, this); + } + } + + /** */ + private static class MetadataJob extends ComputeJobAdapter { + /** */ + private static final long serialVersionUID = 0L; + + /** Auto-injected grid instance. */ + @IgniteInstanceResource + private transient IgniteEx ignite; + + /** {@inheritDoc} */ + @Override public Collection execute() { + IgniteCacheProxy cache = F.first(ignite.context().cache().publicCaches()); + + if (cache == null) + return Collections.emptyList(); + + try { + return cache.context().queries().sqlMetadata(); + } + catch (IgniteCheckedException e) { + throw U.convertException(e); + } + } + + /** {@inheritDoc} */ + @Override public String toString() { + return S.toString(MetadataJob.class, this); } } http://git-wip-us.apache.org/repos/asf/ignite/blob/354358cc/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/top/GridTopologyCommandHandler.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/top/GridTopologyCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/top/GridTopologyCommandHandler.java index eea29d2..f950ac2 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/top/GridTopologyCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/top/GridTopologyCommandHandler.java @@ -44,7 +44,6 @@ import org.apache.ignite.internal.processors.rest.request.GridRestTopologyReques import org.apache.ignite.internal.util.future.GridFinishedFuture; import org.apache.ignite.internal.util.typedef.F; import org.apache.ignite.internal.util.typedef.P1; -import org.apache.ignite.internal.util.typedef.internal.CU; import org.apache.ignite.internal.util.typedef.internal.S; import org.apache.ignite.internal.util.typedef.internal.U; import org.apache.ignite.spi.IgnitePortProtocol; @@ -202,9 +201,6 @@ public class GridTopologyCommandHandler extends GridRestCommandHandlerAdapter { for (Map.Entry cache : nodeCaches.entrySet()) { String cacheName = cache.getKey(); - if (CU.isSystemCache(cacheName) || CU.isIgfsCache(ctx.config(), cacheName)) - continue; - String mode = cache.getValue().toString(); if (cacheName != null)