You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2017/08/14 11:48:48 UTC

[01/11] ignite git commit: IGNITE-5961 - Fixed pages() method for FilePageStore

Repository: ignite
Updated Branches:
  refs/heads/ignite-5872-5578 64de3ff31 -> 95a425c1b


IGNITE-5961 - Fixed pages() method for FilePageStore


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/7199037d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/7199037d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/7199037d

Branch: refs/heads/ignite-5872-5578
Commit: 7199037d23e6a9115c6b085fb03a3633c73f863d
Parents: a7ac59f
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Thu Aug 10 18:13:17 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Thu Aug 10 18:13:17 2017 +0300

----------------------------------------------------------------------
 .../internal/processors/cache/persistence/file/FilePageStore.java  | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/7199037d/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStore.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStore.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStore.java
index 7fe1ffe..e6c5379 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStore.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/file/FilePageStore.java
@@ -535,6 +535,6 @@ public class FilePageStore implements PageStore {
         if (!inited)
             return 0;
 
-        return (int)(allocated.get() / pageSize);
+        return (int)(allocated.get() - headerSize()) / pageSize;
     }
 }


[10/11] ignite git commit: IGNITE-4991 Do not print out system properties when IGNITE_TO_STRING_INCLUDE_SENSITIVE is set to false. This closes #2428.

Posted by ag...@apache.org.
IGNITE-4991 Do not print out system properties when IGNITE_TO_STRING_INCLUDE_SENSITIVE is set to false. This closes #2428.

Signed-off-by: nikolay_tikhonov <nt...@gridgain.com>


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/18e79e5c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/18e79e5c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/18e79e5c

Branch: refs/heads/ignite-5872-5578
Commit: 18e79e5cbd0c861e9d8832a654b2dec9338a86d6
Parents: 44d60f5
Author: Evgenii Zhuravlev <E....@gmail.com>
Authored: Mon Aug 14 14:13:46 2017 +0300
Committer: nikolay_tikhonov <nt...@gridgain.com>
Committed: Mon Aug 14 14:13:46 2017 +0300

----------------------------------------------------------------------
 .../src/main/java/org/apache/ignite/internal/IgniteKernal.java   | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/18e79e5c/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index f5111c3..bae8b74 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -2353,7 +2353,7 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
     private void ackSystemProperties() {
         assert log != null;
 
-        if (log.isDebugEnabled())
+        if (log.isDebugEnabled() && S.INCLUDE_SENSITIVE)
             for (Map.Entry<Object, Object> entry : snapshot().entrySet())
                 log.debug("System property [" + entry.getKey() + '=' + entry.getValue() + ']');
     }
@@ -2558,7 +2558,7 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
         assert log != null;
 
         // Ack IGNITE_HOME and VM arguments.
-        if (log.isInfoEnabled()) {
+        if (log.isInfoEnabled() && S.INCLUDE_SENSITIVE) {
             log.info("IGNITE_HOME=" + cfg.getIgniteHome());
             log.info("VM arguments: " + rtBean.getInputArguments());
         }


[05/11] ignite git commit: IGNITE-6013 Optimized processing response from cluster.

Posted by ag...@apache.org.
IGNITE-6013 Optimized processing response from cluster.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/b02c4812
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/b02c4812
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/b02c4812

Branch: refs/heads/ignite-5872-5578
Commit: b02c4812d9c145cf127eeaf54ab64709d230a3c7
Parents: 3a390c8
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Fri Aug 11 11:18:42 2017 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Fri Aug 11 11:18:42 2017 +0700

----------------------------------------------------------------------
 .../console/agent/handlers/ClusterListener.java |  13 +-
 .../ignite/console/agent/rest/RestExecutor.java | 201 +++++++++++++++++--
 2 files changed, 194 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/b02c4812/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/handlers/ClusterListener.java
----------------------------------------------------------------------
diff --git a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/handlers/ClusterListener.java b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/handlers/ClusterListener.java
index b811a2d..435ce74 100644
--- a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/handlers/ClusterListener.java
+++ b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/handlers/ClusterListener.java
@@ -46,7 +46,7 @@ import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_BUILD_VER;
 import static org.apache.ignite.internal.processors.rest.GridRestResponse.STATUS_SUCCESS;
 
 /**
- * API to retranslate topology from Ignite cluster available by node-uri.
+ * API to transfer topology from Ignite cluster available by node-uri.
  */
 public class ClusterListener {
     /** */
@@ -65,7 +65,7 @@ public class ClusterListener {
     private static final long DFLT_TIMEOUT = 3000L;
 
     /** JSON object mapper. */
-    private static final ObjectMapper mapper = new GridJettyObjectMapper();
+    private static final ObjectMapper MAPPER = new GridJettyObjectMapper();
 
     /** Latest topology snapshot. */
     private TopologySnapshot top;
@@ -234,10 +234,7 @@ public class ClusterListener {
 
         /**  */
         boolean differentCluster(TopologySnapshot old) {
-            if (old == null || F.isEmpty(old.nids))
-                return true;
-
-            return Collections.disjoint(nids, old.nids);
+            return old == null || F.isEmpty(old.nids) || Collections.disjoint(nids, old.nids);
         }
     }
 
@@ -250,7 +247,7 @@ public class ClusterListener {
 
                 switch (res.getStatus()) {
                     case STATUS_SUCCESS:
-                        List<GridClientNodeBean> nodes = mapper.readValue(res.getData(),
+                        List<GridClientNodeBean> nodes = MAPPER.readValue(res.getData(),
                             new TypeReference<List<GridClientNodeBean>>() {});
 
                         TopologySnapshot newTop = new TopologySnapshot(nodes);
@@ -290,7 +287,7 @@ public class ClusterListener {
 
                 switch (res.getStatus()) {
                     case STATUS_SUCCESS:
-                        List<GridClientNodeBean> nodes = mapper.readValue(res.getData(),
+                        List<GridClientNodeBean> nodes = MAPPER.readValue(res.getData(),
                             new TypeReference<List<GridClientNodeBean>>() {});
 
                         TopologySnapshot newTop = new TopologySnapshot(nodes);

http://git-wip-us.apache.org/repos/asf/ignite/blob/b02c4812/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/rest/RestExecutor.java
----------------------------------------------------------------------
diff --git a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/rest/RestExecutor.java b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/rest/RestExecutor.java
index 03eca4e..13989b4 100644
--- a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/rest/RestExecutor.java
+++ b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/rest/RestExecutor.java
@@ -17,9 +17,16 @@
 
 package org.apache.ignite.console.agent.rest;
 
-import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.core.JsonFactory;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonToken;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.JsonDeserializer;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 import java.io.IOException;
+import java.io.StringWriter;
 import java.net.ConnectException;
 import java.util.HashMap;
 import java.util.Map;
@@ -40,6 +47,9 @@ import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.logger.slf4j.Slf4jLogger;
 import org.slf4j.LoggerFactory;
 
+import static com.fasterxml.jackson.core.JsonToken.END_ARRAY;
+import static com.fasterxml.jackson.core.JsonToken.END_OBJECT;
+import static com.fasterxml.jackson.core.JsonToken.START_ARRAY;
 import static org.apache.ignite.internal.processors.rest.GridRestResponse.STATUS_AUTH_FAILED;
 import static org.apache.ignite.internal.processors.rest.GridRestResponse.STATUS_FAILED;
 import static org.apache.ignite.internal.processors.rest.GridRestResponse.STATUS_SUCCESS;
@@ -52,7 +62,7 @@ public class RestExecutor {
     private static final IgniteLogger log = new Slf4jLogger(LoggerFactory.getLogger(RestExecutor.class));
 
     /** JSON object mapper. */
-    private static final ObjectMapper mapper = new GridJettyObjectMapper();
+    private static final ObjectMapper MAPPER = new GridJettyObjectMapper();
 
     /** */
     private final OkHttpClient httpClient;
@@ -141,34 +151,35 @@ public class RestExecutor {
         reqBuilder.url(urlBuilder.build());
 
         try (Response resp = httpClient.newCall(reqBuilder.build()).execute()) {
-            String content = resp.body().string();
-
             if (resp.isSuccessful()) {
-                JsonNode node = mapper.readTree(content);
+                RestResponseHolder res = MAPPER.readValue(resp.body().byteStream(), RestResponseHolder.class);
 
-                int status = node.get("successStatus").asInt();
+                int status = res.getSuccessStatus();
 
                 switch (status) {
                     case STATUS_SUCCESS:
-                        return RestResult.success(node.get("response").toString());
+                        return RestResult.success(res.getResponse());
 
                     default:
-                        return RestResult.fail(status, node.get("error").asText());
+                        return RestResult.fail(status, res.getError());
                 }
             }
 
             if (resp.code() == 401)
-                return RestResult.fail(STATUS_AUTH_FAILED, "Failed to authenticate in grid. " +
+                return RestResult.fail(STATUS_AUTH_FAILED, "Failed to authenticate in cluster. " +
                     "Please check agent\'s login and password or node port.");
 
-            return RestResult.fail(STATUS_FAILED, "Failed connect to node and execute REST command.");
+            if (resp.code() == 404)
+                return RestResult.fail(STATUS_FAILED, "Failed connect to cluster.");
+
+            return RestResult.fail(STATUS_FAILED, "Failed to execute REST command: " + resp.message());
         }
         catch (ConnectException ignored) {
-            LT.warn(log, "Failed connect to node and execute REST command. " +
+            LT.warn(log, "Failed connect to cluster. " +
                 "Please ensure that nodes have [ignite-rest-http] module in classpath " +
                 "(was copied from libs/optional to libs folder).");
 
-            throw new ConnectException("Failed connect to node and execute REST command [url=" + urlBuilder + ", parameters=" + params + "]");
+            throw new ConnectException("Failed connect to cluster [url=" + urlBuilder + ", parameters=" + params + "]");
         }
     }
 
@@ -208,4 +219,170 @@ public class RestExecutor {
 
         return sendRequest(demo, "ignite", params, null, null);
     }
+
+    /**
+     * REST response holder Java bean.
+     */
+    private static class RestResponseHolder {
+        /** Success flag */
+        private int successStatus;
+
+        /** Error. */
+        private String err;
+
+        /** Response. */
+        private String res;
+
+        /** Session token string representation. */
+        private String sesTokStr;
+
+        /**
+         * @return {@code True} if this request was successful.
+         */
+        public int getSuccessStatus() {
+            return successStatus;
+        }
+
+        /**
+         * @param successStatus Whether request was successful.
+         */
+        public void setSuccessStatus(int successStatus) {
+            this.successStatus = successStatus;
+        }
+
+        /**
+         * @return Error.
+         */
+        public String getError() {
+            return err;
+        }
+
+        /**
+         * @param err Error.
+         */
+        public void setError(String err) {
+            this.err = err;
+        }
+
+        /**
+         * @return Response object.
+         */
+        public String getResponse() {
+            return res;
+        }
+
+        /**
+         * @param res Response object.
+         */
+        @JsonDeserialize(using = RawContentDeserializer.class)
+        public void setResponse(String res) {
+            this.res = res;
+        }
+
+        /**
+         * @return String representation of session token.
+         */
+        public String getSessionToken() {
+            return sesTokStr;
+        }
+
+        /**
+         * @param sesTokStr String representation of session token.
+         */
+        public void setSessionToken(String sesTokStr) {
+            this.sesTokStr = sesTokStr;
+        }
+    }
+
+    /**
+     * Raw content deserializer that will deserialize any data as string.
+     */
+    private static class RawContentDeserializer extends JsonDeserializer<String> {
+        /** */
+        private final JsonFactory factory = new JsonFactory();
+
+        /**
+         * @param tok Token to process.
+         * @param p Parser.
+         * @param gen Generator.
+         */
+        private void writeToken(JsonToken tok, JsonParser p, JsonGenerator gen) throws IOException {
+            switch (tok) {
+                case FIELD_NAME:
+                    gen.writeFieldName(p.getText());
+                    break;
+
+                case START_ARRAY:
+                    gen.writeStartArray();
+                    break;
+
+                case END_ARRAY:
+                    gen.writeEndArray();
+                    break;
+
+                case START_OBJECT:
+                    gen.writeStartObject();
+                    break;
+
+                case END_OBJECT:
+                    gen.writeEndObject();
+                    break;
+
+                case VALUE_NUMBER_INT:
+                    gen.writeNumber(p.getLongValue());
+                    break;
+
+                case VALUE_NUMBER_FLOAT:
+                    gen.writeNumber(p.getDoubleValue());
+                    break;
+
+                case VALUE_TRUE:
+                    gen.writeBoolean(true);
+                    break;
+
+                case VALUE_FALSE:
+                    gen.writeBoolean(false);
+                    break;
+
+                case VALUE_NULL:
+                    gen.writeNull();
+                    break;
+
+                default:
+                    gen.writeString(p.getText());
+            }
+        }
+
+        /** {@inheritDoc} */
+        @Override public String deserialize(JsonParser p, DeserializationContext ctxt) throws IOException {
+            JsonToken startTok = p.getCurrentToken();
+
+            if (startTok.isStructStart()) {
+                StringWriter wrt = new StringWriter(4096);
+
+                JsonGenerator gen = factory.createGenerator(wrt);
+
+                JsonToken tok = startTok, endTok = startTok == START_ARRAY ? END_ARRAY : END_OBJECT;
+
+                int cnt = 1;
+
+                while (cnt > 0) {
+                    writeToken(tok, p, gen);
+
+                    tok = p.nextToken();
+
+                    if (tok == startTok)
+                        cnt++;
+                    else if (tok == endTok)
+                        cnt--;
+                }
+
+                gen.close();
+
+                return wrt.toString();
+            }
+
+            return p.getValueAsString();
+        }
+    }
 }


[07/11] ignite git commit: IGNITE-6016 Get rid of checking topology hash in ackTopology - Fixes #2424.

Posted by ag...@apache.org.
IGNITE-6016 Get rid of checking topology hash in ackTopology - Fixes #2424.

Signed-off-by: Alexey Goncharuk <al...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/199339eb
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/199339eb
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/199339eb

Branch: refs/heads/ignite-5872-5578
Commit: 199339ebcf93452df4363f6fe4f70cb02cf10bfd
Parents: ad9e210
Author: Ivan Rakov <iv...@gmail.com>
Authored: Mon Aug 14 12:01:08 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Mon Aug 14 12:01:08 2017 +0300

----------------------------------------------------------------------
 .../discovery/GridDiscoveryManager.java         | 39 ++------------------
 .../ignite/internal/GridDiscoverySelfTest.java  | 30 ---------------
 2 files changed, 4 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/199339eb/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 ebfe339..834ba4d 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
@@ -83,6 +83,7 @@ import org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor;
 import org.apache.ignite.internal.processors.jobmetrics.GridJobMetrics;
 import org.apache.ignite.internal.processors.security.SecurityContext;
 import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
+import org.apache.ignite.internal.util.GridAtomicLong;
 import org.apache.ignite.internal.util.GridBoundedConcurrentLinkedHashMap;
 import org.apache.ignite.internal.util.GridSpinBusyLock;
 import org.apache.ignite.internal.util.future.GridFinishedFuture;
@@ -205,7 +206,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
     private IgniteThread segChkThread;
 
     /** Last logged topology. */
-    private final AtomicLong lastLoggedTop = new AtomicLong();
+    private final GridAtomicLong lastLoggedTop = new GridAtomicLong();
 
     /** Local node. */
     private ClusterNode locNode;
@@ -1449,11 +1450,9 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
 
         Collection<ClusterNode> allNodes = discoCache.allNodes();
 
-        long hash = topologyHash(allNodes);
-
         // Prevent ack-ing topology for the same topology.
         // Can happen only during node startup.
-        if (throttle && lastLoggedTop.getAndSet(hash) == hash)
+        if (throttle && !lastLoggedTop.setIfGreater(topVer))
             return;
 
         int totalCpus = cpus(allNodes);
@@ -1474,8 +1473,7 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
                 (ctx.igniteInstanceName() == null ? "default" : ctx.igniteInstanceName()) + U.nl() +
                 ">>> Number of server nodes: " + srvNodes.size() + U.nl() +
                 ">>> Number of client nodes: " + clientNodes.size() + U.nl() +
-                (discoOrdered ? ">>> Topology version: " + topVer + U.nl() : "") +
-                ">>> Topology hash: 0x" + Long.toHexString(hash).toUpperCase() + U.nl();
+                (discoOrdered ? ">>> Topology version: " + topVer + U.nl() : "");
 
             dbg += ">>> Local: " +
                 locNode.id().toString().toUpperCase() + ", " +
@@ -1686,35 +1684,6 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
     }
 
     /**
-     * Gets topology hash for given set of nodes.
-     *
-     * @param nodes Subset of grid nodes for hashing.
-     * @return Hash for given topology.
-     */
-    public long topologyHash(Iterable<? extends ClusterNode> nodes) {
-        assert nodes != null;
-
-        Iterator<? extends ClusterNode> iter = nodes.iterator();
-
-        if (!iter.hasNext())
-            return 0; // Special case.
-
-        List<String> uids = new ArrayList<>();
-
-        for (ClusterNode node : nodes)
-            uids.add(node.id().toString());
-
-        Collections.sort(uids);
-
-        CRC32 hash = new CRC32();
-
-        for (String uuid : uids)
-            hash.update(uuid.getBytes());
-
-        return hash.getValue();
-    }
-
-    /**
      * Gets future that will be completed when current topology version becomes greater or equal to argument passed.
      *
      * @param awaitVer Topology version to await.

http://git-wip-us.apache.org/repos/asf/ignite/blob/199339eb/modules/core/src/test/java/org/apache/ignite/internal/GridDiscoverySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/GridDiscoverySelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/GridDiscoverySelfTest.java
index 5822ce7..e6b678b 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/GridDiscoverySelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/GridDiscoverySelfTest.java
@@ -123,36 +123,6 @@ public class GridDiscoverySelfTest extends GridCommonAbstractTest {
     /**
      * @throws Exception If failed.
      */
-    public void testGetTopologyHash() throws Exception {
-        int hashCnt = 5000;
-
-        Random rand = new Random();
-
-        Collection<Long> hashes = new HashSet<>(hashCnt, 1.0f);
-
-        for (int i = 0; i < hashCnt; i++) {
-            // Max topology of 10 nodes.
-            int size = rand.nextInt(10) + 1;
-
-            Collection<ClusterNode> nodes = new ArrayList<>(size);
-
-            for (int j = 0; j < size; j++)
-                nodes.add(new GridDiscoveryTestNode());
-
-            @SuppressWarnings("deprecation")
-            long hash = ((IgniteKernal) ignite).context().discovery().topologyHash(nodes);
-
-            boolean isHashed = hashes.add(hash);
-
-            assert isHashed : "Duplicate hash [hash=" + hash + ", topSize=" + size + ", iteration=" + i + ']';
-        }
-
-        info("No duplicates found among '" + hashCnt + "' hashes.");
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
     @SuppressWarnings({"SuspiciousMethodCalls"})
     public void testGetLocalNode() throws Exception {
         ClusterNode node = ignite.cluster().localNode();


[06/11] ignite git commit: IGNITE-5941 - Fixed index name length restrictions. This closes #2408

Posted by ag...@apache.org.
IGNITE-5941 - Fixed index name length restrictions. This closes #2408


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/ad9e2101
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/ad9e2101
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/ad9e2101

Branch: refs/heads/ignite-5872-5578
Commit: ad9e21013fffd3553991521476970ee315f3af34
Parents: b02c481
Author: Ilya Lantukh <il...@gridgain.com>
Authored: Mon Aug 14 11:32:11 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Mon Aug 14 11:32:11 2017 +0300

----------------------------------------------------------------------
 .../ignite/internal/pagemem/PageUtils.java      |  26 +++
 .../cache/persistence/MetadataStorage.java      |  12 +-
 .../cache/index/LongIndexNameTest.java          | 212 +++++++++++++++++++
 .../IgniteCacheQuerySelfTestSuite.java          |   2 +
 4 files changed, 246 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/ad9e2101/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java
index 3fa5954..362ac54 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java
@@ -37,6 +37,19 @@ public class PageUtils {
     }
 
     /**
+     *
+     * @param addr Start address.
+     * @param off Offset.
+     * @return Byte value from given address.
+     */
+    public static int getUnsignedByte(long addr, int off) {
+        assert addr > 0 : addr;
+        assert off >= 0;
+
+        return GridUnsafe.getByte(addr + off) & 0xFF;
+    }
+
+    /**
      * @param addr Start address.
      * @param off Offset.
      * @param len Bytes length.
@@ -168,6 +181,19 @@ public class PageUtils {
      * @param off Offset.
      * @param v Value.
      */
+    public static void putUnsignedByte(long addr, int off, int v) {
+        assert addr > 0 : addr;
+        assert off >= 0;
+        assert v >= 0 && v <= 255;
+
+        GridUnsafe.putByte(addr + off, (byte) v);
+    }
+
+    /**
+     * @param addr Address.
+     * @param off Offset.
+     * @param v Value.
+     */
     public static void putShort(long addr, int off, short v) {
         assert addr > 0 : addr;
         assert off >= 0;

http://git-wip-us.apache.org/repos/asf/ignite/blob/ad9e2101/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/MetadataStorage.java
----------------------------------------------------------------------
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 743f3b9..498ecdd 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
@@ -39,7 +39,7 @@ import org.apache.ignite.internal.util.typedef.internal.U;
  */
 public class MetadataStorage implements MetaStore {
     /** Max index name length (bytes num) */
-    public static final int MAX_IDX_NAME_LEN = 768;
+    public static final int MAX_IDX_NAME_LEN = 255;
 
     /** Bytes in byte. */
     private static final int BYTE_LEN = 1;
@@ -197,7 +197,7 @@ public class MetadataStorage implements MetaStore {
             int shift = 0;
 
             // Compare index names.
-            final byte len = PageUtils.getByte(pageAddr, off + shift);
+            final int len = PageUtils.getUnsignedByte(pageAddr, off + shift);
 
             shift += BYTE_LEN;
 
@@ -256,7 +256,7 @@ public class MetadataStorage implements MetaStore {
         final IndexItem row
     ) {
         // Index name length.
-        PageUtils.putByte(pageAddr, off, (byte)row.idxName.length);
+        PageUtils.putUnsignedByte(pageAddr, off, row.idxName.length);
         off++;
 
         // Index name.
@@ -282,10 +282,10 @@ public class MetadataStorage implements MetaStore {
         int srcOff
     ) {
         // Index name length.
-        final byte len = PageUtils.getByte(srcPageAddr, srcOff);
+        final int len = PageUtils.getUnsignedByte(srcPageAddr, srcOff);
         srcOff++;
 
-        PageUtils.putByte(dstPageAddr, dstOff, len);
+        PageUtils.putUnsignedByte(dstPageAddr, dstOff, len);
         dstOff++;
 
         PageHandler.copyMemory(srcPageAddr, dstPageAddr, srcOff, dstOff, len);
@@ -305,7 +305,7 @@ public class MetadataStorage implements MetaStore {
      */
     private static IndexItem readRow(final long pageAddr, int off) {
         // Index name length.
-        final int len = PageUtils.getByte(pageAddr, off) & 0xFF;
+        final int len = PageUtils.getUnsignedByte(pageAddr, off) & 0xFF;
         off++;
 
         // Index name.

http://git-wip-us.apache.org/repos/asf/ignite/blob/ad9e2101/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/LongIndexNameTest.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/LongIndexNameTest.java b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/LongIndexNameTest.java
new file mode 100644
index 0000000..92883a4
--- /dev/null
+++ b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/index/LongIndexNameTest.java
@@ -0,0 +1,212 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.index;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.cache.QueryEntity;
+import org.apache.ignite.cache.QueryIndex;
+import org.apache.ignite.cache.affinity.rendezvous.RendezvousAffinityFunction;
+import org.apache.ignite.cache.query.QueryCursor;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.PersistentStoreConfiguration;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.jetbrains.annotations.NotNull;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+
+/**
+ *
+ */
+public class LongIndexNameTest extends GridCommonAbstractTest {
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        return super.getConfiguration(igniteInstanceName)
+            .setPersistentStoreConfiguration(new PersistentStoreConfiguration())
+            .setCacheConfiguration(new <String, Person>CacheConfiguration("cache")
+                .setQueryEntities(getIndexCfg())
+                .setAffinity(new RendezvousAffinityFunction(false, 16)));
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        super.beforeTest();
+
+        deleteWorkFiles();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        super.afterTest();
+
+        deleteWorkFiles();
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testLongIndexNames() throws Exception {
+        try {
+            Ignite ignite = startGrid(0);
+
+            IgniteCache cache = insertSomeData(ignite);
+
+            QueryCursor cursor1 = cache.query(new SqlFieldsQuery("SELECT * FROM Person where name like '%Name 0'"));
+            QueryCursor cursor1Idx = cache.query(new SqlFieldsQuery("SELECT * FROM Person where name = 'Name 0'"));
+
+            QueryCursor cursor2 = cache.query(new SqlFieldsQuery("SELECT * FROM Person where age like '%0'"));
+            QueryCursor cursor2Idx = cache.query(new SqlFieldsQuery("SELECT * FROM Person where age = 0"));
+
+            assertEquals(cursor1.getAll().size(), cursor1Idx.getAll().size());
+            assertEquals(cursor2.getAll().size(), cursor2Idx.getAll().size());
+
+            ignite.close();
+
+            Thread.sleep(2_000);
+
+            ignite = startGrid(0);
+
+            cache = insertSomeData(ignite);
+
+            cursor1 = cache.query(new SqlFieldsQuery("SELECT * FROM Person where name like '%Name 0'"));
+            cursor1Idx = cache.query(new SqlFieldsQuery("SELECT * FROM Person where name = 'Name 0'"));
+
+            cursor2 = cache.query(new SqlFieldsQuery("SELECT * FROM Person where age like '%0'"));
+            cursor2Idx = cache.query(new SqlFieldsQuery("SELECT * FROM Person where age = 0"));
+
+            assertEquals(cursor1.getAll().size(), cursor1Idx.getAll().size());
+            assertEquals(cursor2.getAll().size(), cursor2Idx.getAll().size());
+
+
+        }
+        finally {
+            stopAllGrids();
+        }
+    }
+
+    /**
+     *
+     */
+    @NotNull private IgniteCache insertSomeData(Ignite ignite) {
+        if (!ignite.active())
+            ignite.active(true);
+
+        IgniteCache<String, Person> cache = ignite.cache("cache");
+
+        for (int i=0; i<10; i++)
+            cache.put(String.valueOf(System.currentTimeMillis()), new Person("Name " + i, i));
+
+        return cache;
+    }
+
+    /**
+     *
+     */
+    public static List<QueryEntity> getIndexCfg() {
+        ArrayList<QueryEntity> entities = new ArrayList<>();
+
+        QueryEntity qe = new QueryEntity(String.class.getName(), Person.class.getName());
+
+        LinkedHashMap<String, String> fieldsMap = new LinkedHashMap<>();
+        fieldsMap.put("name", String.class.getName());
+        fieldsMap.put("age", Integer.class.getName());
+
+        qe.setFields(fieldsMap);
+
+        ArrayList<QueryIndex> indices = new ArrayList<>();
+        QueryIndex index = new QueryIndex("name", true, "LONG_NAME_123456789012345678901234567890" +
+            "12345678901234567890123456789012345678901234567890123456789012345678901234567890");
+
+        QueryIndex index2 = new QueryIndex("age", true, "AGE_IDX");
+        indices.add(index);
+        indices.add(index2);
+
+        qe.setIndexes(indices);
+
+        entities.add(qe);
+
+        return entities;
+    }
+
+    /**
+     * @throws IgniteCheckedException If failed.
+     */
+    private void deleteWorkFiles() throws IgniteCheckedException {
+        deleteRecursively(U.resolveWorkDirectory(U.defaultWorkDirectory(), "db", false));
+    }
+
+    /**
+     *
+     */
+    private static class Person {
+        /** */
+        private String name;
+
+        /** */
+        private int age;
+
+        /**
+         *
+         */
+        public Person() {
+            // No-op.
+        }
+
+        /**
+         * @param name Name.
+         * @param age Age.
+         */
+        public Person(String name, int age) {
+            this.name = name;
+            this.age = age;
+        }
+
+        /**
+         * @return Name.
+         */
+        public String getName() {
+            return name;
+        }
+
+        /**
+         * @param name Name.
+         */
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        /**
+         * @return Age.
+         */
+        public int getAge() {
+            return age;
+        }
+
+        /**
+         * @param age Age.
+         */
+        public void setAge(int age) {
+            this.age = age;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/ad9e2101/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
index 1ad0d4b..decc7d5 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteCacheQuerySelfTestSuite.java
@@ -108,6 +108,7 @@ import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComple
 import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerTransactionalPartitionedTest;
 import org.apache.ignite.internal.processors.cache.index.H2DynamicIndexingComplexServerTransactionalReplicatedTest;
 import org.apache.ignite.internal.processors.cache.index.H2DynamicTableSelfTest;
+import org.apache.ignite.internal.processors.cache.index.LongIndexNameTest;
 import org.apache.ignite.internal.processors.cache.index.SchemaExchangeSelfTest;
 import org.apache.ignite.internal.processors.cache.local.IgniteCacheLocalAtomicQuerySelfTest;
 import org.apache.ignite.internal.processors.cache.local.IgniteCacheLocalFieldsQuerySelfTest;
@@ -317,6 +318,7 @@ public class IgniteCacheQuerySelfTestSuite extends TestSuite {
         suite.addTestSuite(IgniteCacheDistributedPartitionQueryConfigurationSelfTest.class);
         suite.addTestSuite(IgniteSqlKeyValueFieldsTest.class);
         suite.addTestSuite(IgniteSqlRoutingTest.class);
+        suite.addTestSuite(LongIndexNameTest.class);
 
         return suite;
     }


[04/11] ignite git commit: IGNITE-6012 Refactored GridJettyRestHandler.processRequest(): replace mapper.writeValueAsString with writeValue(stream, v).

Posted by ag...@apache.org.
IGNITE-6012 Refactored GridJettyRestHandler.processRequest(): replace mapper.writeValueAsString with writeValue(stream, v).


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/3a390c8a
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/3a390c8a
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/3a390c8a

Branch: refs/heads/ignite-5872-5578
Commit: 3a390c8afa157a54bdcde62a30159baebea87fb4
Parents: ebb8765
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Fri Aug 11 11:07:26 2017 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Fri Aug 11 11:07:26 2017 +0700

----------------------------------------------------------------------
 .../http/jetty/GridJettyRestHandler.java        | 31 +++++++-------------
 1 file changed, 10 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/3a390c8a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
----------------------------------------------------------------------
diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
index c864a10..327c13a 100644
--- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
+++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java
@@ -34,6 +34,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.UUID;
 import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
 import javax.servlet.ServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -356,41 +357,29 @@ public class GridJettyRestHandler extends AbstractHandler {
 
             U.error(log, "Failed to process HTTP request [action=" + act + ", req=" + req + ']', e);
 
-            cmdRes = new GridRestResponse(STATUS_FAILED, e.getMessage());
-
             if (e instanceof Error)
                 throw (Error)e;
-        }
-
-        String json;
 
-        try {
-            json = jsonMapper.writeValueAsString(cmdRes);
+            cmdRes = new GridRestResponse(STATUS_FAILED, e.getMessage());
         }
-        catch (JsonProcessingException e1) {
-            U.error(log, "Failed to convert response to JSON: " + cmdRes, e1);
 
-            GridRestResponse resFailed = new GridRestResponse(STATUS_FAILED, e1.getMessage());
+        try {
+            ServletOutputStream os = res.getOutputStream();
 
             try {
-                json = jsonMapper.writeValueAsString(resFailed);
+                jsonMapper.writeValue(os, cmdRes);
             }
-            catch (JsonProcessingException e2) {
-                json = "{\"successStatus\": \"1\", \"error:\" \"" + e2.getMessage() + "\"}}";
-            }
-        }
-
-        try {
-            if (log.isDebugEnabled())
-                log.debug("Parsed command response into JSON object: " + json);
+            catch (JsonProcessingException e) {
+                U.error(log, "Failed to convert response to JSON: " + cmdRes, e);
 
-            res.getWriter().write(json);
+                jsonMapper.writeValue(os, F.asMap("successStatus", STATUS_FAILED, "error", e.getMessage()));
+            }
 
             if (log.isDebugEnabled())
                 log.debug("Processed HTTP request [action=" + act + ", jsonRes=" + cmdRes + ", req=" + req + ']');
         }
         catch (IOException e) {
-            U.error(log, "Failed to send HTTP response: " + json, e);
+            U.error(log, "Failed to send HTTP response: " + cmdRes, e);
         }
     }
 


[08/11] ignite git commit: IGNITE-5890 Added estimated time to rebalance completion and time to rebalance start to MXBean - Fixes #2386.

Posted by ag...@apache.org.
IGNITE-5890 Added estimated time to rebalance completion and time to rebalance start to MXBean - Fixes #2386.

Signed-off-by: Alexey Goncharuk <al...@gmail.com>


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/1e0d4a54
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/1e0d4a54
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/1e0d4a54

Branch: refs/heads/ignite-5872-5578
Commit: 1e0d4a542740dab6ab98b4e3b4df3a30563c3ceb
Parents: 199339e
Author: Dmitriy Govorukhin <dm...@gmail.com>
Authored: Mon Aug 14 12:12:46 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Mon Aug 14 12:12:46 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/cache/CacheMetrics.java   |  10 ++
 .../cache/CacheClusterMetricsMXBeanImpl.java    |  10 ++
 .../cache/CacheLocalMetricsMXBeanImpl.java      |  10 ++
 .../processors/cache/CacheMetricsImpl.java      |  36 +++++-
 .../processors/cache/CacheMetricsSnapshot.java  |  18 +++
 .../dht/preloader/GridDhtPartitionDemander.java |  22 +++-
 .../dht/preloader/GridDhtPreloader.java         |  18 +--
 .../cache/CacheGroupsMetricsRebalanceTest.java  | 118 +++++++++++++++++++
 8 files changed, 224 insertions(+), 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/1e0d4a54/modules/core/src/main/java/org/apache/ignite/cache/CacheMetrics.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/cache/CacheMetrics.java b/modules/core/src/main/java/org/apache/ignite/cache/CacheMetrics.java
index 0cff4a8..20ea692 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/CacheMetrics.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/CacheMetrics.java
@@ -506,6 +506,16 @@ public interface CacheMetrics {
     public long getRebalancingBytesRate();
 
     /**
+     * @return Estimated rebalancing finished time.
+     */
+    public long estimateRebalancingFinishTime();
+
+    /**
+     * @return Rebalancing start time.
+     */
+    public long rebalancingStartTime();
+
+    /**
      * Checks whether statistics collection is enabled in this cache.
      * <p>
      * The default value is {@code false}.

http://git-wip-us.apache.org/repos/asf/ignite/blob/1e0d4a54/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClusterMetricsMXBeanImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClusterMetricsMXBeanImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClusterMetricsMXBeanImpl.java
index 266c577..df4a6ab 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClusterMetricsMXBeanImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheClusterMetricsMXBeanImpl.java
@@ -382,4 +382,14 @@ class CacheClusterMetricsMXBeanImpl implements CacheMetricsMXBean {
     @Override public long getRebalancingBytesRate() {
         return cache.clusterMetrics().getRebalancingBytesRate();
     }
+
+    /** {@inheritDoc} */
+    @Override public long estimateRebalancingFinishTime() {
+        return cache.clusterMetrics().estimateRebalancingFinishTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long rebalancingStartTime() {
+        return cache.clusterMetrics().rebalancingStartTime();
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/1e0d4a54/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheLocalMetricsMXBeanImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheLocalMetricsMXBeanImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheLocalMetricsMXBeanImpl.java
index f363bfe..a767193 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheLocalMetricsMXBeanImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheLocalMetricsMXBeanImpl.java
@@ -382,4 +382,14 @@ class CacheLocalMetricsMXBeanImpl implements CacheMetricsMXBean {
     @Override public long getRebalancingBytesRate() {
         return cache.metrics0().getRebalancingBytesRate();
     }
+
+    /** {@inheritDoc} */
+    @Override public long estimateRebalancingFinishTime() {
+        return cache.metrics0().estimateRebalancingFinishTime();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long rebalancingStartTime() {
+        return cache.metrics0().rebalancingStartTime();
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/1e0d4a54/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java
index 6a8ae0b..d03a6f8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsImpl.java
@@ -29,6 +29,7 @@ import org.apache.ignite.internal.processors.cache.ratemetrics.HitRateMetrics;
 import org.apache.ignite.internal.processors.cache.store.GridCacheWriteBehindStore;
 import org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
 
 /**
  * Adapter for cache metrics.
@@ -108,6 +109,9 @@ public class CacheMetricsImpl implements CacheMetrics {
     /** Total rebalanced bytes count. */
     private AtomicLong totalRebalancedBytes = new AtomicLong();
 
+    /** Rebalanced start time. */
+    private AtomicLong rebalanceStartTime = new AtomicLong(-1L);
+
     /** Estimated rebalancing keys count. */
     private AtomicLong estimatedRebalancingKeys = new AtomicLong();
 
@@ -734,7 +738,7 @@ public class CacheMetricsImpl implements CacheMetrics {
     }
 
     /** {@inheritDoc} */
-    public int getTotalPartitionsCount() {
+    @Override public int getTotalPartitionsCount() {
         int res = 0;
 
         if (cctx.isLocal())
@@ -749,7 +753,7 @@ public class CacheMetricsImpl implements CacheMetrics {
     }
 
     /** {@inheritDoc} */
-    public int getRebalancingPartitionsCount() {
+    @Override public int getRebalancingPartitionsCount() {
         int res = 0;
 
         if (cctx.isLocal())
@@ -764,17 +768,17 @@ public class CacheMetricsImpl implements CacheMetrics {
     }
 
     /** {@inheritDoc} */
-    public long getKeysToRebalanceLeft() {
+    @Override public long getKeysToRebalanceLeft() {
         return Math.max(0, estimatedRebalancingKeys.get() - rebalancedKeys.get());
     }
 
     /** {@inheritDoc} */
-    public long getRebalancingKeysRate() {
+    @Override public long getRebalancingKeysRate() {
         return rebalancingKeysRate.getRate();
     }
 
     /** {@inheritDoc} */
-    public long getRebalancingBytesRate() {
+    @Override public long getRebalancingBytesRate() {
         return rebalancingBytesRate.getRate();
     }
 
@@ -791,6 +795,28 @@ public class CacheMetricsImpl implements CacheMetrics {
         rebalancingBytesRate.clear();
 
         rebalancingKeysRate.clear();
+
+        rebalanceStartTime.set(-1L);
+    }
+
+    /**
+     *
+     */
+    public void startRebalance(long delay){
+        rebalanceStartTime.addAndGet(delay + U.currentTimeMillis());
+    }
+
+    /** {@inheritDoc} */
+    @Override public long estimateRebalancingFinishTime() {
+        long rate = rebalancingKeysRate.getRate();
+
+        return rate <= 0 ? -1L :
+            ((getKeysToRebalanceLeft() / rate) * REBALANCE_RATE_INTERVAL) + U.currentTimeMillis();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long rebalancingStartTime() {
+        return rebalanceStartTime.get();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/1e0d4a54/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsSnapshot.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsSnapshot.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsSnapshot.java
index e9141c6..2d38db8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsSnapshot.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheMetricsSnapshot.java
@@ -203,6 +203,12 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable {
     /** Get rebalancing bytes rate. */
     private long rebalancingBytesRate;
 
+    /** Start rebalance time. */
+    private long rebalanceStartTime;
+
+    /** Estimate rebalance finish time. */
+    private long rebalanceFinishTime;
+
     /** */
     private String keyType;
 
@@ -307,6 +313,8 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable {
         keysToRebalanceLeft = m.getKeysToRebalanceLeft();
         rebalancingBytesRate = m.getRebalancingBytesRate();
         rebalancingKeysRate = m.getRebalancingKeysRate();
+        rebalanceStartTime = m.rebalancingStartTime();
+        rebalanceFinishTime = m.estimateRebalancingFinishTime();
     }
 
     /**
@@ -716,6 +724,16 @@ public class CacheMetricsSnapshot implements CacheMetrics, Externalizable {
     }
 
     /** {@inheritDoc} */
+    @Override public long estimateRebalancingFinishTime() {
+        return rebalanceFinishTime;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long rebalancingStartTime() {
+        return rebalanceStartTime;
+    }
+
+    /** {@inheritDoc} */
     @Override public boolean isWriteBehindEnabled() {
         return isWriteBehindEnabled;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/1e0d4a54/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemander.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemander.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemander.java
index 248b739..2258187 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemander.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionDemander.java
@@ -257,11 +257,13 @@ public class GridDhtPartitionDemander {
      * @param forcedRebFut External future for forced rebalance.
      * @return Rebalancing runnable.
      */
-    Runnable addAssignments(final GridDhtPreloaderAssignments assigns,
+    Runnable addAssignments(
+        final GridDhtPreloaderAssignments assigns,
         boolean force,
         int cnt,
         final Runnable next,
-        @Nullable final GridCompoundFuture<Boolean, Boolean> forcedRebFut) {
+        @Nullable final GridCompoundFuture<Boolean, Boolean> forcedRebFut
+    ) {
         if (log.isDebugEnabled())
             log.debug("Adding partition assignments: " + assigns);
 
@@ -289,14 +291,14 @@ public class GridDhtPartitionDemander {
 
             rebalanceFut = fut;
 
-            fut.sendRebalanceStartedEvent();
-
-            for (GridCacheContext cctx : grp.caches()) {
+            for (final GridCacheContext cctx : grp.caches()) {
                 if (cctx.config().isStatisticsEnabled()) {
                     final CacheMetricsImpl metrics = cctx.cache().metrics0();
 
                     metrics.clearRebalanceCounters();
 
+                    metrics.startRebalance(0);
+
                     rebalanceFut.listen(new IgniteInClosure<IgniteInternalFuture<Boolean>>() {
                         @Override public void apply(IgniteInternalFuture<Boolean> fut) {
                             metrics.clearRebalanceCounters();
@@ -305,6 +307,8 @@ public class GridDhtPartitionDemander {
                 }
             }
 
+            fut.sendRebalanceStartedEvent();
+
             if (assigns.cancelled()) { // Pending exchange.
                 if (log.isDebugEnabled())
                     log.debug("Rebalancing skipped due to cancelled assignments.");
@@ -350,6 +354,14 @@ public class GridDhtPartitionDemander {
             };
         }
         else if (delay > 0) {
+            for (GridCacheContext cctx : grp.caches()) {
+                if (cctx.config().isStatisticsEnabled()) {
+                    final CacheMetricsImpl metrics = cctx.cache().metrics0();
+
+                    metrics.startRebalance(delay);
+                }
+            }
+
             GridTimeoutObject obj = lastTimeoutObj.get();
 
             if (obj != null)

http://git-wip-us.apache.org/repos/asf/ignite/blob/1e0d4a54/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
index 7efd4aa..305da92 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
@@ -306,12 +306,12 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
 
                         GridDhtPartitionDemandMessage msg = assigns.get(n);
 
-                    if (msg == null) {
-                        assigns.put(n, msg = new GridDhtPartitionDemandMessage(
-                            top.updateSequence(),
-                            exchId.topologyVersion(),
-                            grp.groupId()));
-                    }
+                        if (msg == null) {
+                            assigns.put(n, msg = new GridDhtPartitionDemandMessage(
+                                top.updateSequence(),
+                                exchId.topologyVersion(),
+                                grp.groupId()));
+                        }
 
                         msg.addPartition(p, false);
                     }
@@ -396,11 +396,13 @@ public class GridDhtPreloader extends GridCachePreloaderAdapter {
     }
 
     /** {@inheritDoc} */
-    @Override public Runnable addAssignments(GridDhtPreloaderAssignments assignments,
+    @Override public Runnable addAssignments(
+        GridDhtPreloaderAssignments assignments,
         boolean forceRebalance,
         int cnt,
         Runnable next,
-        @Nullable GridCompoundFuture<Boolean, Boolean> forcedRebFut) {
+        @Nullable GridCompoundFuture<Boolean, Boolean> forcedRebFut
+    ) {
         return demander.addAssignments(assignments, forceRebalance, cnt, next, forcedRebFut);
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1e0d4a54/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGroupsMetricsRebalanceTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGroupsMetricsRebalanceTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGroupsMetricsRebalanceTest.java
index c15fa5f..a1a855a 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGroupsMetricsRebalanceTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/CacheGroupsMetricsRebalanceTest.java
@@ -21,20 +21,28 @@ import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import org.apache.ignite.Ignite;
 import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteDataStreamer;
 import org.apache.ignite.cache.CacheAtomicityMode;
 import org.apache.ignite.cache.CacheMetrics;
 import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cache.CacheRebalanceMode;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.events.CacheRebalancingEvent;
 import org.apache.ignite.events.Event;
 import org.apache.ignite.events.EventType;
+import org.apache.ignite.internal.util.typedef.PA;
+import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgnitePredicate;
 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.junits.common.GridCommonAbstractTest;
 
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_REBALANCE_STATISTICS_TIME_INTERVAL;
+import static org.apache.ignite.testframework.GridTestUtils.runAsync;
+import static org.apache.ignite.testframework.GridTestUtils.waitForCondition;
+
 /**
  *
  */
@@ -71,6 +79,7 @@ public class CacheGroupsMetricsRebalanceTest extends GridCommonAbstractTest {
             .setCacheMode(CacheMode.PARTITIONED)
             .setAtomicityMode(CacheAtomicityMode.ATOMIC)
             .setRebalanceMode(CacheRebalanceMode.ASYNC)
+            .setRebalanceBatchSize(100)
             .setStatisticsEnabled(true);
 
         CacheConfiguration cfg2 = new CacheConfiguration(cfg1)
@@ -137,4 +146,113 @@ public class CacheGroupsMetricsRebalanceTest extends GridCommonAbstractTest {
 
         assertTrue(ratio > 40 && ratio < 60);
     }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testRebalanceEstimateFinishTime() throws Exception {
+        System.setProperty(IGNITE_REBALANCE_STATISTICS_TIME_INTERVAL, String.valueOf(1000));
+
+        Ignite ig1 = startGrid(1);
+
+        final int KEYS = 4_000_000;
+
+        IgniteCache<Object, Object> cache1 = ig1.cache(CACHE1);
+
+        try (IgniteDataStreamer<Integer, String> st = ig1.dataStreamer(CACHE1)) {
+            for (int i = 0; i < KEYS; i++)
+                st.addData(i, CACHE1 + "-" + i);
+        }
+
+        final CountDownLatch finishRebalanceLatch = new CountDownLatch(1);
+
+        final Ignite ig2 = startGrid(2);
+
+        ig2.events().localListen(new IgnitePredicate<Event>() {
+            @Override public boolean apply(Event evt) {
+                CacheRebalancingEvent rebEvent = (CacheRebalancingEvent)evt;
+
+                if (rebEvent.cacheName().equals(CACHE1)) {
+                    System.out.println("CountDown rebalance stop latch:" + rebEvent.cacheName());
+
+                    finishRebalanceLatch.countDown();
+                }
+
+                return false;
+            }
+        }, EventType.EVT_CACHE_REBALANCE_STOPPED);
+
+        waitForCondition(new PA() {
+            @Override public boolean apply() {
+                return ig2.cache(CACHE1).localMetrics().rebalancingStartTime() != -1L;
+            }
+        }, 5_000);
+
+        CacheMetrics metrics = ig2.cache(CACHE1).localMetrics();
+
+        long startTime = metrics.rebalancingStartTime();
+
+        assertTrue(startTime > 0);
+        assertTrue((U.currentTimeMillis() - startTime) < 5000);
+
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        runAsync(new Runnable() {
+            @Override public void run() {
+                // Waiting 25% keys will be rebalanced.
+                int partKeys = KEYS / 2;
+
+                final long keysLine = (long)(partKeys - (partKeys * 0.25));
+
+                System.out.println("Wait until keys left will be less " + keysLine);
+
+                while (finishRebalanceLatch.getCount() != 0) {
+                    CacheMetrics m = ig2.cache(CACHE1).localMetrics();
+
+                    long keyLeft = m.getKeysToRebalanceLeft();
+
+                    if (keyLeft > 0 && keyLeft < keysLine)
+                        latch.countDown();
+
+                    System.out.println("Keys left: " + m.getKeysToRebalanceLeft());
+
+                    try {
+                        Thread.sleep(1_000);
+                    }
+                    catch (InterruptedException e) {
+                        System.out.println("Interrupt thread: " + e.getMessage());
+
+                        Thread.currentThread().interrupt();
+                    }
+                }
+            }
+        });
+
+        latch.await();
+
+        long finishTime = ig2.cache(CACHE1).localMetrics().estimateRebalancingFinishTime();
+
+        assertTrue(finishTime > 0);
+
+        long timePassed = U.currentTimeMillis() - startTime;
+        long timeLeft = finishTime - System.currentTimeMillis();
+
+        assertTrue(finishRebalanceLatch.await(timeLeft + 2_000, TimeUnit.SECONDS));
+
+        System.out.println(
+            "TimePassed:" + timePassed +
+                "\nTimeLeft:" + timeLeft +
+                "\nTime to rebalance: " + (finishTime - startTime) +
+                "\nStartTime: " + startTime +
+                "\nFinishTime: " + finishTime
+        );
+
+        System.clearProperty(IGNITE_REBALANCE_STATISTICS_TIME_INTERVAL);
+
+        System.out.println("Rebalance time:" + (U.currentTimeMillis() - startTime));
+
+        long diff = finishTime - U.currentTimeMillis();
+
+        assertTrue("Expected less 5000, Actual:" + diff, Math.abs(diff) < 10_000);
+    }
 }


[11/11] ignite git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/ignite into ignite-5872-5578

Posted by ag...@apache.org.
Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/ignite into ignite-5872-5578


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/95a425c1
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/95a425c1
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/95a425c1

Branch: refs/heads/ignite-5872-5578
Commit: 95a425c1ba3f103b94f08cb34550a0b9e4aec80e
Parents: 64de3ff 18e79e5
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Mon Aug 14 14:48:37 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Mon Aug 14 14:48:37 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/cache/CacheMetrics.java   |  10 +
 .../apache/ignite/internal/IgniteKernal.java    |   4 +-
 .../discovery/GridDiscoveryManager.java         |  39 +---
 .../ignite/internal/pagemem/PageUtils.java      |  26 +++
 .../cache/CacheClusterMetricsMXBeanImpl.java    |  10 +
 .../cache/CacheLocalMetricsMXBeanImpl.java      |  10 +
 .../processors/cache/CacheMetricsImpl.java      |  36 +++-
 .../processors/cache/CacheMetricsSnapshot.java  |  18 ++
 .../dht/preloader/GridDhtPartitionDemander.java |  22 +-
 .../dht/preloader/GridDhtPreloader.java         |   6 +-
 .../cache/persistence/MetadataStorage.java      |  12 +-
 .../cache/persistence/file/FilePageStore.java   |   2 +-
 .../messages/GridQueryNextPageResponse.java     |  36 +++-
 .../visor/cache/VisorCacheStopTask.java         |  22 +-
 .../visor/cache/VisorCacheStopTaskArg.java      |  27 +++
 .../ignite/internal/GridDiscoverySelfTest.java  |  30 ---
 .../cache/CacheGroupsMetricsRebalanceTest.java  | 118 +++++++++++
 .../platform/PlatformCacheWriteMetricsTask.java |  10 +
 .../query/h2/twostep/GridMapQueryExecutor.java  |   6 +-
 .../query/h2/twostep/GridMergeIndex.java        |   7 +-
 .../cache/index/LongIndexNameTest.java          | 212 +++++++++++++++++++
 .../IgniteCacheQuerySelfTestSuite.java          |   2 +
 .../http/jetty/GridJettyRestHandler.java        |  31 +--
 .../console/agent/handlers/ClusterListener.java |  13 +-
 .../ignite/console/agent/rest/RestExecutor.java | 201 ++++++++++++++++--
 25 files changed, 765 insertions(+), 145 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/95a425c1/modules/core/src/main/java/org/apache/ignite/internal/managers/discovery/GridDiscoveryManager.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/95a425c1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPreloader.java
----------------------------------------------------------------------


[09/11] ignite git commit: IGNITE-5890 - Fixed compilation

Posted by ag...@apache.org.
IGNITE-5890 - Fixed compilation


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/44d60f58
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/44d60f58
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/44d60f58

Branch: refs/heads/ignite-5872-5578
Commit: 44d60f58e77e9c2f134af09fbe500322d1f48628
Parents: 1e0d4a5
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Mon Aug 14 14:07:18 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Mon Aug 14 14:07:18 2017 +0300

----------------------------------------------------------------------
 .../ignite/platform/PlatformCacheWriteMetricsTask.java    | 10 ++++++++++
 1 file changed, 10 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/44d60f58/modules/core/src/test/java/org/apache/ignite/platform/PlatformCacheWriteMetricsTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/platform/PlatformCacheWriteMetricsTask.java b/modules/core/src/test/java/org/apache/ignite/platform/PlatformCacheWriteMetricsTask.java
index f1d8114..64ff0bc 100644
--- a/modules/core/src/test/java/org/apache/ignite/platform/PlatformCacheWriteMetricsTask.java
+++ b/modules/core/src/test/java/org/apache/ignite/platform/PlatformCacheWriteMetricsTask.java
@@ -433,6 +433,16 @@ public class PlatformCacheWriteMetricsTask extends ComputeTaskAdapter<Long, Obje
         @Override public long getHeapEntriesCount() {
             return 59;
         }
+
+        /** {@inheritDoc} */
+        @Override public long estimateRebalancingFinishTime() {
+            return 60;
+        }
+
+        /** {@inheritDoc} */
+        @Override public long rebalancingStartTime() {
+            return 61;
+        }
     }
 }
 


[02/11] ignite git commit: IGNITE-6027: Added last page marker to GridQueryNexPageResponse, so that responses with unknown row count could be processed correctly. This closes #2426.

Posted by ag...@apache.org.
IGNITE-6027: Added last page marker to GridQueryNexPageResponse, so that responses with unknown row count could be processed correctly. This closes #2426.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/1c62fdad
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/1c62fdad
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/1c62fdad

Branch: refs/heads/ignite-5872-5578
Commit: 1c62fdad521675d6965441b966726d1292cb70e1
Parents: 7199037
Author: devozerov <pp...@gmail.com>
Authored: Thu Aug 10 23:13:37 2017 +0300
Committer: devozerov <pp...@gmail.com>
Committed: Thu Aug 10 23:13:37 2017 +0300

----------------------------------------------------------------------
 .../messages/GridQueryNextPageResponse.java     | 36 ++++++++++++++++++--
 .../query/h2/twostep/GridMapQueryExecutor.java  |  6 ++--
 .../query/h2/twostep/GridMergeIndex.java        |  7 ++--
 3 files changed, 41 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/1c62fdad/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryNextPageResponse.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryNextPageResponse.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryNextPageResponse.java
index fe8b34a..4d918a0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryNextPageResponse.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/messages/GridQueryNextPageResponse.java
@@ -67,6 +67,9 @@ public class GridQueryNextPageResponse implements Message {
     /** */
     private AffinityTopologyVersion retry;
 
+    /** Last page flag. */
+    private boolean last;
+
     /**
      * For {@link Externalizable}.
      */
@@ -83,9 +86,10 @@ public class GridQueryNextPageResponse implements Message {
      * @param cols Number of columns in row.
      * @param vals Values for rows in this page added sequentially.
      * @param plainRows Not marshalled rows for local node.
+     * @param last Last page flag.
      */
     public GridQueryNextPageResponse(long qryReqId, int segmentId, int qry, int page, int allRows, int cols,
-        Collection<Message> vals, Collection<?> plainRows) {
+        Collection<Message> vals, Collection<?> plainRows, boolean last) {
         assert vals != null ^ plainRows != null;
         assert cols > 0 : cols;
 
@@ -97,6 +101,7 @@ public class GridQueryNextPageResponse implements Message {
         this.cols = cols;
         this.vals = vals;
         this.plainRows = plainRows;
+        this.last = last;
     }
 
     /**
@@ -220,6 +225,11 @@ public class GridQueryNextPageResponse implements Message {
 
                 writer.incrementState();
 
+            case 8:
+                if (!writer.writeBoolean("last", last))
+                    return false;
+
+                writer.incrementState();
         }
 
         return true;
@@ -296,6 +306,14 @@ public class GridQueryNextPageResponse implements Message {
                     return false;
 
                 reader.incrementState();
+
+            case 8:
+                last = reader.readBoolean("last");
+
+                if (!reader.isLastRead())
+                    return false;
+
+                reader.incrementState();
         }
 
         return reader.afterMessageRead(GridQueryNextPageResponse.class);
@@ -308,7 +326,7 @@ public class GridQueryNextPageResponse implements Message {
 
     /** {@inheritDoc} */
     @Override public byte fieldsCount() {
-        return 8;
+        return 9;
     }
 
     /**
@@ -325,6 +343,20 @@ public class GridQueryNextPageResponse implements Message {
         this.retry = retry;
     }
 
+    /**
+     * @return Last page flag.
+     */
+    public boolean last() {
+        return last;
+    }
+
+    /**
+     * @param last Last page flag.
+     */
+    public void last(boolean last) {
+        this.last = last;
+    }
+
     /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(GridQueryNextPageResponse.class, this,

http://git-wip-us.apache.org/repos/asf/ignite/blob/1c62fdad/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
index e717367..ca978e2 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMapQueryExecutor.java
@@ -732,7 +732,8 @@ public class GridMapQueryExecutor {
                 page == 0 ? res.rowCount() : -1,
                 res.columnCount(),
                 loc ? null : toMessages(rows, new ArrayList<Message>(res.columnCount())),
-                loc ? rows : null);
+                loc ? rows : null,
+                last);
 
             if (loc)
                 h2.reduceQueryExecutor().onMessage(ctx.localNodeId(), msg);
@@ -758,7 +759,8 @@ public class GridMapQueryExecutor {
             GridQueryNextPageResponse msg = new GridQueryNextPageResponse(reqId, segmentId,
             /*qry*/0, /*page*/0, /*allRows*/0, /*cols*/1,
                 loc ? null : Collections.<Message>emptyList(),
-                loc ? Collections.<Value[]>emptyList() : null);
+                loc ? Collections.<Value[]>emptyList() : null,
+                false);
 
             msg.retry(h2.readyTopologyVersion());
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/1c62fdad/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
index 86601cd..1c1cfaf 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/GridMergeIndex.java
@@ -46,7 +46,6 @@ import org.h2.index.IndexType;
 import org.h2.message.DbException;
 import org.h2.result.Row;
 import org.h2.result.SearchRow;
-import org.h2.table.Column;
 import org.h2.table.IndexColumn;
 import org.h2.value.Value;
 import org.jetbrains.annotations.Nullable;
@@ -329,7 +328,7 @@ public abstract class GridMergeIndex extends BaseIndex {
     private void markLastPage(GridResultPage page) {
         GridQueryNextPageResponse res = page.response();
 
-        if (res.allRows() != -2) { // -2 means the last page.
+        if (!res.last()) {
             UUID nodeId = page.source();
 
             initLastPages(nodeId, res);
@@ -337,12 +336,12 @@ public abstract class GridMergeIndex extends BaseIndex {
             ConcurrentMap<SourceKey,Integer> lp = lastPages;
 
             if (lp == null)
-                return; // It was not initialized --> wait for -2.
+                return; // It was not initialized --> wait for last page flag.
 
             Integer lastPage = lp.get(new SourceKey(nodeId, res.segmentId()));
 
             if (lastPage == null)
-                return; // This node may use the new protocol --> wait for -2.
+                return; // This node may use the new protocol --> wait for last page flag.
 
             if (lastPage != res.page()) {
                 assert lastPage > res.page();


[03/11] ignite git commit: IGNITE-5902 Implemented stop caches at once.

Posted by ag...@apache.org.
IGNITE-5902 Implemented stop caches at once.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/ebb8765a
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/ebb8765a
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/ebb8765a

Branch: refs/heads/ignite-5872-5578
Commit: ebb8765ab6735289cc2ceb4ccba2f6fd1e9816a8
Parents: 1c62fda
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Fri Aug 11 10:25:36 2017 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Fri Aug 11 10:25:36 2017 +0700

----------------------------------------------------------------------
 .../visor/cache/VisorCacheStopTask.java         | 22 ++++++++--------
 .../visor/cache/VisorCacheStopTaskArg.java      | 27 ++++++++++++++++++++
 2 files changed, 39 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/ebb8765a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStopTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStopTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStopTask.java
index 9f7c018..df95c5e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStopTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStopTask.java
@@ -17,8 +17,10 @@
 
 package org.apache.ignite.internal.visor.cache;
 
-import org.apache.ignite.IgniteCache;
+import java.util.Collection;
+import java.util.HashSet;
 import org.apache.ignite.internal.processors.task.GridInternal;
+import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.visor.VisorJob;
 import org.apache.ignite.internal.visor.VisorOneNodeTask;
@@ -46,23 +48,23 @@ public class VisorCacheStopTask extends VisorOneNodeTask<VisorCacheStopTaskArg,
         /**
          * Create job.
          *
-         * @param cacheName Cache name to clear.
+         * @param arg Task argument.
          * @param debug Debug flag.
          */
-        private VisorCacheStopJob(VisorCacheStopTaskArg cacheName, boolean debug) {
-            super(cacheName, debug);
+        private VisorCacheStopJob(VisorCacheStopTaskArg arg, boolean debug) {
+            super(arg, debug);
         }
 
         /** {@inheritDoc} */
         @Override protected Void run(VisorCacheStopTaskArg arg) {
-            String cacheName = arg.getCacheName();
+            Collection<String> cacheNames = F.isEmpty(arg.getCacheNames())
+                ? F.asList(arg.getCacheName())
+                : new HashSet<>(arg.getCacheNames());
 
-            IgniteCache cache = ignite.cache(cacheName);
+            if (F.isEmpty(cacheNames))
+                throw new IllegalStateException("Cache names was not specified.");
 
-            if (cache == null)
-                throw new IllegalStateException("Failed to find cache for name: " + cacheName);
-
-            cache.destroy();
+            ignite.destroyCaches(cacheNames);
 
             return null;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/ebb8765a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStopTaskArg.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStopTaskArg.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStopTaskArg.java
index 4976036..77156ab 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStopTaskArg.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheStopTaskArg.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.visor.cache;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
+import java.util.List;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.internal.visor.VisorDataTransferObject;
@@ -34,6 +35,9 @@ public class VisorCacheStopTaskArg extends VisorDataTransferObject {
     /** Cache name. */
     private String cacheName;
 
+    /** Cache names. */
+    private List<String> cacheNames;
+
     /**
      * Default constructor.
      */
@@ -49,20 +53,43 @@ public class VisorCacheStopTaskArg extends VisorDataTransferObject {
     }
 
     /**
+     * @param cacheNames Cache names.
+     */
+    public VisorCacheStopTaskArg(List<String> cacheNames) {
+        this.cacheNames = cacheNames;
+    }
+
+    /**
      * @return Cache name.
      */
     public String getCacheName() {
         return cacheName;
     }
 
+    /**
+     * @return Cache names.
+     */
+    public List<String> getCacheNames() {
+        return cacheNames;
+    }
+
+    /** {@inheritDoc} */
+    @Override public byte getProtocolVersion() {
+        return V2;
+    }
+
     /** {@inheritDoc} */
     @Override protected void writeExternalData(ObjectOutput out) throws IOException {
         U.writeString(out, cacheName);
+        U.writeCollection(out, cacheNames);
     }
 
     /** {@inheritDoc} */
     @Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
         cacheName = U.readString(in);
+
+        if (protoVer > V1)
+            cacheNames = U.readList(in);
     }
 
     /** {@inheritDoc} */