You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ak...@apache.org on 2018/04/11 17:35:08 UTC
[1/9] ignite git commit: IGNITE-7871 Check local join future on
error. - Fixes #3793.
Repository: ignite
Updated Branches:
refs/heads/ignite-8201 6c01882d7 -> 4ba2436f6
IGNITE-7871 Check local join future on error. - Fixes #3793.
Signed-off-by: dpavlov <dp...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/0e73fa2c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/0e73fa2c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/0e73fa2c
Branch: refs/heads/ignite-8201
Commit: 0e73fa2c10dcd96ff98279018bdd3f8b36568008
Parents: 74d2545
Author: Pavel Kovalenko <jo...@gmail.com>
Authored: Wed Apr 11 14:12:50 2018 +0300
Committer: dpavlov <dp...@apache.org>
Committed: Wed Apr 11 14:12:50 2018 +0300
----------------------------------------------------------------------
.../distributed/dht/preloader/latch/ExchangeLatchManager.java | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/0e73fa2c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/latch/ExchangeLatchManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/latch/ExchangeLatchManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/latch/ExchangeLatchManager.java
index c205cb1..404f88f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/latch/ExchangeLatchManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/latch/ExchangeLatchManager.java
@@ -104,7 +104,8 @@ public class ExchangeLatchManager {
// First coordinator initialization.
ctx.discovery().localJoinFuture().listen(f -> {
- this.coordinator = getLatchCoordinator(AffinityTopologyVersion.NONE);
+ if (f.error() == null)
+ this.coordinator = getLatchCoordinator(AffinityTopologyVersion.NONE);
});
ctx.event().addDiscoveryEventListener((e, cache) -> {
[3/9] ignite git commit: IGNITE-8106 Collect suppressed exceptions
from causes. - Fixes #3735.
Posted by ak...@apache.org.
IGNITE-8106 Collect suppressed exceptions from causes. - Fixes #3735.
Signed-off-by: Alexey Kuznetsov <ak...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/98ef9259
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/98ef9259
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/98ef9259
Branch: refs/heads/ignite-8201
Commit: 98ef925933f392d419f70b2fcf51e3655b08b290
Parents: a3eb1f5
Author: Ilya Kasnacheev <il...@gmail.com>
Authored: Wed Apr 11 19:32:52 2018 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Wed Apr 11 19:32:52 2018 +0700
----------------------------------------------------------------------
.../cluster/GridChangeStateCommandHandler.java | 3 +-
.../apache/ignite/internal/util/typedef/X.java | 37 +++++++++++++++-----
.../visor/util/VisorExceptionWrapper.java | 11 +++---
.../communication/tcp/TcpCommunicationSpi.java | 2 +-
.../ignite/GridSuppressedExceptionSelfTest.java | 23 +++++++++++-
5 files changed, 59 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/98ef9259/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java
index 7bb13d9..619be34 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cluster/GridChangeStateCommandHandler.java
@@ -27,6 +27,7 @@ import org.apache.ignite.internal.processors.rest.handlers.GridRestCommandHandle
import org.apache.ignite.internal.processors.rest.request.GridRestChangeStateRequest;
import org.apache.ignite.internal.processors.rest.request.GridRestRequest;
import org.apache.ignite.internal.util.future.GridFutureAdapter;
+import org.apache.ignite.internal.util.typedef.X;
import org.apache.ignite.internal.util.typedef.internal.SB;
import org.apache.ignite.internal.util.typedef.internal.U;
@@ -78,7 +79,7 @@ public class GridChangeStateCommandHandler extends GridRestCommandHandlerAdapter
sb.a(e.getMessage()).a("\n").a("suppressed: \n");
- for (Throwable t:e.getSuppressed())
+ for (Throwable t : X.getSuppressedList(e))
sb.a(t.getMessage()).a("\n");
res.setError(sb.toString());
http://git-wip-us.apache.org/repos/asf/ignite/blob/98ef9259/modules/core/src/main/java/org/apache/ignite/internal/util/typedef/X.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/typedef/X.java b/modules/core/src/main/java/org/apache/ignite/internal/util/typedef/X.java
index 395de23..1a43daa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/typedef/X.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/typedef/X.java
@@ -469,14 +469,12 @@ public final class X {
if (t == null || cls == null)
return false;
- if (t.getSuppressed() != null) {
- for (Throwable th : t.getSuppressed()) {
- if (cls.isAssignableFrom(th.getClass()))
- return true;
+ for (Throwable th : t.getSuppressed()) {
+ if (cls.isAssignableFrom(th.getClass()))
+ return true;
- if (hasSuppressed(th, cls))
- return true;
- }
+ if (hasSuppressed(th, cls))
+ return true;
}
return false;
@@ -749,6 +747,29 @@ public final class X {
}
/**
+ * Collects suppressed exceptions from throwable and all it causes.
+ *
+ * @param t Throwable.
+ * @return List of suppressed throwables.
+ */
+ public static List<Throwable> getSuppressedList(@Nullable Throwable t) {
+ List<Throwable> result = new ArrayList<>();
+
+ if (t == null)
+ return result;
+
+ do {
+ for (Throwable suppressed : t.getSuppressed()) {
+ result.add(suppressed);
+
+ result.addAll(getSuppressedList(suppressed));
+ }
+ } while ((t = t.getCause()) != null);
+
+ return result;
+ }
+
+ /**
* A way to get the entire nested stack-trace of an throwable.
*
* The result of this method is highly dependent on the JDK version
@@ -889,4 +910,4 @@ public final class X {
return dflt;
}
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/98ef9259/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorExceptionWrapper.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorExceptionWrapper.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorExceptionWrapper.java
index 15e9557..ba52c5f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorExceptionWrapper.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/util/VisorExceptionWrapper.java
@@ -17,7 +17,8 @@
package org.apache.ignite.internal.visor.util;
-import org.apache.ignite.internal.util.typedef.F;
+import java.util.List;
+import org.apache.ignite.internal.util.typedef.X;
/**
* Exception wrapper for safe for transferring to Visor.
@@ -56,12 +57,10 @@ public class VisorExceptionWrapper extends Throwable {
if (cause.getCause() != null)
initCause(new VisorExceptionWrapper(cause.getCause()));
- Throwable[] suppressed = cause.getSuppressed();
+ List<Throwable> suppressed = X.getSuppressedList(cause);
- if (!F.isEmpty(suppressed)) {
- for (Throwable sup : suppressed)
- addSuppressed(new VisorExceptionWrapper(sup));
- }
+ for (Throwable sup : suppressed)
+ addSuppressed(new VisorExceptionWrapper(sup));
}
/**
http://git-wip-us.apache.org/repos/asf/ignite/blob/98ef9259/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
index 9e7b592..df37dff 100755
--- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
@@ -3476,7 +3476,7 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter implements Communicati
ctx.failNode(node.id(), "TcpCommunicationSpi failed to establish connection to node [" +
"rmtNode=" + node +
", errs=" + errs +
- ", connectErrs=" + Arrays.toString(errs.getSuppressed()) + ']');
+ ", connectErrs=" + X.getSuppressedList(errs) + ']');
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/98ef9259/modules/core/src/test/java/org/apache/ignite/GridSuppressedExceptionSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/GridSuppressedExceptionSelfTest.java b/modules/core/src/test/java/org/apache/ignite/GridSuppressedExceptionSelfTest.java
index 6e32249..55e54fb 100644
--- a/modules/core/src/test/java/org/apache/ignite/GridSuppressedExceptionSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/GridSuppressedExceptionSelfTest.java
@@ -18,6 +18,7 @@
package org.apache.ignite;
import java.io.IOException;
+import java.util.List;
import junit.framework.TestCase;
import org.apache.ignite.internal.util.typedef.X;
@@ -70,6 +71,26 @@ public class GridSuppressedExceptionSelfTest extends TestCase {
/**
* @throws Exception If failed.
*/
+ public void testXGetSuppressedList() throws Exception {
+ IgniteCheckedException me = prepareMultiException();
+
+ assertEquals(3, X.getSuppressedList(me).size());
+
+ RuntimeException e = new RuntimeException();
+ e.addSuppressed(me);
+
+ List<Throwable> suppresseds = X.getSuppressedList(e);
+
+ assertEquals(4, suppresseds.size());
+
+ assertEquals("Test message.", suppresseds.get(0).getMessage());
+ for (int i = 1; i <= 3; i++)
+ assertEquals("Demo exception.", suppresseds.get(1).getMessage());
+ }
+
+ /**
+ * @throws Exception If failed.
+ */
public void testXCause() throws Exception {
IgniteCheckedException me = prepareMultiException();
@@ -116,4 +137,4 @@ public class GridSuppressedExceptionSelfTest extends TestCase {
else
generateException(calls - 1, cause);
}
-}
\ No newline at end of file
+}
[2/9] ignite git commit: IGNITE-4756 Print info about partition
distribution to log
Posted by ak...@apache.org.
IGNITE-4756 Print info about partition distribution to log
Signed-off-by: Anton Vinogradov <av...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/a3eb1f5d
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/a3eb1f5d
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/a3eb1f5d
Branch: refs/heads/ignite-8201
Commit: a3eb1f5d753a38c4019440e1bf39d00bc6136455
Parents: 0e73fa2
Author: Vyacheslav Daradur <da...@gmail.com>
Authored: Wed Apr 11 14:41:29 2018 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Wed Apr 11 14:41:29 2018 +0300
----------------------------------------------------------------------
.../apache/ignite/IgniteSystemProperties.java | 7 +
.../affinity/GridAffinityAssignmentCache.java | 50 +++-
.../AffinityDistributionLoggingTest.java | 268 +++++++++++++++++++
.../testsuites/IgniteCacheTestSuite5.java | 9 +-
4 files changed, 327 insertions(+), 7 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/a3eb1f5d/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index 9da123e..04eb425 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -857,6 +857,13 @@ public final class IgniteSystemProperties {
public static final String IGNITE_BPLUS_TREE_LOCK_RETRIES = "IGNITE_BPLUS_TREE_LOCK_RETRIES";
/**
+ * The threshold of uneven distribution above which partition distribution will be logged.
+ *
+ * The default is '50', that means: warn about nodes with 50+% difference.
+ */
+ public static final String IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD = "IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD";
+
+ /**
* Enforces singleton.
*/
private IgniteSystemProperties() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/a3eb1f5d/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
index 18edd02..b1899e3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
@@ -34,13 +34,14 @@ import java.util.concurrent.atomic.AtomicReference;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteException;
import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.cache.affinity.AffinityCentralizedFunction;
import org.apache.ignite.cache.affinity.AffinityFunction;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.events.DiscoveryEvent;
import org.apache.ignite.internal.GridKernalContext;
-import org.apache.ignite.internal.cluster.NodeOrderComparator;
import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.cluster.NodeOrderComparator;
import org.apache.ignite.internal.managers.discovery.DiscoCache;
import org.apache.ignite.internal.processors.cache.ExchangeDiscoveryEvents;
import org.apache.ignite.internal.processors.cluster.BaselineTopology;
@@ -53,7 +54,10 @@ import org.apache.ignite.lang.IgnitePredicate;
import org.jetbrains.annotations.Nullable;
import static org.apache.ignite.IgniteSystemProperties.IGNITE_AFFINITY_HISTORY_SIZE;
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD;
+import static org.apache.ignite.IgniteSystemProperties.getFloat;
import static org.apache.ignite.IgniteSystemProperties.getInteger;
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
import static org.apache.ignite.internal.events.DiscoveryCustomEvent.EVT_DISCOVERY_CUSTOM_EVT;
/**
@@ -63,6 +67,9 @@ public class GridAffinityAssignmentCache {
/** Cleanup history size. */
private final int MAX_HIST_SIZE = getInteger(IGNITE_AFFINITY_HISTORY_SIZE, 500);
+ /** Partition distribution. */
+ private final float partDistribution = getFloat(IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD, 50f);
+
/** Group name if specified or cache name. */
private final String cacheOrGrpName;
@@ -367,6 +374,9 @@ public class GridAffinityAssignmentCache {
idealAssignment = assignment;
+ if (ctx.cache().cacheMode(cacheOrGrpName) == PARTITIONED)
+ printDistributionIfThresholdExceeded(assignment, sorted.size());
+
if (hasBaseline) {
baselineTopology = discoCache.state().baselineTopology();
assert baselineAssignment != null;
@@ -418,6 +428,44 @@ public class GridAffinityAssignmentCache {
}
/**
+ * Calculates and logs partitions distribution if threshold of uneven distribution {@link #partDistribution} is exceeded.
+ *
+ * @param assignments Assignments to calculate partitions distribution.
+ * @param nodes Affinity nodes number.
+ * @see IgniteSystemProperties#IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD
+ */
+ private void printDistributionIfThresholdExceeded(List<List<ClusterNode>> assignments, int nodes) {
+ int locPrimaryCnt = 0;
+ int locBackupCnt = 0;
+
+ for (List<ClusterNode> assignment : assignments) {
+ for (int i = 0; i < assignment.size(); i++) {
+ ClusterNode node = assignment.get(i);
+
+ if (node.isLocal()) {
+ if (i == 0)
+ locPrimaryCnt++;
+ else
+ locBackupCnt++;
+ }
+ }
+ }
+
+ float expCnt = (float)partsCnt / nodes;
+
+ float deltaPrimary = Math.abs(1 - (float)locPrimaryCnt / expCnt) * 100;
+ float deltaBackup = Math.abs(1 - (float)locBackupCnt / (expCnt * backups)) * 100;
+
+ if (deltaPrimary > partDistribution || deltaBackup > partDistribution) {
+ log.info(String.format("Local node affinity assignment distribution is not ideal " +
+ "[cache=%s, expectedPrimary=%.2f, actualPrimary=%d, " +
+ "expectedBackups=%.2f, actualBackups=%d, warningThreshold=%.2f%%]",
+ cacheOrGrpName, expCnt, locPrimaryCnt,
+ expCnt * backups, locBackupCnt, partDistribution));
+ }
+ }
+
+ /**
* Copies previous affinity assignment when discovery event does not cause affinity assignment changes
* (e.g. client node joins on leaves).
*
http://git-wip-us.apache.org/repos/asf/ignite/blob/a3eb1f5d/modules/core/src/test/java/org/apache/ignite/cache/affinity/AffinityDistributionLoggingTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/cache/affinity/AffinityDistributionLoggingTest.java b/modules/core/src/test/java/org/apache/ignite/cache/affinity/AffinityDistributionLoggingTest.java
new file mode 100644
index 0000000..813c830
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/cache/affinity/AffinityDistributionLoggingTest.java
@@ -0,0 +1,268 @@
+/*
+ * 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.cache.affinity;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.processors.affinity.GridAffinityAssignmentCache;
+import org.apache.ignite.internal.processors.cache.GridCacheContext;
+import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
+import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.testframework.GridStringLogger;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD;
+import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IGNITE_INSTANCE_NAME;
+
+/**
+ * Tests of partitions distribution logging.
+ *
+ * Tests based on using of affinity function which provides an even distribution of partitions between nodes.
+ *
+ * @see EvenDistributionAffinityFunction
+ */
+public class AffinityDistributionLoggingTest extends GridCommonAbstractTest {
+ /** Pattern to test. */
+ private static final String LOG_MESSAGE_PREFIX = "Local node affinity assignment distribution is not ideal ";
+
+ /** Partitions number. */
+ private int parts = 0;
+
+ /** Nodes number. */
+ private int nodes = 0;
+
+ /** Backups number. */
+ private int backups = 0;
+
+ /** For storing original value of system property. */
+ private String tempProp;
+
+ /** {@inheritDoc} */
+ @Override protected void beforeTestsStarted() throws Exception {
+ super.beforeTestsStarted();
+
+ tempProp = System.getProperty(IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTestsStopped() throws Exception {
+ super.afterTestsStopped();
+
+ if (tempProp != null)
+ System.setProperty(IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD, tempProp);
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ super.afterTest();
+
+ System.clearProperty(IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD);
+
+ stopAllGrids();
+ }
+
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+ IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+ CacheConfiguration cacheCfg = defaultCacheConfiguration();
+
+ cacheCfg.setCacheMode(CacheMode.PARTITIONED);
+ cacheCfg.setBackups(backups);
+ cacheCfg.setAffinity(new EvenDistributionAffinityFunction(parts));
+
+ cfg.setCacheConfiguration(cacheCfg);
+
+ return cfg;
+ }
+
+ /**
+ * @throws Exception In case of an error.
+ */
+ public void test2PartitionsIdealDistributionIsNotLogged() throws Exception {
+ System.setProperty(IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD, "0");
+
+ nodes = 2;
+ parts = 2;
+ backups = 1;
+
+ String testsLog = runAndGetExchangeLog();
+
+ assertFalse(testsLog.contains(LOG_MESSAGE_PREFIX));
+ }
+
+ /**
+ * @throws Exception In case of an error.
+ */
+ public void test120PartitionsIdeadDistributionIsNotLogged() throws Exception {
+ System.setProperty(IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD, "0.0");
+
+ nodes = 3;
+ parts = 120;
+ backups = 2;
+
+ String testsLog = runAndGetExchangeLog();
+
+ assertFalse(testsLog.contains(LOG_MESSAGE_PREFIX));
+ }
+
+ /**
+ * @throws Exception In case of an error.
+ */
+ public void test5PartitionsNotIdealDistributionIsLogged() throws Exception {
+ System.setProperty(IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD, "50.0");
+
+ nodes = 4;
+ parts = 5;
+ backups = 3;
+
+ String testsLog = runAndGetExchangeLog();
+
+ assertTrue(testsLog.contains(LOG_MESSAGE_PREFIX));
+ }
+
+ /**
+ * @throws Exception In case of an error.
+ */
+ public void test7PartitionsNotIdealDistributionSuppressedLogging() throws Exception {
+ System.setProperty(IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD, "50.0");
+
+ nodes = 3;
+ parts = 7;
+ backups = 0;
+
+ String testsLog = runAndGetExchangeLog();
+
+ assertFalse(testsLog.contains(LOG_MESSAGE_PREFIX));
+ }
+
+ /**
+ * @throws Exception In case of an error.
+ */
+ public void test5PartitionsNotIdealDistributionSuppressedLogging() throws Exception {
+ System.setProperty(IGNITE_PART_DISTRIBUTION_WARN_THRESHOLD, "65");
+
+ nodes = 4;
+ parts = 5;
+ backups = 3;
+
+ String testsLog = runAndGetExchangeLog();
+
+ assertFalse(testsLog.contains(LOG_MESSAGE_PREFIX));
+ }
+
+ /**
+ * Starts a specified number of Ignite nodes and log partition node exchange during a last node's startup.
+ *
+ * @return Log of latest partition map exchange.
+ * @throws Exception In case of an error.
+ */
+ private String runAndGetExchangeLog() throws Exception {
+ assert nodes > 1;
+
+ IgniteEx ignite = (IgniteEx)startGrids(nodes - 1);
+
+ awaitPartitionMapExchange();
+
+ GridCacheProcessor proc = ignite.context().cache();
+
+ GridCacheContext cctx = proc.context().cacheContext(CU.cacheId(DEFAULT_CACHE_NAME));
+
+ final GridStringLogger log = new GridStringLogger(false, this.log);
+
+ GridAffinityAssignmentCache aff = GridTestUtils.getFieldValue(cctx.affinity(), "aff");
+
+ GridTestUtils.setFieldValue(aff, "log", log);
+
+ startGrid(nodes);
+
+ awaitPartitionMapExchange();
+
+ return log.toString();
+ }
+
+ /**
+ * Affinity function for a partitioned cache which provides even distribution partitions between nodes in cluster.
+ */
+ private static class EvenDistributionAffinityFunction implements AffinityFunction {
+ /** */
+ private static final long serialVersionUID = 0L;
+
+ /** Partitions number. */
+ private int parts;
+
+ /**
+ * @param parts Number of partitions for one cache.
+ */
+ private EvenDistributionAffinityFunction(int parts) {
+ this.parts = parts;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int partitions() {
+ return parts;
+ }
+
+ /** {@inheritDoc} */
+ @Override public int partition(Object key) {
+ return key.hashCode() % parts;
+ }
+
+ /** {@inheritDoc} */
+ @Override public List<List<ClusterNode>> assignPartitions(AffinityFunctionContext affCtx) {
+ List<ClusterNode> nodes = new ArrayList<>(affCtx.currentTopologySnapshot());
+
+ nodes.sort(Comparator.comparing(o -> o.<String>attribute(ATTR_IGNITE_INSTANCE_NAME)));
+
+ List<List<ClusterNode>> res = new ArrayList<>(parts);
+
+ for (int i = 0; i < parts; i++) {
+ Set<ClusterNode> n0 = new LinkedHashSet<>();
+
+ n0.add(nodes.get(i % nodes.size()));
+
+ for (int j = 1; j <= affCtx.backups(); j++)
+ n0.add(nodes.get((i + j) % nodes.size()));
+
+ res.add(new ArrayList<>(n0));
+ }
+
+ return res;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void removeNode(UUID nodeId) {
+ // No-op.
+ }
+
+ /** {@inheritDoc} */
+ @Override public void reset() {
+ // No-op.
+ }
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/a3eb1f5d/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java
index 7c41e49..945a76c 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite5.java
@@ -21,6 +21,7 @@ import junit.framework.TestSuite;
import org.apache.ignite.GridCacheAffinityBackupsSelfTest;
import org.apache.ignite.IgniteCacheAffinitySelfTest;
import org.apache.ignite.cache.affinity.AffinityClientNodeSelfTest;
+import org.apache.ignite.cache.affinity.AffinityDistributionLoggingTest;
import org.apache.ignite.cache.affinity.AffinityHistoryCleanupTest;
import org.apache.ignite.cache.affinity.local.LocalAffinityFunctionTest;
import org.apache.ignite.internal.GridCachePartitionExchangeManagerHistSizeTest;
@@ -35,13 +36,7 @@ import org.apache.ignite.internal.processors.cache.EntryVersionConsistencyReadTh
import org.apache.ignite.internal.processors.cache.IgniteCachePutStackOverflowSelfTest;
import org.apache.ignite.internal.processors.cache.IgniteCacheReadThroughEvictionsVariationsSuite;
import org.apache.ignite.internal.processors.cache.IgniteCacheStoreCollectionTest;
-import org.apache.ignite.internal.processors.cache.PartitionedAtomicCacheGetsDistributionTest;
-import org.apache.ignite.internal.processors.cache.PartitionedTransactionalOptimisticCacheGetsDistributionTest;
-import org.apache.ignite.internal.processors.cache.PartitionedTransactionalPessimisticCacheGetsDistributionTest;
import org.apache.ignite.internal.processors.cache.PartitionsExchangeOnDiscoveryHistoryOverflowTest;
-import org.apache.ignite.internal.processors.cache.ReplicatedAtomicCacheGetsDistributionTest;
-import org.apache.ignite.internal.processors.cache.ReplicatedTransactionalOptimisticCacheGetsDistributionTest;
-import org.apache.ignite.internal.processors.cache.ReplicatedTransactionalPessimisticCacheGetsDistributionTest;
import org.apache.ignite.internal.processors.cache.distributed.Cache64kPartitionsTest;
import org.apache.ignite.internal.processors.cache.distributed.CacheLateAffinityAssignmentNodeJoinValidationTest;
import org.apache.ignite.internal.processors.cache.distributed.CacheLateAffinityAssignmentTest;
@@ -95,6 +90,8 @@ public class IgniteCacheTestSuite5 extends TestSuite {
suite.addTestSuite(LocalAffinityFunctionTest.class);
suite.addTestSuite(AffinityHistoryCleanupTest.class);
+ suite.addTestSuite(AffinityDistributionLoggingTest.class);
+
suite.addTestSuite(IgniteCacheAtomicProtocolTest.class);
suite.addTestSuite(PartitionsExchangeOnDiscoveryHistoryOverflowTest.class);
[5/9] ignite git commit: IGNITE-8221: Security for thin clients.
Posted by ak...@apache.org.
IGNITE-8221: Security for thin clients.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/5a292763
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/5a292763
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/5a292763
Branch: refs/heads/ignite-8201
Commit: 5a29276355c4eb8966e5825883e1232ee2a80509
Parents: 747e6c5
Author: Alexey Kukushkin <al...@yahoo.com>
Authored: Wed Apr 11 16:29:07 2018 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Apr 11 16:38:12 2018 +0300
----------------------------------------------------------------------
.../apache/ignite/IgniteSystemProperties.java | 6 +++
.../client/ClientAuthenticationException.java | 2 +-
.../client/ClientAuthorizationException.java | 46 ++++++++++++++++++++
.../internal/client/thin/ClientChannel.java | 3 +-
.../internal/client/thin/TcpClientChannel.java | 39 ++++++++---------
.../IgniteAuthenticationProcessor.java | 5 ++-
.../processors/cache/GridCacheProcessor.java | 32 ++++++++++++++
.../processors/cache/GridCacheUtils.java | 5 +++
.../client/ClientConnectionContext.java | 45 ++++++++++++++++++-
.../platform/client/ClientRequest.java | 29 ++++++++++++
.../platform/client/ClientStatus.java | 3 ++
.../cache/ClientCacheClearKeyRequest.java | 3 ++
.../cache/ClientCacheClearKeysRequest.java | 3 ++
.../client/cache/ClientCacheClearRequest.java | 3 ++
.../cache/ClientCacheContainsKeyRequest.java | 3 ++
.../cache/ClientCacheContainsKeysRequest.java | 3 ++
...ientCacheCreateWithConfigurationRequest.java | 6 ++-
.../cache/ClientCacheCreateWithNameRequest.java | 3 ++
.../client/cache/ClientCacheDestroyRequest.java | 3 ++
.../client/cache/ClientCacheGetAllRequest.java | 3 ++
.../ClientCacheGetAndPutIfAbsentRequest.java | 3 ++
.../cache/ClientCacheGetAndPutRequest.java | 3 ++
.../cache/ClientCacheGetAndRemoveRequest.java | 3 ++
.../cache/ClientCacheGetAndReplaceRequest.java | 3 ++
...acheGetOrCreateWithConfigurationRequest.java | 6 ++-
.../ClientCacheGetOrCreateWithNameRequest.java | 3 ++
.../client/cache/ClientCacheGetRequest.java | 3 ++
.../client/cache/ClientCacheGetSizeRequest.java | 3 ++
.../client/cache/ClientCachePutAllRequest.java | 3 ++
.../cache/ClientCachePutIfAbsentRequest.java | 3 ++
.../client/cache/ClientCachePutRequest.java | 3 ++
.../cache/ClientCacheRemoveAllRequest.java | 3 ++
.../cache/ClientCacheRemoveIfEqualsRequest.java | 3 ++
.../cache/ClientCacheRemoveKeyRequest.java | 3 ++
.../cache/ClientCacheRemoveKeysRequest.java | 3 ++
.../ClientCacheReplaceIfEqualsRequest.java | 3 ++
.../client/cache/ClientCacheReplaceRequest.java | 3 ++
.../client/cache/ClientCacheRequest.java | 32 ++++++++++++++
.../cache/ClientCacheScanQueryRequest.java | 3 ++
.../cache/ClientCacheSqlFieldsQueryRequest.java | 1 +
.../cache/ClientCacheSqlQueryRequest.java | 1 +
.../plugin/security/AuthenticationContext.java | 40 +++++++++++++++++
.../plugin/security/SecurityPermission.java | 11 ++++-
.../ignite/spi/discovery/tcp/ServerImpl.java | 12 ++++-
44 files changed, 371 insertions(+), 28 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index 04eb425..662338c 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -835,6 +835,12 @@ public final class IgniteSystemProperties {
public static final String IGNITE_WAL_FSYNC_WITH_DEDICATED_WORKER = "IGNITE_WAL_FSYNC_WITH_DEDICATED_WORKER";
/**
+ * When set to {@code true}, on-heap cache cannot be enabled - see
+ * {@link CacheConfiguration#setOnheapCacheEnabled(boolean)}.
+ * Default is {@code false}.
+ */
+ public static final String IGNITE_DISABLE_ONHEAP_CACHE = "IGNITE_DISABLE_ONHEAP_CACHE";
+ /**
* When set to {@code false}, loaded pages implementation is switched to previous version of implementation,
* FullPageIdTable. {@code True} value enables 'Robin Hood hashing: backward shift deletion'.
* Default is {@code true}.
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/client/ClientAuthenticationException.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/client/ClientAuthenticationException.java b/modules/core/src/main/java/org/apache/ignite/client/ClientAuthenticationException.java
index dc39c7a..0c24db8 100644
--- a/modules/core/src/main/java/org/apache/ignite/client/ClientAuthenticationException.java
+++ b/modules/core/src/main/java/org/apache/ignite/client/ClientAuthenticationException.java
@@ -18,7 +18,7 @@
package org.apache.ignite.client;
/**
- * Indicates Ignite server the client is connected to closed the connection and no longer available.
+ * Indicates user name or password is invalid.
*/
public class ClientAuthenticationException extends ClientException {
/** Serial version uid. */
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/client/ClientAuthorizationException.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/client/ClientAuthorizationException.java b/modules/core/src/main/java/org/apache/ignite/client/ClientAuthorizationException.java
new file mode 100644
index 0000000..cacede6
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/client/ClientAuthorizationException.java
@@ -0,0 +1,46 @@
+/*
+ * 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.client;
+
+/**
+ * Indicates user has no permission to perform operation.
+ */
+public class ClientAuthorizationException extends ClientException {
+ /** Serial version uid. */
+ private static final long serialVersionUID = 0L;
+
+ /** Message. */
+ private static final String MSG = "User is not authorized to perform this operation";
+
+ /**
+ * Default constructor.
+ */
+ public ClientAuthorizationException() {
+ super(MSG);
+ }
+
+ /**
+ * Constructs a new exception with the specified cause and a detail
+ * message of <tt>(cause==null ? null : cause.toString())</tt>.
+ *
+ * @param cause the cause.
+ */
+ public ClientAuthorizationException(Throwable cause) {
+ super(MSG, cause);
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannel.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannel.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannel.java
index 71502a4..eb62c80 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannel.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/ClientChannel.java
@@ -22,6 +22,7 @@ import java.util.function.Function;
import org.apache.ignite.internal.binary.streams.BinaryInputStream;
import org.apache.ignite.internal.binary.streams.BinaryOutputStream;
import org.apache.ignite.client.ClientConnectionException;
+import org.apache.ignite.client.ClientAuthorizationException;
/**
* Processing thin client requests and responses.
@@ -41,5 +42,5 @@ interface ClientChannel extends AutoCloseable {
* @return Received operation payload or {@code null} if response has no payload.
*/
public <T> T receive(ClientOperation op, long reqId, Function<BinaryInputStream, T> payloadReader)
- throws ClientConnectionException;
+ throws ClientConnectionException, ClientAuthorizationException;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java
index 404793a..8e8294f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/client/thin/TcpClientChannel.java
@@ -50,6 +50,7 @@ import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;
import org.apache.ignite.client.ClientAuthenticationException;
+import org.apache.ignite.client.ClientAuthorizationException;
import org.apache.ignite.client.ClientConnectionException;
import org.apache.ignite.client.SslMode;
import org.apache.ignite.client.SslProtocol;
@@ -62,6 +63,7 @@ import org.apache.ignite.internal.binary.streams.BinaryHeapOutputStream;
import org.apache.ignite.internal.binary.streams.BinaryInputStream;
import org.apache.ignite.internal.binary.streams.BinaryOffheapOutputStream;
import org.apache.ignite.internal.binary.streams.BinaryOutputStream;
+import org.apache.ignite.internal.processors.platform.client.ClientStatus;
/**
* Implements {@link ClientChannel} over TCP.
@@ -138,7 +140,8 @@ class TcpClientChannel implements ClientChannel {
/** {@inheritDoc} */
public <T> T receive(ClientOperation op, long reqId, Function<BinaryInputStream, T> payloadReader)
- throws ClientConnectionException {
+ throws ClientConnectionException, ClientAuthorizationException {
+
final int MIN_RES_SIZE = 8 + 4; // minimal response size: long (8 bytes) ID + int (4 bytes) status
int resSize = new BinaryHeapInputStream(read(4)).readInt();
@@ -163,7 +166,12 @@ class TcpClientChannel implements ClientChannel {
String err = new BinaryReaderExImpl(null, resIn, null, true).readString();
- throw new ClientServerError(err, status, reqId);
+ switch (status) {
+ case ClientStatus.SECURITY_VIOLATION:
+ throw new ClientAuthorizationException();
+ default:
+ throw new ClientServerError(err, status, reqId);
+ }
}
if (resSize <= MIN_RES_SIZE || payloadReader == null)
@@ -539,16 +547,10 @@ class TcpClientChannel implements ClientChannel {
/** */
private static KeyStore loadKeyStore(String lb, String path, String type, char[] pwd) {
- InputStream in = null;
+ KeyStore store;
try {
- KeyStore store = KeyStore.getInstance(type);
-
- in = new FileInputStream(new File(path));
-
- store.load(in, pwd);
-
- return store;
+ store = KeyStore.getInstance(type);
}
catch (KeyStoreException e) {
throw new ClientError(
@@ -556,6 +558,13 @@ class TcpClientChannel implements ClientChannel {
e
);
}
+
+ try (InputStream in = new FileInputStream(new File(path))) {
+
+ store.load(in, pwd);
+
+ return store;
+ }
catch (FileNotFoundException e) {
throw new ClientError(String.format("%s key store file [%s] does not exist", lb, path), e);
}
@@ -571,16 +580,6 @@ class TcpClientChannel implements ClientChannel {
catch (IOException e) {
throw new ClientError(String.format("Could not read %s key store", lb), e);
}
- finally {
- if (in != null) {
- try {
- in.close();
- }
- catch (IOException ignored) {
- // Fail silently
- }
- }
- }
}
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
index c025e8c..93b3a5b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/authentication/IgniteAuthenticationProcessor.java
@@ -897,7 +897,10 @@ public class IgniteAuthenticationProcessor extends GridProcessorAdapter implemen
// Can be empty on initial start of PDS cluster (default user will be created and stored after activate)
if (!F.isEmpty(initUsrs.usrs)) {
- users.clear();
+ if (users == null)
+ users = new ConcurrentHashMap<>();
+ else
+ users.clear();
for (User u : initUsrs.usrs)
users.put(u.name(), u);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
index 7edac73..3aa6603 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProcessor.java
@@ -149,6 +149,8 @@ import org.apache.ignite.marshaller.MarshallerUtils;
import org.apache.ignite.marshaller.jdk.JdkMarshaller;
import org.apache.ignite.mxbean.CacheGroupMetricsMXBean;
import org.apache.ignite.mxbean.IgniteMBeanAware;
+import org.apache.ignite.plugin.security.SecurityException;
+import org.apache.ignite.plugin.security.SecurityPermission;
import org.apache.ignite.spi.IgniteNodeValidationResult;
import org.apache.ignite.spi.discovery.DiscoveryDataBag;
import org.apache.ignite.spi.discovery.DiscoveryDataBag.GridDiscoveryData;
@@ -1126,6 +1128,9 @@ public class GridCacheProcessor extends GridProcessorAdapter {
CacheConfiguration cfg = cacheCtx.config();
+ if (cacheCtx.userCache())
+ authorizeCacheCreate(cacheCtx.name(), cfg);
+
// Intentionally compare Boolean references using '!=' below to check if the flag has been explicitly set.
if (cfg.isStoreKeepBinary() && cfg.isStoreKeepBinary() != CacheConfiguration.DFLT_STORE_KEEP_BINARY
&& !(ctx.config().getMarshaller() instanceof BinaryMarshaller))
@@ -3151,6 +3156,8 @@ public class GridCacheProcessor extends GridProcessorAdapter {
Collection<DynamicCacheChangeRequest> sndReqs = new ArrayList<>(reqs.size());
for (DynamicCacheChangeRequest req : reqs) {
+ authorizeCacheChange(req);
+
DynamicCacheStartFuture fut = new DynamicCacheStartFuture(req.requestId());
try {
@@ -3216,6 +3223,31 @@ public class GridCacheProcessor extends GridProcessorAdapter {
}
/**
+ * Authorize dynamic cache management.
+ */
+ private void authorizeCacheChange(DynamicCacheChangeRequest req) {
+ if (req.cacheType() == null || req.cacheType() == CacheType.USER) {
+ if (req.stop())
+ ctx.security().authorize(req.cacheName(), SecurityPermission.CACHE_DESTROY, null);
+ else
+ authorizeCacheCreate(req.cacheName(), req.startCacheConfiguration());
+ }
+ }
+
+ /**
+ * Authorize start/create cache operation.
+ */
+ private void authorizeCacheCreate(String cacheName, CacheConfiguration cacheCfg) {
+ ctx.security().authorize(cacheName, SecurityPermission.CACHE_CREATE, null);
+
+ if (cacheCfg != null && cacheCfg.isOnheapCacheEnabled() &&
+ System.getProperty(IgniteSystemProperties.IGNITE_DISABLE_ONHEAP_CACHE, "false")
+ .toUpperCase().equals("TRUE")
+ )
+ throw new SecurityException("Authorization failed for enabling on-heap cache.");
+ }
+
+ /**
* @return Non null exception if node is stopping or disconnected.
*/
@Nullable private IgniteCheckedException checkNodeState() {
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
index d672420..e244c75 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheUtils.java
@@ -98,6 +98,8 @@ import org.apache.ignite.lang.IgnitePredicate;
import org.apache.ignite.lang.IgniteReducer;
import org.apache.ignite.lifecycle.LifecycleAware;
import org.apache.ignite.plugin.CachePluginConfiguration;
+import org.apache.ignite.plugin.security.SecurityException;
+import org.apache.ignite.spi.discovery.tcp.internal.TcpDiscoveryNode;
import org.apache.ignite.transactions.Transaction;
import org.apache.ignite.transactions.TransactionConcurrency;
import org.apache.ignite.transactions.TransactionIsolation;
@@ -1290,6 +1292,9 @@ public class GridCacheUtils {
if (e.getCause() instanceof NullPointerException)
return (NullPointerException)e.getCause();
+ if (e.getCause() instanceof SecurityException)
+ return (SecurityException)e.getCause();
+
C1<IgniteCheckedException, IgniteException> converter = U.getExceptionConverter(e.getClass());
return converter != null ? new CacheException(converter.apply(e)) : new CacheException(e);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientConnectionContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientConnectionContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientConnectionContext.java
index 7ab2d33..061aab3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientConnectionContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientConnectionContext.java
@@ -20,16 +20,24 @@ package org.apache.ignite.internal.processors.platform.client;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
+import java.util.UUID;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.binary.BinaryReaderExImpl;
import org.apache.ignite.internal.processors.authentication.AuthorizationContext;
+import org.apache.ignite.internal.processors.authentication.IgniteAccessControlException;
import org.apache.ignite.internal.processors.odbc.ClientListenerConnectionContext;
import org.apache.ignite.internal.processors.odbc.ClientListenerMessageParser;
import org.apache.ignite.internal.processors.odbc.ClientListenerProtocolVersion;
import org.apache.ignite.internal.processors.odbc.ClientListenerRequestHandler;
import java.util.concurrent.atomic.AtomicLong;
+import org.apache.ignite.internal.processors.security.SecurityContext;
+import org.apache.ignite.plugin.security.AuthenticationContext;
+import org.apache.ignite.plugin.security.SecurityCredentials;
+
+import static org.apache.ignite.plugin.security.SecuritySubjectType.REMOTE_CLIENT;
/**
* Thin Client connection context.
@@ -62,6 +70,9 @@ public class ClientConnectionContext implements ClientListenerConnectionContext
/** Cursor counter. */
private final AtomicLong curCnt = new AtomicLong();
+ /** Security context or {@code null} if security is disabled. */
+ private SecurityContext secCtx = null;
+
/**
* Ctor.
*
@@ -129,7 +140,9 @@ public class ClientConnectionContext implements ClientListenerConnectionContext
}
}
- if (kernalCtx.authentication().enabled()) {
+ if (kernalCtx.security().enabled())
+ authCtx = thirdPartyAuthentication(user, pwd).authorizationContext();
+ else if (kernalCtx.authentication().enabled()) {
if (user == null || user.length() == 0)
throw new IgniteCheckedException("Unauthenticated sessions are prohibited.");
@@ -179,4 +192,34 @@ public class ClientConnectionContext implements ClientListenerConnectionContext
public void decrementCursors() {
curCnt.decrementAndGet();
}
+
+ /**
+ * @return Security context or {@code null} if security is disabled.
+ */
+ public SecurityContext securityContext() {
+ return secCtx;
+ }
+
+ /**
+ * Do 3-rd party authentication.
+ */
+ private AuthenticationContext thirdPartyAuthentication(String user, String pwd) throws IgniteCheckedException {
+ SecurityCredentials cred = new SecurityCredentials(user, pwd);
+
+ AuthenticationContext authCtx = new AuthenticationContext();
+
+ authCtx.subjectType(REMOTE_CLIENT);
+ authCtx.subjectId(UUID.randomUUID());
+ authCtx.nodeAttributes(Collections.emptyMap());
+ authCtx.credentials(cred);
+
+ secCtx = kernalCtx.security().authenticate(authCtx);
+
+ if (secCtx == null)
+ throw new IgniteAccessControlException(
+ String.format("The user name or password is incorrect [userName=%s]", user)
+ );
+
+ return authCtx;
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientRequest.java
index 76823b5..799b3e7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientRequest.java
@@ -19,6 +19,9 @@ package org.apache.ignite.internal.processors.platform.client;
import org.apache.ignite.binary.BinaryRawReader;
import org.apache.ignite.internal.processors.odbc.ClientListenerRequest;
+import org.apache.ignite.internal.processors.security.SecurityContext;
+import org.apache.ignite.plugin.security.SecurityException;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Thin client request.
@@ -58,4 +61,30 @@ public class ClientRequest implements ClientListenerRequest {
public ClientResponse process(ClientConnectionContext ctx) {
return new ClientResponse(reqId);
}
+
+ /**
+ * Run the code with converting {@link SecurityException} to {@link IgniteClientException}.
+ */
+ protected static void runWithSecurityExceptionHandler(Runnable runnable) {
+ try {
+ runnable.run();
+ }
+ catch (SecurityException ex) {
+ throw new IgniteClientException(
+ ClientStatus.SECURITY_VIOLATION,
+ "Client is not authorized to perform this operation",
+ ex
+ );
+ }
+ }
+
+ /**
+ * Authorize for specified permission.
+ */
+ protected void authorize(ClientConnectionContext ctx, SecurityPermission perm) {
+ SecurityContext secCtx = ctx.securityContext();
+
+ if (secCtx != null)
+ runWithSecurityExceptionHandler(() -> ctx.kernalContext().security().authorize(null, perm, secCtx));
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientStatus.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientStatus.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientStatus.java
index e0049b4..b8dfb1f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientStatus.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/ClientStatus.java
@@ -48,4 +48,7 @@ public final class ClientStatus {
/** Resource does not exist. */
public static final int RESOURCE_DOES_NOT_EXIST = 1011;
+
+ /** Resource does not exist. */
+ public static final int SECURITY_VIOLATION = 1012;
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearKeyRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearKeyRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearKeyRequest.java
index 6bcbbe8..5f8e952 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearKeyRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearKeyRequest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.platform.client.cache;
import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Clear key request.
@@ -37,6 +38,8 @@ public class ClientCacheClearKeyRequest extends ClientCacheKeyRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_REMOVE);
+
cache(ctx).clear(key());
return super.process(ctx);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearKeysRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearKeysRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearKeysRequest.java
index 04eb7f6..d803f69 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearKeysRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearKeysRequest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.platform.client.cache;
import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Clear keys request.
@@ -37,6 +38,8 @@ public class ClientCacheClearKeysRequest extends ClientCacheKeysRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_REMOVE);
+
cache(ctx).clearAll(keys());
return super.process(ctx);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearRequest.java
index 0e5f20d..7b84522 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheClearRequest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.platform.client.cache;
import org.apache.ignite.binary.BinaryRawReader;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache clear request.
@@ -37,6 +38,8 @@ public class ClientCacheClearRequest extends ClientCacheRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_REMOVE);
+
cache(ctx).clear();
return super.process(ctx);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheContainsKeyRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheContainsKeyRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheContainsKeyRequest.java
index 8470828..386f448 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheContainsKeyRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheContainsKeyRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientBooleanResponse;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* ContainsKey request.
@@ -38,6 +39,8 @@ public class ClientCacheContainsKeyRequest extends ClientCacheKeyRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ);
+
boolean val = cache(ctx).containsKey(key());
return new ClientBooleanResponse(requestId(), val);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheContainsKeysRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheContainsKeysRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheContainsKeysRequest.java
index 41e1306..b5184bf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheContainsKeysRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheContainsKeysRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientBooleanResponse;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* ContainsKeys request.
@@ -38,6 +39,8 @@ public class ClientCacheContainsKeysRequest extends ClientCacheKeysRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ);
+
boolean val = cache(ctx).containsKeys(keys());
return new ClientBooleanResponse(requestId(), val);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheCreateWithConfigurationRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheCreateWithConfigurationRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheCreateWithConfigurationRequest.java
index 4b4dcec..65f9784 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheCreateWithConfigurationRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheCreateWithConfigurationRequest.java
@@ -25,6 +25,7 @@ import org.apache.ignite.internal.processors.platform.client.ClientRequest;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
import org.apache.ignite.internal.processors.platform.client.ClientStatus;
import org.apache.ignite.internal.processors.platform.client.IgniteClientException;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache create with configuration request.
@@ -47,8 +48,11 @@ public class ClientCacheCreateWithConfigurationRequest extends ClientRequest {
/** {@inheritDoc} */
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_CREATE);
+
try {
- ctx.kernalContext().grid().createCache(cacheCfg);
+ // Use security exception handler since the code authorizes "enable on-heap cache" permission
+ runWithSecurityExceptionHandler(() -> ctx.kernalContext().grid().createCache(cacheCfg));
} catch (CacheExistsException e) {
throw new IgniteClientException(ClientStatus.CACHE_EXISTS, e.getMessage());
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheCreateWithNameRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheCreateWithNameRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheCreateWithNameRequest.java
index 9155d76..cacf099 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheCreateWithNameRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheCreateWithNameRequest.java
@@ -24,6 +24,7 @@ import org.apache.ignite.internal.processors.platform.client.ClientRequest;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
import org.apache.ignite.internal.processors.platform.client.ClientStatus;
import org.apache.ignite.internal.processors.platform.client.IgniteClientException;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache create with name request.
@@ -45,6 +46,8 @@ public class ClientCacheCreateWithNameRequest extends ClientRequest {
/** {@inheritDoc} */
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_CREATE);
+
try {
ctx.kernalContext().grid().createCache(cacheName);
} catch (CacheExistsException e) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheDestroyRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheDestroyRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheDestroyRequest.java
index 6645a03..b6f85ee 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheDestroyRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheDestroyRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.binary.BinaryRawReader;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientRequest;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache destroy request.
@@ -42,6 +43,8 @@ public class ClientCacheDestroyRequest extends ClientRequest {
/** {@inheritDoc} */
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_DESTROY);
+
String cacheName = ClientCacheRequest.cacheDescriptor(ctx, cacheId).cacheName();
ctx.kernalContext().grid().destroyCache(cacheName);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAllRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAllRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAllRequest.java
index 2b33af1..a07305c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAllRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAllRequest.java
@@ -22,6 +22,7 @@ import org.apache.ignite.internal.processors.platform.client.ClientConnectionCon
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
import java.util.Map;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* GetAll request.
@@ -39,6 +40,8 @@ public class ClientCacheGetAllRequest extends ClientCacheKeysRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ);
+
Map val = cache(ctx).getAll(keys());
return new ClientCacheGetAllResponse(requestId(), val);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndPutIfAbsentRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndPutIfAbsentRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndPutIfAbsentRequest.java
index 8360213..8713a21 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndPutIfAbsentRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndPutIfAbsentRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientObjectResponse;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache get and put if absent request.
@@ -38,6 +39,8 @@ public class ClientCacheGetAndPutIfAbsentRequest extends ClientCacheKeyValueRequ
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ, SecurityPermission.CACHE_PUT);
+
Object res = cache(ctx).getAndPutIfAbsent(key(), val());
return new ClientObjectResponse(requestId(), res);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndPutRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndPutRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndPutRequest.java
index 7a540e8..dde5181 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndPutRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndPutRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientObjectResponse;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache get and put request.
@@ -38,6 +39,8 @@ public class ClientCacheGetAndPutRequest extends ClientCacheKeyValueRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ, SecurityPermission.CACHE_PUT);
+
Object res = cache(ctx).getAndPut(key(), val());
return new ClientObjectResponse(requestId(), res);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndRemoveRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndRemoveRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndRemoveRequest.java
index e4fd735..3b9dd4b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndRemoveRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndRemoveRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientObjectResponse;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache get and remove request.
@@ -38,6 +39,8 @@ public class ClientCacheGetAndRemoveRequest extends ClientCacheKeyRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ, SecurityPermission.CACHE_REMOVE);
+
Object val = cache(ctx).getAndRemove(key());
return new ClientObjectResponse(requestId(), val);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndReplaceRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndReplaceRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndReplaceRequest.java
index dba8639..8ba157a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndReplaceRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetAndReplaceRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientObjectResponse;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache get and replace request.
@@ -38,6 +39,8 @@ public class ClientCacheGetAndReplaceRequest extends ClientCacheKeyValueRequest
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ, SecurityPermission.CACHE_PUT);
+
Object res = cache(ctx).getAndReplace(key(), val());
return new ClientObjectResponse(requestId(), res);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetOrCreateWithConfigurationRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetOrCreateWithConfigurationRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetOrCreateWithConfigurationRequest.java
index 267318a..48569b4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetOrCreateWithConfigurationRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetOrCreateWithConfigurationRequest.java
@@ -25,6 +25,7 @@ import org.apache.ignite.internal.processors.platform.client.ClientRequest;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
import org.apache.ignite.internal.processors.platform.client.ClientStatus;
import org.apache.ignite.internal.processors.platform.client.IgniteClientException;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache get or create with configuration request.
@@ -47,8 +48,11 @@ public class ClientCacheGetOrCreateWithConfigurationRequest extends ClientReques
/** {@inheritDoc} */
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_CREATE);
+
try {
- ctx.kernalContext().grid().getOrCreateCache(cacheCfg);
+ // Use security exception handler since the code authorizes "enable on-heap cache" permission
+ runWithSecurityExceptionHandler(() -> ctx.kernalContext().grid().getOrCreateCache(cacheCfg));
} catch (CacheExistsException e) {
throw new IgniteClientException(ClientStatus.CACHE_EXISTS, e.getMessage());
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetOrCreateWithNameRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetOrCreateWithNameRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetOrCreateWithNameRequest.java
index 94dd115..3c4ce7b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetOrCreateWithNameRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetOrCreateWithNameRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.binary.BinaryRawReader;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientRequest;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache create with name request.
@@ -42,6 +43,8 @@ public class ClientCacheGetOrCreateWithNameRequest extends ClientRequest {
/** {@inheritDoc} */
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_CREATE);
+
ctx.kernalContext().grid().getOrCreateCache(cacheName);
return super.process(ctx);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetRequest.java
index 41558c2..dc17cbf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientObjectResponse;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache get request.
@@ -38,6 +39,8 @@ public class ClientCacheGetRequest extends ClientCacheKeyRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ);
+
Object val = cache(ctx).get(key());
return new ClientObjectResponse(requestId(), val);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetSizeRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetSizeRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetSizeRequest.java
index ba185bf..474c206 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetSizeRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheGetSizeRequest.java
@@ -22,6 +22,7 @@ import org.apache.ignite.cache.CachePeekMode;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientLongResponse;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache size request.
@@ -50,6 +51,8 @@ public class ClientCacheGetSizeRequest extends ClientCacheRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ);
+
long res = cache(ctx).sizeLong(modes);
return new ClientLongResponse(requestId(), res);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutAllRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutAllRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutAllRequest.java
index 28a7fa5..57e3144 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutAllRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutAllRequest.java
@@ -23,6 +23,7 @@ import org.apache.ignite.internal.processors.platform.client.ClientResponse;
import java.util.LinkedHashMap;
import java.util.Map;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* PutAll request.
@@ -50,6 +51,8 @@ public class ClientCachePutAllRequest extends ClientCacheRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_PUT);
+
cache(ctx).putAll(map);
return super.process(ctx);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutIfAbsentRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutIfAbsentRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutIfAbsentRequest.java
index 4dd2cde..ec81bc0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutIfAbsentRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutIfAbsentRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientBooleanResponse;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache put if absent request.
@@ -38,6 +39,8 @@ public class ClientCachePutIfAbsentRequest extends ClientCacheKeyValueRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ, SecurityPermission.CACHE_PUT);
+
boolean res = cache(ctx).putIfAbsent(key(), val());
return new ClientBooleanResponse(requestId(), res);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutRequest.java
index 2c396b7..116460e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCachePutRequest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.platform.client.cache;
import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache put request.
@@ -37,6 +38,8 @@ public class ClientCachePutRequest extends ClientCacheKeyValueRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_PUT);
+
cache(ctx).put(key(), val());
return super.process(ctx);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveAllRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveAllRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveAllRequest.java
index f5adc63..d90d873 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveAllRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveAllRequest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.platform.client.cache;
import org.apache.ignite.binary.BinaryRawReader;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache removeAll request.
@@ -37,6 +38,8 @@ public class ClientCacheRemoveAllRequest extends ClientCacheRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_REMOVE);
+
cache(ctx).removeAll();
return super.process(ctx);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveIfEqualsRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveIfEqualsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveIfEqualsRequest.java
index b86f2f8..26c191f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveIfEqualsRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveIfEqualsRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientBooleanResponse;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache remove request with value.
@@ -38,6 +39,8 @@ public class ClientCacheRemoveIfEqualsRequest extends ClientCacheKeyValueRequest
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ, SecurityPermission.CACHE_REMOVE);
+
boolean res = cache(ctx).remove(key(), val());
return new ClientBooleanResponse(requestId(), res);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveKeyRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveKeyRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveKeyRequest.java
index a68c327..5af9743 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveKeyRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveKeyRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientBooleanResponse;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Remove request.
@@ -38,6 +39,8 @@ public class ClientCacheRemoveKeyRequest extends ClientCacheKeyRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_REMOVE);
+
boolean val = cache(ctx).remove(key());
return new ClientBooleanResponse(requestId(), val);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveKeysRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveKeysRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveKeysRequest.java
index 043b568..62dea00 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveKeysRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRemoveKeysRequest.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal.processors.platform.client.cache;
import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Remove keys request.
@@ -37,6 +38,8 @@ public class ClientCacheRemoveKeysRequest extends ClientCacheKeysRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_REMOVE);
+
cache(ctx).removeAll(keys());
return super.process(ctx);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheReplaceIfEqualsRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheReplaceIfEqualsRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheReplaceIfEqualsRequest.java
index 8645fbb..056367d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheReplaceIfEqualsRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheReplaceIfEqualsRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientBooleanResponse;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache replace request.
@@ -43,6 +44,8 @@ public class ClientCacheReplaceIfEqualsRequest extends ClientCacheKeyValueReques
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ, SecurityPermission.CACHE_PUT);
+
boolean res = cache(ctx).replace(key(), val(), newVal);
return new ClientBooleanResponse(requestId(), res);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheReplaceRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheReplaceRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheReplaceRequest.java
index bd7a642..ea04593 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheReplaceRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheReplaceRequest.java
@@ -21,6 +21,7 @@ import org.apache.ignite.internal.binary.BinaryRawReaderEx;
import org.apache.ignite.internal.processors.platform.client.ClientBooleanResponse;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache replace request.
@@ -38,6 +39,8 @@ public class ClientCacheReplaceRequest extends ClientCacheKeyValueRequest {
/** {@inheritDoc} */
@SuppressWarnings("unchecked")
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ, SecurityPermission.CACHE_PUT);
+
boolean res = cache(ctx).replace(key(), val());
return new ClientBooleanResponse(requestId(), res);
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRequest.java
index 52b799f..9e2d1f1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheRequest.java
@@ -24,6 +24,8 @@ import org.apache.ignite.internal.processors.platform.client.ClientConnectionCon
import org.apache.ignite.internal.processors.platform.client.ClientRequest;
import org.apache.ignite.internal.processors.platform.client.ClientStatus;
import org.apache.ignite.internal.processors.platform.client.IgniteClientException;
+import org.apache.ignite.internal.processors.security.SecurityContext;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Cache get request.
@@ -119,4 +121,34 @@ class ClientCacheRequest extends ClientRequest {
protected int cacheId() {
return cacheId;
}
+
+ /** {@inheritDoc} */
+ protected void authorize(ClientConnectionContext ctx, SecurityPermission perm) {
+ SecurityContext secCtx = ctx.securityContext();
+
+ if (secCtx != null) {
+ DynamicCacheDescriptor cacheDesc = cacheDescriptor(ctx, cacheId);
+
+ runWithSecurityExceptionHandler(() -> {
+ ctx.kernalContext().security().authorize(cacheDesc.cacheName(), perm, secCtx);
+ });
+ }
+ }
+
+ /**
+ * Authorize for multiple permissions.
+ */
+ protected void authorize(ClientConnectionContext ctx, SecurityPermission... perm)
+ throws IgniteClientException {
+ SecurityContext secCtx = ctx.securityContext();
+
+ if (secCtx != null) {
+ DynamicCacheDescriptor cacheDesc = cacheDescriptor(ctx, cacheId);
+
+ runWithSecurityExceptionHandler(() -> {
+ for (SecurityPermission p : perm)
+ ctx.kernalContext().security().authorize(cacheDesc.cacheName(), p, secCtx);
+ });
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheScanQueryRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheScanQueryRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheScanQueryRequest.java
index 26ab236..70b6966 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheScanQueryRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheScanQueryRequest.java
@@ -28,6 +28,7 @@ import org.apache.ignite.internal.processors.platform.client.ClientConnectionCon
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
import org.apache.ignite.internal.processors.platform.utils.PlatformUtils;
import org.apache.ignite.lang.IgniteBiPredicate;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Scan query request.
@@ -80,6 +81,8 @@ public class ClientCacheScanQueryRequest extends ClientCacheRequest {
/** {@inheritDoc} */
@Override public ClientResponse process(ClientConnectionContext ctx) {
+ authorize(ctx, SecurityPermission.CACHE_READ);
+
IgniteCache cache = filterPlatform == FILTER_PLATFORM_JAVA && !isKeepBinary() ? rawCache(ctx) : cache(ctx);
ScanQuery qry = new ScanQuery()
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlFieldsQueryRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlFieldsQueryRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlFieldsQueryRequest.java
index cfd4498..3aa95bf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlFieldsQueryRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlFieldsQueryRequest.java
@@ -29,6 +29,7 @@ import org.apache.ignite.internal.processors.platform.cache.PlatformCache;
import org.apache.ignite.internal.processors.platform.client.ClientConnectionContext;
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
import org.apache.ignite.internal.processors.query.QueryUtils;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Sql query request.
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlQueryRequest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlQueryRequest.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlQueryRequest.java
index 8c21be1..40693e7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlQueryRequest.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/client/cache/ClientCacheSqlQueryRequest.java
@@ -26,6 +26,7 @@ import org.apache.ignite.internal.processors.platform.client.ClientConnectionCon
import org.apache.ignite.internal.processors.platform.client.ClientResponse;
import java.util.concurrent.TimeUnit;
+import org.apache.ignite.plugin.security.SecurityPermission;
/**
* Sql query request.
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/plugin/security/AuthenticationContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/security/AuthenticationContext.java b/modules/core/src/main/java/org/apache/ignite/plugin/security/AuthenticationContext.java
index 91f3379..9f2cfe2 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/security/AuthenticationContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/security/AuthenticationContext.java
@@ -21,6 +21,7 @@ import java.net.InetSocketAddress;
import java.util.Collections;
import java.util.Map;
import java.util.UUID;
+import org.apache.ignite.internal.processors.authentication.AuthorizationContext;
/**
* Authentication context.
@@ -41,6 +42,12 @@ public class AuthenticationContext {
/** */
private Map<String, Object> nodeAttrs;
+ /** Authorization context. */
+ private AuthorizationContext athrCtx;
+
+ /** True if this is a client node context. */
+ private boolean client;
+
/**
* Gets subject type.
*
@@ -130,4 +137,37 @@ public class AuthenticationContext {
public void nodeAttributes(Map<String, Object> nodeAttrs) {
this.nodeAttrs = nodeAttrs;
}
+
+ /**
+ * @return Native Apache Ignite authorization context acquired after authentication or {@code null} if native
+ * Ignite authentication is not used.
+ */
+ public AuthorizationContext authorizationContext(){
+ return athrCtx;
+ }
+
+ /**
+ * Set authorization context acquired after native Apache Ignite authentication.
+ */
+ public AuthenticationContext authorizationContext(AuthorizationContext newVal) {
+ athrCtx = newVal;
+
+ return this;
+ }
+
+ /**
+ * @return {@code true} if this is a client node context.
+ */
+ public boolean isClient() {
+ return client;
+ }
+
+ /**
+ * Sets flag indicating if this is client node context.
+ */
+ public AuthenticationContext setClient(boolean newVal) {
+ client = newVal;
+
+ return this;
+ }
}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
index 5436161..bca667d 100644
--- a/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
+++ b/modules/core/src/main/java/org/apache/ignite/plugin/security/SecurityPermission.java
@@ -64,7 +64,16 @@ public enum SecurityPermission {
SERVICE_CANCEL,
/** Service invoke permission. */
- SERVICE_INVOKE;
+ SERVICE_INVOKE,
+
+ /** Cache create permission. */
+ CACHE_CREATE,
+
+ /** Cache create permission. */
+ CACHE_DESTROY,
+
+ /** Join as server node permission. */
+ JOIN_AS_SERVER;
/** Enumerated values. */
private static final SecurityPermission[] VALS = values();
http://git-wip-us.apache.org/repos/asf/ignite/blob/5a292763/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
index 7bf37e1..6d3864e 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
@@ -99,6 +99,7 @@ import org.apache.ignite.lang.IgniteInClosure;
import org.apache.ignite.lang.IgniteProductVersion;
import org.apache.ignite.lang.IgniteUuid;
import org.apache.ignite.plugin.security.SecurityCredentials;
+import org.apache.ignite.plugin.security.SecurityPermission;
import org.apache.ignite.plugin.security.SecurityPermissionSet;
import org.apache.ignite.spi.IgniteNodeValidationResult;
import org.apache.ignite.spi.IgniteSpiContext;
@@ -3559,6 +3560,8 @@ class ServerImpl extends TcpDiscoveryImpl {
return;
}
else {
+ String authFailedMsg = null;
+
if (!(subj instanceof Serializable)) {
// Node has not pass authentication.
LT.warn(log, "Authentication subject is not Serializable [nodeId=" + node.id() +
@@ -3567,9 +3570,16 @@ class ServerImpl extends TcpDiscoveryImpl {
", addrs=" +
U.addressesAsString(node) + ']');
+ authFailedMsg = "Authentication subject is not serializable";
+ }
+ else if (!node.isClient() &&
+ !subj.systemOperationAllowed(SecurityPermission.JOIN_AS_SERVER))
+ authFailedMsg = "Node is not authorised to join as a server node";
+
+ if (authFailedMsg != null) {
// Always output in debug.
if (log.isDebugEnabled())
- log.debug("Authentication subject is not serializable [nodeId=" + node.id() +
+ log.debug(authFailedMsg + " [nodeId=" + node.id() +
", addrs=" + U.addressesAsString(node));
try {
[6/9] ignite git commit: IGNITE-8148: JDBC thin: semicolon as
delimiter for properties. This closes #3794.
Posted by ak...@apache.org.
IGNITE-8148: JDBC thin: semicolon as delimiter for properties. This closes #3794.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/14402e40
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/14402e40
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/14402e40
Branch: refs/heads/ignite-8201
Commit: 14402e4030cf0257b72c636894f140f346266299
Parents: 5a29276
Author: devozerov <vo...@gridgain.com>
Authored: Wed Apr 11 16:44:33 2018 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Apr 11 16:44:33 2018 +0300
----------------------------------------------------------------------
.../jdbc/thin/JdbcThinConnectionSelfTest.java | 233 +++++++++++++++----
.../jdbc/thin/ConnectionPropertiesImpl.java | 161 +++++++++----
2 files changed, 300 insertions(+), 94 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/14402e40/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSelfTest.java
index 14b91b2..ed0b324 100644
--- a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSelfTest.java
+++ b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinConnectionSelfTest.java
@@ -185,86 +185,136 @@ public class JdbcThinConnectionSelfTest extends JdbcThinAbstractSelfTest {
}
/**
+ * Test invalid socket buffer sizes with semicolon.
+ *
+ * @throws Exception If failed.
+ */
+ public void testSocketBuffersSemicolon() throws Exception {
+ final int dfltDufSize = 64 * 1024;
+
+ assertInvalid("jdbc:ignite:thin://127.0.0.1;socketSendBuffer=-1",
+ "Property cannot be lower than 0 [name=socketSendBuffer, value=-1]");
+
+ assertInvalid("jdbc:ignite:thin://127.0.0.1;socketReceiveBuffer=-1",
+ "Property cannot be lower than 0 [name=socketReceiveBuffer, value=-1]");
+
+ // Note that SO_* options are hints, so we check that value is equals to either what we set or to default.
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;socketSendBuffer=1024")) {
+ assertEquals(1024, io(conn).connectionProperties().getSocketSendBuffer());
+ assertEquals(dfltDufSize, io(conn).connectionProperties().getSocketReceiveBuffer());
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;socketReceiveBuffer=1024")) {
+ assertEquals(dfltDufSize, io(conn).connectionProperties().getSocketSendBuffer());
+ assertEquals(1024, io(conn).connectionProperties().getSocketReceiveBuffer());
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;" +
+ "socketSendBuffer=1024;socketReceiveBuffer=2048")) {
+ assertEquals(1024, io(conn).connectionProperties().getSocketSendBuffer());
+ assertEquals(2048, io(conn).connectionProperties().getSocketReceiveBuffer());
+ }
+ }
+
+ /**
* Test SQL hints.
*
* @throws Exception If failed.
*/
public void testSqlHints() throws Exception {
try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1")) {
- assertFalse(io(conn).connectionProperties().isDistributedJoins());
- assertFalse(io(conn).connectionProperties().isEnforceJoinOrder());
- assertFalse(io(conn).connectionProperties().isCollocated());
- assertFalse(io(conn).connectionProperties().isReplicatedOnly());
- assertFalse(io(conn).connectionProperties().isLazy());
- assertFalse(io(conn).connectionProperties().isSkipReducerOnUpdate());
+ assertHints(conn, false, false, false, false, false, false);
}
try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1?distributedJoins=true")) {
- assertTrue(io(conn).connectionProperties().isDistributedJoins());
- assertFalse(io(conn).connectionProperties().isEnforceJoinOrder());
- assertFalse(io(conn).connectionProperties().isCollocated());
- assertFalse(io(conn).connectionProperties().isReplicatedOnly());
- assertFalse(io(conn).connectionProperties().isLazy());
- assertFalse(io(conn).connectionProperties().isSkipReducerOnUpdate());
+ assertHints(conn, true, false, false, false, false, false);
}
try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1?enforceJoinOrder=true")) {
- assertFalse(io(conn).connectionProperties().isDistributedJoins());
- assertTrue(io(conn).connectionProperties().isEnforceJoinOrder());
- assertFalse(io(conn).connectionProperties().isCollocated());
- assertFalse(io(conn).connectionProperties().isReplicatedOnly());
- assertFalse(io(conn).connectionProperties().isLazy());
- assertFalse(io(conn).connectionProperties().isSkipReducerOnUpdate());
+ assertHints(conn, false, true, false, false, false, false);
}
try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1?collocated=true")) {
- assertFalse(io(conn).connectionProperties().isDistributedJoins());
- assertFalse(io(conn).connectionProperties().isEnforceJoinOrder());
- assertTrue(io(conn).connectionProperties().isCollocated());
- assertFalse(io(conn).connectionProperties().isReplicatedOnly());
- assertFalse(io(conn).connectionProperties().isLazy());
- assertFalse(io(conn).connectionProperties().isSkipReducerOnUpdate());
+ assertHints(conn, false, false, true, false, false, false);
}
try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1?replicatedOnly=true")) {
- assertFalse(io(conn).connectionProperties().isDistributedJoins());
- assertFalse(io(conn).connectionProperties().isEnforceJoinOrder());
- assertFalse(io(conn).connectionProperties().isCollocated());
- assertTrue(io(conn).connectionProperties().isReplicatedOnly());
- assertFalse(io(conn).connectionProperties().isLazy());
- assertFalse(io(conn).connectionProperties().isSkipReducerOnUpdate());
+ assertHints(conn, false, false, false, true, false, false);
}
try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1?lazy=true")) {
- assertFalse(io(conn).connectionProperties().isDistributedJoins());
- assertFalse(io(conn).connectionProperties().isEnforceJoinOrder());
- assertFalse(io(conn).connectionProperties().isCollocated());
- assertFalse(io(conn).connectionProperties().isReplicatedOnly());
- assertTrue(io(conn).connectionProperties().isLazy());
- assertFalse(io(conn).connectionProperties().isSkipReducerOnUpdate());
+ assertHints(conn, false, false, false, false, true, false);
}
try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1?skipReducerOnUpdate=true")) {
- assertFalse(io(conn).connectionProperties().isDistributedJoins());
- assertFalse(io(conn).connectionProperties().isEnforceJoinOrder());
- assertFalse(io(conn).connectionProperties().isCollocated());
- assertFalse(io(conn).connectionProperties().isReplicatedOnly());
- assertFalse(io(conn).connectionProperties().isLazy());
- assertTrue(io(conn).connectionProperties().isSkipReducerOnUpdate());
+ assertHints(conn, false, false, false, false, false, true);
}
try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1?distributedJoins=true&" +
"enforceJoinOrder=true&collocated=true&replicatedOnly=true&lazy=true&skipReducerOnUpdate=true")) {
- assertTrue(io(conn).connectionProperties().isDistributedJoins());
- assertTrue(io(conn).connectionProperties().isEnforceJoinOrder());
- assertTrue(io(conn).connectionProperties().isCollocated());
- assertTrue(io(conn).connectionProperties().isReplicatedOnly());
- assertTrue(io(conn).connectionProperties().isLazy());
- assertTrue(io(conn).connectionProperties().isSkipReducerOnUpdate());
+ assertHints(conn, true, true, true, true, true, true);
}
}
/**
+ * Test SQL hints with semicolon.
+ *
+ * @throws Exception If failed.
+ */
+ public void testSqlHintsSemicolon() throws Exception {
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;distributedJoins=true")) {
+ assertHints(conn, true, false, false, false, false, false);
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;enforceJoinOrder=true")) {
+ assertHints(conn, false, true, false, false, false, false);
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;collocated=true")) {
+ assertHints(conn, false, false, true, false, false, false);
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;replicatedOnly=true")) {
+ assertHints(conn, false, false, false, true, false, false);
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;lazy=true")) {
+ assertHints(conn, false, false, false, false, true, false);
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;skipReducerOnUpdate=true")) {
+ assertHints(conn, false, false, false, false, false, true);
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;distributedJoins=true;" +
+ "enforceJoinOrder=true;collocated=true;replicatedOnly=true;lazy=true;skipReducerOnUpdate=true")) {
+ assertHints(conn, true, true, true, true, true, true);
+ }
+ }
+
+ /**
+ * Assert hints.
+ *
+ * @param conn Connection.
+ * @param distributedJoins Distributed joins.
+ * @param enforceJoinOrder Enforce join order.
+ * @param collocated Co-located.
+ * @param replicatedOnly Replicated only.
+ * @param lazy Lazy.
+ * @param skipReducerOnUpdate Skip reducer on update.
+ * @throws Exception If failed.
+ */
+ private void assertHints(Connection conn, boolean distributedJoins, boolean enforceJoinOrder, boolean collocated,
+ boolean replicatedOnly, boolean lazy, boolean skipReducerOnUpdate)throws Exception {
+ assertEquals(distributedJoins, io(conn).connectionProperties().isDistributedJoins());
+ assertEquals(enforceJoinOrder, io(conn).connectionProperties().isEnforceJoinOrder());
+ assertEquals(collocated, io(conn).connectionProperties().isCollocated());
+ assertEquals(replicatedOnly, io(conn).connectionProperties().isReplicatedOnly());
+ assertEquals(lazy, io(conn).connectionProperties().isLazy());
+ assertEquals(skipReducerOnUpdate, io(conn).connectionProperties().isSkipReducerOnUpdate());
+ }
+
+ /**
* Test TCP no delay property handling.
*
* @throws Exception If failed.
@@ -304,6 +354,41 @@ public class JdbcThinConnectionSelfTest extends JdbcThinAbstractSelfTest {
}
/**
+ * Test TCP no delay property handling with semicolon.
+ *
+ * @throws Exception If failed.
+ */
+ public void testTcpNoDelaySemicolon() throws Exception {
+ assertInvalid("jdbc:ignite:thin://127.0.0.1;tcpNoDelay=0",
+ "Invalid property value. [name=tcpNoDelay, val=0, choices=[true, false]]");
+
+ assertInvalid("jdbc:ignite:thin://127.0.0.1;tcpNoDelay=1",
+ "Invalid property value. [name=tcpNoDelay, val=1, choices=[true, false]]");
+
+ assertInvalid("jdbc:ignite:thin://127.0.0.1;tcpNoDelay=false1",
+ "Invalid property value. [name=tcpNoDelay, val=false1, choices=[true, false]]");
+
+ assertInvalid("jdbc:ignite:thin://127.0.0.1;tcpNoDelay=true1",
+ "Invalid property value. [name=tcpNoDelay, val=true1, choices=[true, false]]");
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;tcpNoDelay=true")) {
+ assertTrue(io(conn).connectionProperties().isTcpNoDelay());
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;tcpNoDelay=True")) {
+ assertTrue(io(conn).connectionProperties().isTcpNoDelay());
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;tcpNoDelay=false")) {
+ assertFalse(io(conn).connectionProperties().isTcpNoDelay());
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;tcpNoDelay=False")) {
+ assertFalse(io(conn).connectionProperties().isTcpNoDelay());
+ }
+ }
+
+ /**
* Test autoCloseServerCursor property handling.
*
* @throws Exception If failed.
@@ -340,6 +425,38 @@ public class JdbcThinConnectionSelfTest extends JdbcThinAbstractSelfTest {
}
/**
+ * Test autoCloseServerCursor property handling with semicolon.
+ *
+ * @throws Exception If failed.
+ */
+ public void testAutoCloseServerCursorPropertySemicolon() throws Exception {
+ String url = "jdbc:ignite:thin://127.0.0.1;autoCloseServerCursor";
+
+ String err = "Invalid property value. [name=autoCloseServerCursor";
+
+ assertInvalid(url + "=0", err);
+ assertInvalid(url + "=1", err);
+ assertInvalid(url + "=false1", err);
+ assertInvalid(url + "=true1", err);
+
+ try (Connection conn = DriverManager.getConnection(url + "=true")) {
+ assertTrue(io(conn).connectionProperties().isAutoCloseServerCursor());
+ }
+
+ try (Connection conn = DriverManager.getConnection(url + "=True")) {
+ assertTrue(io(conn).connectionProperties().isAutoCloseServerCursor());
+ }
+
+ try (Connection conn = DriverManager.getConnection(url + "=false")) {
+ assertFalse(io(conn).connectionProperties().isAutoCloseServerCursor());
+ }
+
+ try (Connection conn = DriverManager.getConnection(url + "=False")) {
+ assertFalse(io(conn).connectionProperties().isAutoCloseServerCursor());
+ }
+ }
+
+ /**
* Test schema property in URL.
*
* @throws Exception If failed.
@@ -362,6 +479,25 @@ public class JdbcThinConnectionSelfTest extends JdbcThinAbstractSelfTest {
}
/**
+ * Test schema property in URL with semicolon.
+ *
+ * @throws Exception If failed.
+ */
+ public void testSchemaSemicolon() throws Exception {
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;schema=public")) {
+ assertEquals("Invalid schema", "PUBLIC", conn.getSchema());
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;schema=\"" + DEFAULT_CACHE_NAME + '"')) {
+ assertEquals("Invalid schema", DEFAULT_CACHE_NAME, conn.getSchema());
+ }
+
+ try (Connection conn = DriverManager.getConnection("jdbc:ignite:thin://127.0.0.1;schema=_not_exist_schema_")) {
+ assertEquals("Invalid schema", "_NOT_EXIST_SCHEMA_", conn.getSchema());
+ }
+ }
+
+ /**
* Get client socket for connection.
*
* @param conn Connection.
@@ -1010,6 +1146,7 @@ public class JdbcThinConnectionSelfTest extends JdbcThinAbstractSelfTest {
// Invalid parameter value
GridTestUtils.assertThrows(log,
new Callable<Object>() {
+ @SuppressWarnings("MagicConstant")
@Override public Object call() throws Exception {
conn.setTransactionIsolation(-1);
http://git-wip-us.apache.org/repos/asf/ignite/blob/14402e40/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionPropertiesImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionPropertiesImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionPropertiesImpl.java
index 5d77005..86dc298 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionPropertiesImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionPropertiesImpl.java
@@ -23,8 +23,6 @@ import java.sql.SQLException;
import java.util.Arrays;
import java.util.Properties;
import java.util.StringTokenizer;
-import javax.naming.RefAddr;
-import javax.naming.Reference;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.configuration.ClientConnectorConfiguration;
import org.apache.ignite.internal.processors.odbc.SqlStateCode;
@@ -44,6 +42,9 @@ public class ConnectionPropertiesImpl implements ConnectionProperties, Serializa
/** Default socket buffer size. */
private static final int DFLT_SOCK_BUFFER_SIZE = 64 * 1024;
+ /** Property: schema. */
+ private static final String PROP_SCHEMA = "schema";
+
/** Connection URL. */
private String url;
@@ -51,7 +52,7 @@ public class ConnectionPropertiesImpl implements ConnectionProperties, Serializa
private HostAndPortRange [] addrs;
/** Schema name. Hidden property. Is used to set default schema name part of the URL. */
- private StringProperty schema = new StringProperty("schema",
+ private StringProperty schema = new StringProperty(PROP_SCHEMA,
"Schema name of the connection", "PUBLIC", null, false, null);
/** Distributed joins property. */
@@ -487,21 +488,113 @@ public class ConnectionPropertiesImpl implements ConnectionProperties, Serializa
String nakedUrl = url.substring(JdbcThinUtils.URL_PREFIX.length()).trim();
- int pathPartEndPos = nakedUrl.indexOf('?');
+ parseUrl0(nakedUrl, props);
+ }
+
+ /**
+ * Parse naked URL (i.e. without {@link JdbcThinUtils#URL_PREFIX}).
+ *
+ * @param url Naked URL.
+ * @param props Properties.
+ * @throws SQLException If failed.
+ */
+ private void parseUrl0(String url, Properties props) throws SQLException {
+ // Determine mode - semicolon or ampersand.
+ int semicolonPos = url.indexOf(";");
+ int slashPos = url.indexOf("/");
+ int queryPos = url.indexOf("?");
+
+ boolean semicolonMode;
+
+ if (semicolonPos == -1 && slashPos == -1 && queryPos == -1)
+ // No special char -> any mode could be used, choose semicolon for simplicity.
+ semicolonMode = true;
+ else {
+ if (semicolonPos != -1) {
+ // Use semicolon mode if it appears earlier than slash or query.
+ semicolonMode =
+ (slashPos == -1 || semicolonPos < slashPos) && (queryPos == -1 || semicolonPos < queryPos);
+ }
+ else
+ // Semicolon is not found.
+ semicolonMode = false;
+ }
+
+ if (semicolonMode)
+ parseUrlWithSemicolon(url, props);
+ else
+ parseUrlWithQuery(url, props);
+ }
+
+ /**
+ * Parse URL in semicolon mode.
+ *
+ * @param url Naked URL
+ * @param props Properties.
+ * @throws SQLException If failed.
+ */
+ private void parseUrlWithSemicolon(String url, Properties props) throws SQLException {
+ int pathPartEndPos = url.indexOf(';');
if (pathPartEndPos == -1)
- pathPartEndPos = nakedUrl.length();
+ pathPartEndPos = url.length();
- String pathPart = nakedUrl.substring(0, pathPartEndPos);
+ String pathPart = url.substring(0, pathPartEndPos);
String paramPart = null;
- if (pathPartEndPos > 0 && pathPartEndPos < nakedUrl.length())
- paramPart = nakedUrl.substring(pathPartEndPos + 1, nakedUrl.length());
+ if (pathPartEndPos > 0 && pathPartEndPos < url.length())
+ paramPart = url.substring(pathPartEndPos + 1, url.length());
+
+ parseEndpoints(pathPart);
+
+ if (!F.isEmpty(paramPart))
+ parseParameters(paramPart, props, ";");
+ }
+
+ /**
+ * Parse URL in query mode.
+ *
+ * @param url Naked URL
+ * @param props Properties.
+ * @throws SQLException If failed.
+ */
+ private void parseUrlWithQuery(String url, Properties props) throws SQLException {
+ int pathPartEndPos = url.indexOf('?');
+
+ if (pathPartEndPos == -1)
+ pathPartEndPos = url.length();
+
+ String pathPart = url.substring(0, pathPartEndPos);
+
+ String paramPart = null;
+
+ if (pathPartEndPos > 0 && pathPartEndPos < url.length())
+ paramPart = url.substring(pathPartEndPos + 1, url.length());
String[] pathParts = pathPart.split("/");
- String [] endpoints = pathParts[0].split(",");
+ parseEndpoints(pathParts[0]);
+
+ if (pathParts.length > 2) {
+ throw new SQLException("Invalid URL format (only schema name is allowed in URL path parameter " +
+ "'host:port[/schemaName]'): " + this.url, SqlStateCode.CLIENT_CONNECTION_FAILED);
+ }
+
+ setSchema(pathParts.length == 2 ? pathParts[1] : null);
+
+ if (!F.isEmpty(paramPart))
+ parseParameters(paramPart, props, "&");
+ }
+
+ /**
+ * Parse endpoints.
+ *
+ * @param endpointStr Endpoint string.
+ * @throws SQLException If failed.
+ */
+ private void parseEndpoints(String endpointStr) throws SQLException {
+ String [] endpoints = endpointStr.split(",");
if (endpoints.length > 0)
addrs = new HostAndPortRange[endpoints.length];
@@ -519,16 +612,6 @@ public class ConnectionPropertiesImpl implements ConnectionProperties, Serializa
if (F.isEmpty(addrs) || F.isEmpty(addrs[0].host()))
throw new SQLException("Host name is empty", SqlStateCode.CLIENT_CONNECTION_FAILED);
-
- if (pathParts.length > 2) {
- throw new SQLException("Invalid URL format (only schema name is allowed in URL path parameter " +
- "'host:port[/schemaName]'): " + url, SqlStateCode.CLIENT_CONNECTION_FAILED);
- }
-
- setSchema(pathParts.length == 2 ? pathParts[1] : null);
-
- if (!F.isEmpty(paramPart))
- parseParameters(paramPart, props);
}
/**
@@ -536,10 +619,11 @@ public class ConnectionPropertiesImpl implements ConnectionProperties, Serializa
*
* @param paramStr Parameters string.
* @param props Properties.
+ * @param delimChar Delimiter character.
* @throws SQLException If failed.
*/
- private void parseParameters(String paramStr, Properties props) throws SQLException {
- StringTokenizer st = new StringTokenizer(paramStr, "&");
+ private void parseParameters(String paramStr, Properties props, String delimChar) throws SQLException {
+ StringTokenizer st = new StringTokenizer(paramStr, delimChar);
boolean insideBrace = false;
@@ -553,8 +637,8 @@ public class ConnectionPropertiesImpl implements ConnectionProperties, Serializa
int eqSymPos = token.indexOf('=');
if (eqSymPos < 0) {
- throw new SQLException("Invalid parameter format " +
- "(URL properties format: key0=value0&key1=value1&... etc. pair: " + token);
+ throw new SQLException("Invalid parameter format (should be \"key1=val1" + delimChar +
+ "key2=val2" + delimChar + "...\"): " + token);
}
if (eqSymPos == token.length())
@@ -570,7 +654,7 @@ public class ConnectionPropertiesImpl implements ConnectionProperties, Serializa
}
}
else
- val += "&" + token;
+ val += delimChar + token;
if (val.endsWith("}")) {
insideBrace = false;
@@ -587,22 +671,24 @@ public class ConnectionPropertiesImpl implements ConnectionProperties, Serializa
if (key.isEmpty() || val.isEmpty())
throw new SQLException("Invalid parameter format (key and value cannot be empty): " + token);
- props.setProperty(PROP_PREFIX + key, val);
+ if (PROP_SCHEMA.equalsIgnoreCase(key))
+ setSchema(val);
+ else
+ props.setProperty(PROP_PREFIX + key, val);
}
}
}
-
/**
* @return Driver's properties info array.
*/
public DriverPropertyInfo[] getDriverPropertyInfo() {
- DriverPropertyInfo[] dpis = new DriverPropertyInfo[propsArray.length];
+ DriverPropertyInfo[] infos = new DriverPropertyInfo[propsArray.length];
for (int i = 0; i < propsArray.length; ++i)
- dpis[i] = propsArray[i].getDriverPropertyInfo();
+ infos[i] = propsArray[i].getDriverPropertyInfo();
- return dpis;
+ return infos;
}
/**
@@ -741,23 +827,6 @@ public class ConnectionPropertiesImpl implements ConnectionProperties, Serializa
}
/**
- * @param ref Reference object.
- * @throws SQLException On error.
- */
- void init(Reference ref) throws SQLException {
- RefAddr refAddr = ref.get(name);
-
- if (refAddr != null) {
- String str = (String) refAddr.getContent();
-
- if (validator != null)
- validator.validate(str);
-
- init(str);
- }
- }
-
- /**
* @param str String representation of the
* @throws SQLException on error.
*/
[9/9] ignite git commit: Merge branches 'ignite-8201' and 'master' of
https://git-wip-us.apache.org/repos/asf/ignite into ignite-8201
Posted by ak...@apache.org.
Merge branches 'ignite-8201' and 'master' of https://git-wip-us.apache.org/repos/asf/ignite into ignite-8201
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/4ba2436f
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/4ba2436f
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/4ba2436f
Branch: refs/heads/ignite-8201
Commit: 4ba2436f6d01007e939a6ca409ee3cb1aa85af50
Parents: 6c01882 d1be9b8
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Thu Apr 12 00:32:20 2018 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Thu Apr 12 00:32:20 2018 +0700
----------------------------------------------------------------------
.../jdbc/thin/JdbcThinConnectionSelfTest.java | 233 ++++++++++++----
.../apache/ignite/IgniteSystemProperties.java | 21 ++
.../org/apache/ignite/cache/CacheMetrics.java | 7 +
.../client/ClientAuthenticationException.java | 2 +-
.../client/ClientAuthorizationException.java | 46 ++++
.../org/apache/ignite/internal/IgnitionEx.java | 50 +++-
.../internal/client/thin/ClientChannel.java | 3 +-
.../internal/client/thin/TcpClientChannel.java | 39 ++-
.../jdbc/thin/ConnectionPropertiesImpl.java | 161 +++++++----
.../discovery/GridDiscoveryManager.java | 3 +
.../affinity/GridAffinityAssignmentCache.java | 50 +++-
.../IgniteAuthenticationProcessor.java | 5 +-
.../processors/cache/GridCacheProcessor.java | 32 +++
.../processors/cache/GridCacheUtils.java | 5 +
.../processors/cache/WalStateManager.java | 8 +-
.../preloader/latch/ExchangeLatchManager.java | 3 +-
.../continuous/GridContinuousProcessor.java | 3 +
.../datastreamer/DataStreamProcessor.java | 3 +
.../processors/failure/FailureProcessor.java | 11 +
.../internal/processors/job/GridJobWorker.java | 8 +-
.../client/ClientConnectionContext.java | 45 +++-
.../platform/client/ClientRequest.java | 29 ++
.../platform/client/ClientStatus.java | 3 +
.../cache/ClientCacheClearKeyRequest.java | 3 +
.../cache/ClientCacheClearKeysRequest.java | 3 +
.../client/cache/ClientCacheClearRequest.java | 3 +
.../cache/ClientCacheContainsKeyRequest.java | 3 +
.../cache/ClientCacheContainsKeysRequest.java | 3 +
...ientCacheCreateWithConfigurationRequest.java | 6 +-
.../cache/ClientCacheCreateWithNameRequest.java | 3 +
.../client/cache/ClientCacheDestroyRequest.java | 3 +
.../client/cache/ClientCacheGetAllRequest.java | 3 +
.../ClientCacheGetAndPutIfAbsentRequest.java | 3 +
.../cache/ClientCacheGetAndPutRequest.java | 3 +
.../cache/ClientCacheGetAndRemoveRequest.java | 3 +
.../cache/ClientCacheGetAndReplaceRequest.java | 3 +
...acheGetOrCreateWithConfigurationRequest.java | 6 +-
.../ClientCacheGetOrCreateWithNameRequest.java | 3 +
.../client/cache/ClientCacheGetRequest.java | 3 +
.../client/cache/ClientCacheGetSizeRequest.java | 3 +
.../client/cache/ClientCachePutAllRequest.java | 3 +
.../cache/ClientCachePutIfAbsentRequest.java | 3 +
.../client/cache/ClientCachePutRequest.java | 3 +
.../cache/ClientCacheRemoveAllRequest.java | 3 +
.../cache/ClientCacheRemoveIfEqualsRequest.java | 3 +
.../cache/ClientCacheRemoveKeyRequest.java | 3 +
.../cache/ClientCacheRemoveKeysRequest.java | 3 +
.../ClientCacheReplaceIfEqualsRequest.java | 3 +
.../client/cache/ClientCacheReplaceRequest.java | 3 +
.../client/cache/ClientCacheRequest.java | 32 +++
.../cache/ClientCacheScanQueryRequest.java | 3 +
.../cache/ClientCacheSqlFieldsQueryRequest.java | 1 +
.../cache/ClientCacheSqlQueryRequest.java | 1 +
.../cluster/GridChangeStateCommandHandler.java | 3 +-
.../service/GridServiceProcessor.java | 15 +-
.../apache/ignite/internal/util/typedef/X.java | 37 ++-
.../visor/util/VisorExceptionWrapper.java | 11 +-
.../plugin/security/AuthenticationContext.java | 40 +++
.../plugin/security/SecurityPermission.java | 11 +-
.../communication/tcp/TcpCommunicationSpi.java | 2 +-
.../ignite/spi/discovery/tcp/ServerImpl.java | 12 +-
.../thread/IgniteStripedThreadPoolExecutor.java | 8 +-
.../ignite/thread/IgniteThreadFactory.java | 30 ++-
.../ignite/thread/IgniteThreadPoolExecutor.java | 12 +-
.../ignite/thread/OomExceptionHandler.java | 44 +++
.../ignite/GridSuppressedExceptionSelfTest.java | 23 +-
.../AffinityDistributionLoggingTest.java | 268 +++++++++++++++++++
.../ignite/failure/OomFailureHandlerTest.java | 255 ++++++++++++++++++
.../ignite/testsuites/IgniteBasicTestSuite.java | 2 +
.../testsuites/IgniteCacheTestSuite5.java | 9 +-
.../query/h2/twostep/GridMapQueryExecutor.java | 7 +
.../query/h2/twostep/MapQueryLazyWorker.java | 13 +-
72 files changed, 1514 insertions(+), 179 deletions(-)
----------------------------------------------------------------------
[4/9] ignite git commit: IGNITE-8204: SQL: fixed hangs when lazy flag
is enabled. This closes #3785.
Posted by ak...@apache.org.
IGNITE-8204: SQL: fixed hangs when lazy flag is enabled. This closes #3785.
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/747e6c5f
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/747e6c5f
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/747e6c5f
Branch: refs/heads/ignite-8201
Commit: 747e6c5f9c635a5b9c6856efd2b94b05297b7f25
Parents: 98ef925
Author: Alexander Paschenko <al...@gmail.com>
Authored: Wed Apr 11 16:20:16 2018 +0300
Committer: devozerov <vo...@gridgain.com>
Committed: Wed Apr 11 16:20:16 2018 +0300
----------------------------------------------------------------------
.../query/h2/twostep/GridMapQueryExecutor.java | 7 +++++++
.../query/h2/twostep/MapQueryLazyWorker.java | 13 +++++++++++--
2 files changed, 18 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/747e6c5f/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 9b1e4fa..930ada2 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
@@ -234,6 +234,13 @@ public class GridMapQueryExecutor {
}
/**
+ * @return Busy lock for lazy workers to guard their operations with.
+ */
+ GridSpinBusyLock busyLock() {
+ return busyLock;
+ }
+
+ /**
* @param node Node.
* @param msg Message.
*/
http://git-wip-us.apache.org/repos/asf/ignite/blob/747e6c5f/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/MapQueryLazyWorker.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/MapQueryLazyWorker.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/MapQueryLazyWorker.java
index 59c050f..98f3df9 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/MapQueryLazyWorker.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/twostep/MapQueryLazyWorker.java
@@ -80,8 +80,17 @@ public class MapQueryLazyWorker extends GridWorker {
while (!isCancelled()) {
Runnable task = tasks.take();
- if (task != null)
- task.run();
+ if (task != null) {
+ if (!exec.busyLock().enterBusy())
+ return;
+
+ try {
+ task.run();
+ }
+ finally {
+ exec.busyLock().leaveBusy();
+ }
+ }
}
}
finally {
[8/9] ignite git commit: IGNITE-6892 OOM should be covered by failure
handling
Posted by ak...@apache.org.
IGNITE-6892 OOM should be covered by failure handling
Signed-off-by: Andrey Gura <ag...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/d1be9b85
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/d1be9b85
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/d1be9b85
Branch: refs/heads/ignite-8201
Commit: d1be9b85507eb3358327e93b81031f92e660531b
Parents: 32fc6c3
Author: Aleksey Plekhanov <pl...@gmail.com>
Authored: Wed Apr 11 18:24:51 2018 +0300
Committer: Andrey Gura <ag...@apache.org>
Committed: Wed Apr 11 18:24:51 2018 +0300
----------------------------------------------------------------------
.../apache/ignite/IgniteSystemProperties.java | 8 +
.../org/apache/ignite/internal/IgnitionEx.java | 50 +++-
.../discovery/GridDiscoveryManager.java | 3 +
.../processors/cache/WalStateManager.java | 8 +-
.../continuous/GridContinuousProcessor.java | 3 +
.../datastreamer/DataStreamProcessor.java | 3 +
.../processors/failure/FailureProcessor.java | 11 +
.../internal/processors/job/GridJobWorker.java | 8 +-
.../service/GridServiceProcessor.java | 15 +-
.../thread/IgniteStripedThreadPoolExecutor.java | 8 +-
.../ignite/thread/IgniteThreadFactory.java | 30 ++-
.../ignite/thread/IgniteThreadPoolExecutor.java | 12 +-
.../ignite/thread/OomExceptionHandler.java | 44 ++++
.../ignite/failure/OomFailureHandlerTest.java | 255 +++++++++++++++++++
.../ignite/testsuites/IgniteBasicTestSuite.java | 2 +
15 files changed, 430 insertions(+), 30 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
index 662338c..437f49f 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteSystemProperties.java
@@ -863,6 +863,14 @@ public final class IgniteSystemProperties {
public static final String IGNITE_BPLUS_TREE_LOCK_RETRIES = "IGNITE_BPLUS_TREE_LOCK_RETRIES";
/**
+ * Amount of memory reserved in the heap at node start, which can be dropped to increase the chances of success when
+ * handling OutOfMemoryError.
+ *
+ * Default is {@code 64kb}.
+ */
+ public static final String IGNITE_FAILURE_HANDLER_RESERVE_BUFFER_SIZE = "IGNITE_FAILURE_HANDLER_RESERVE_BUFFER_SIZE";
+
+ /**
* The threshold of uneven distribution above which partition distribution will be logged.
*
* The default is '50', that means: warn about nodes with 50+% difference.
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
index 10a0752..b3c3ee8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
@@ -20,6 +20,7 @@ package org.apache.ignite.internal;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.lang.Thread.UncaughtExceptionHandler;
import java.lang.management.ManagementFactory;
import java.lang.reflect.Constructor;
import java.net.MalformedURLException;
@@ -88,6 +89,7 @@ import org.apache.ignite.internal.util.typedef.CA;
import org.apache.ignite.internal.util.typedef.F;
import org.apache.ignite.internal.util.typedef.G;
import org.apache.ignite.internal.util.typedef.T2;
+import org.apache.ignite.internal.util.typedef.X;
import org.apache.ignite.internal.util.typedef.internal.A;
import org.apache.ignite.internal.util.typedef.internal.CU;
import org.apache.ignite.internal.util.typedef.internal.U;
@@ -1764,6 +1766,13 @@ public class IgnitionEx {
validateThreadPoolSize(cfg.getPublicThreadPoolSize(), "public");
+ UncaughtExceptionHandler oomeHnd = new UncaughtExceptionHandler() {
+ @Override public void uncaughtException(Thread t, Throwable e) {
+ if (grid != null && X.hasCause(e, OutOfMemoryError.class))
+ grid.context().failure().process(new FailureContext(FailureType.CRITICAL_ERROR, e));
+ }
+ };
+
execSvc = new IgniteThreadPoolExecutor(
"pub",
cfg.getIgniteInstanceName(),
@@ -1771,7 +1780,8 @@ public class IgnitionEx {
cfg.getPublicThreadPoolSize(),
DFLT_THREAD_KEEP_ALIVE_TIME,
new LinkedBlockingQueue<Runnable>(),
- GridIoPolicy.PUBLIC_POOL);
+ GridIoPolicy.PUBLIC_POOL,
+ oomeHnd);
execSvc.allowCoreThreadTimeOut(true);
@@ -1784,7 +1794,8 @@ public class IgnitionEx {
cfg.getServiceThreadPoolSize(),
DFLT_THREAD_KEEP_ALIVE_TIME,
new LinkedBlockingQueue<Runnable>(),
- GridIoPolicy.SERVICE_POOL);
+ GridIoPolicy.SERVICE_POOL,
+ oomeHnd);
svcExecSvc.allowCoreThreadTimeOut(true);
@@ -1797,7 +1808,8 @@ public class IgnitionEx {
cfg.getSystemThreadPoolSize(),
DFLT_THREAD_KEEP_ALIVE_TIME,
new LinkedBlockingQueue<Runnable>(),
- GridIoPolicy.SYSTEM_POOL);
+ GridIoPolicy.SYSTEM_POOL,
+ oomeHnd);
sysExecSvc.allowCoreThreadTimeOut(true);
@@ -1828,7 +1840,8 @@ public class IgnitionEx {
cfg.getManagementThreadPoolSize(),
DFLT_THREAD_KEEP_ALIVE_TIME,
new LinkedBlockingQueue<Runnable>(),
- GridIoPolicy.MANAGEMENT_POOL);
+ GridIoPolicy.MANAGEMENT_POOL,
+ oomeHnd);
mgmtExecSvc.allowCoreThreadTimeOut(true);
@@ -1844,7 +1857,8 @@ public class IgnitionEx {
cfg.getPeerClassLoadingThreadPoolSize(),
DFLT_THREAD_KEEP_ALIVE_TIME,
new LinkedBlockingQueue<Runnable>(),
- GridIoPolicy.P2P_POOL);
+ GridIoPolicy.P2P_POOL,
+ oomeHnd);
p2pExecSvc.allowCoreThreadTimeOut(true);
@@ -1879,7 +1893,8 @@ public class IgnitionEx {
callbackExecSvc = new IgniteStripedThreadPoolExecutor(
cfg.getAsyncCallbackPoolSize(),
cfg.getIgniteInstanceName(),
- "callback");
+ "callback",
+ oomeHnd);
if (myCfg.getConnectorConfiguration() != null) {
validateThreadPoolSize(myCfg.getConnectorConfiguration().getThreadPoolSize(), "connector");
@@ -1890,7 +1905,9 @@ public class IgnitionEx {
myCfg.getConnectorConfiguration().getThreadPoolSize(),
myCfg.getConnectorConfiguration().getThreadPoolSize(),
DFLT_THREAD_KEEP_ALIVE_TIME,
- new LinkedBlockingQueue<Runnable>()
+ new LinkedBlockingQueue<Runnable>(),
+ GridIoPolicy.UNDEFINED,
+ oomeHnd
);
restExecSvc.allowCoreThreadTimeOut(true);
@@ -1905,7 +1922,8 @@ public class IgnitionEx {
myCfg.getUtilityCacheThreadPoolSize(),
myCfg.getUtilityCacheKeepAliveTime(),
new LinkedBlockingQueue<Runnable>(),
- GridIoPolicy.UTILITY_CACHE_POOL);
+ GridIoPolicy.UTILITY_CACHE_POOL,
+ oomeHnd);
utilityCacheExecSvc.allowCoreThreadTimeOut(true);
@@ -1916,7 +1934,8 @@ public class IgnitionEx {
1,
DFLT_THREAD_KEEP_ALIVE_TIME,
new LinkedBlockingQueue<Runnable>(),
- GridIoPolicy.AFFINITY_POOL);
+ GridIoPolicy.AFFINITY_POOL,
+ oomeHnd);
affExecSvc.allowCoreThreadTimeOut(true);
@@ -1930,7 +1949,8 @@ public class IgnitionEx {
cpus * 2,
3000L,
new LinkedBlockingQueue<Runnable>(1000),
- GridIoPolicy.IDX_POOL
+ GridIoPolicy.IDX_POOL,
+ oomeHnd
);
}
@@ -1943,7 +1963,8 @@ public class IgnitionEx {
cfg.getQueryThreadPoolSize(),
DFLT_THREAD_KEEP_ALIVE_TIME,
new LinkedBlockingQueue<Runnable>(),
- GridIoPolicy.QUERY_POOL);
+ GridIoPolicy.QUERY_POOL,
+ oomeHnd);
qryExecSvc.allowCoreThreadTimeOut(true);
@@ -1954,7 +1975,8 @@ public class IgnitionEx {
2,
DFLT_THREAD_KEEP_ALIVE_TIME,
new LinkedBlockingQueue<Runnable>(),
- GridIoPolicy.SCHEMA_POOL);
+ GridIoPolicy.SCHEMA_POOL,
+ oomeHnd);
schemaExecSvc.allowCoreThreadTimeOut(true);
@@ -1970,7 +1992,9 @@ public class IgnitionEx {
execCfg.getSize(),
execCfg.getSize(),
DFLT_THREAD_KEEP_ALIVE_TIME,
- new LinkedBlockingQueue<Runnable>());
+ new LinkedBlockingQueue<Runnable>(),
+ GridIoPolicy.UNDEFINED,
+ oomeHnd);
customExecSvcs.put(execCfg.getName(), exec);
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/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 400bb5f..77c9657 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
@@ -130,6 +130,7 @@ import org.apache.ignite.spi.discovery.DiscoverySpiNodeAuthenticator;
import org.apache.ignite.spi.discovery.DiscoverySpiOrderSupport;
import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
import org.apache.ignite.thread.IgniteThread;
+import org.apache.ignite.thread.OomExceptionHandler;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -924,6 +925,8 @@ public class GridDiscoveryManager extends GridManagerAdapter<DiscoverySpi> {
segChkThread = new IgniteThread(segChkWrk);
+ segChkThread.setUncaughtExceptionHandler(new OomExceptionHandler(ctx));
+
segChkThread.start();
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/WalStateManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/WalStateManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/WalStateManager.java
index 0ac699f..64a6819 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/WalStateManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/WalStateManager.java
@@ -38,6 +38,7 @@ import org.apache.ignite.lang.IgniteFuture;
import org.apache.ignite.lang.IgniteInClosure;
import org.apache.ignite.lang.IgnitePredicate;
import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.thread.OomExceptionHandler;
import org.apache.ignite.thread.IgniteThread;
import org.jetbrains.annotations.Nullable;
@@ -473,7 +474,12 @@ public class WalStateManager extends GridCacheSharedManagerAdapter {
// not-yet-flushed dirty pages have been logged.
WalStateChangeWorker worker = new WalStateChangeWorker(msg, cpFut);
- new IgniteThread(worker).start();
+ IgniteThread thread = new IgniteThread(worker);
+
+ thread.setUncaughtExceptionHandler(new OomExceptionHandler(
+ cctx.kernalContext()));
+
+ thread.start();
}
else {
// Disable: not-yet-flushed operations are not logged, so wait for them
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/GridContinuousProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/GridContinuousProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/GridContinuousProcessor.java
index cebe4b1..2d48b7d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/GridContinuousProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/continuous/GridContinuousProcessor.java
@@ -88,6 +88,7 @@ import org.apache.ignite.spi.discovery.DiscoveryDataBag;
import org.apache.ignite.spi.discovery.DiscoveryDataBag.GridDiscoveryData;
import org.apache.ignite.spi.discovery.DiscoveryDataBag.JoiningNodeDiscoveryData;
import org.apache.ignite.thread.IgniteThread;
+import org.apache.ignite.thread.OomExceptionHandler;
import org.jetbrains.annotations.Nullable;
import static org.apache.ignite.events.EventType.EVT_NODE_FAILED;
@@ -1727,6 +1728,8 @@ public class GridContinuousProcessor extends GridProcessorAdapter {
}
});
+ checker.setUncaughtExceptionHandler(new OomExceptionHandler(ctx));
+
bufCheckThreads.put(routineId, checker);
checker.start();
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamProcessor.java
index 8b984c0..e63d7d4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamProcessor.java
@@ -44,6 +44,7 @@ import org.apache.ignite.lang.IgniteInClosure;
import org.apache.ignite.marshaller.Marshaller;
import org.apache.ignite.stream.StreamReceiver;
import org.apache.ignite.thread.IgniteThread;
+import org.apache.ignite.thread.OomExceptionHandler;
import org.jetbrains.annotations.Nullable;
import java.util.Collection;
@@ -125,6 +126,8 @@ public class DataStreamProcessor<K, V> extends GridProcessorAdapter {
}
});
+ flusher.setUncaughtExceptionHandler(new OomExceptionHandler(ctx));
+
flusher.start();
if (log.isDebugEnabled())
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/internal/processors/failure/FailureProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/failure/FailureProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/failure/FailureProcessor.java
index 615fb9f..0234e84 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/failure/FailureProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/failure/FailureProcessor.java
@@ -19,12 +19,14 @@ package org.apache.ignite.internal.processors.failure;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.failure.FailureContext;
import org.apache.ignite.failure.FailureHandler;
import org.apache.ignite.failure.StopNodeOrHaltFailureHandler;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.processors.GridProcessorAdapter;
+import org.apache.ignite.internal.util.typedef.X;
import org.apache.ignite.internal.util.typedef.internal.U;
/**
@@ -40,6 +42,9 @@ public class FailureProcessor extends GridProcessorAdapter {
/** Failure context. */
private volatile FailureContext failureCtx;
+ /** Reserve buffer, which can be dropped to handle OOME. */
+ private volatile byte[] reserveBuf;
+
/**
* @param ctx Context.
*/
@@ -56,6 +61,9 @@ public class FailureProcessor extends GridProcessorAdapter {
if (hnd == null)
hnd = getDefaultFailureHandler();
+ reserveBuf = new byte[IgniteSystemProperties.getInteger(
+ IgniteSystemProperties.IGNITE_FAILURE_HANDLER_RESERVE_BUFFER_SIZE, 64 * 1024)];
+
assert hnd != null;
this.hnd = hnd;
@@ -102,6 +110,9 @@ public class FailureProcessor extends GridProcessorAdapter {
U.error(ignite.log(), "Critical failure. Will be handled accordingly to configured handler [hnd=" +
hnd.getClass() + ", failureCtx=" + failureCtx + ']', failureCtx.error());
+ if (reserveBuf != null && X.hasCause(failureCtx.error(), OutOfMemoryError.class))
+ reserveBuf = null;
+
boolean invalidated = hnd.onFailure(ignite, failureCtx);
if (invalidated) {
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobWorker.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobWorker.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobWorker.java
index 6d2e621..f7c07f5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobWorker.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobWorker.java
@@ -36,6 +36,8 @@ import org.apache.ignite.compute.ComputeJobContext;
import org.apache.ignite.compute.ComputeJobMasterLeaveAware;
import org.apache.ignite.compute.ComputeUserUndeclaredException;
import org.apache.ignite.events.JobEvent;
+import org.apache.ignite.failure.FailureContext;
+import org.apache.ignite.failure.FailureType;
import org.apache.ignite.igfs.IgfsOutOfSpaceException;
import org.apache.ignite.internal.GridInternalException;
import org.apache.ignite.internal.GridJobContextImpl;
@@ -603,9 +605,13 @@ public class GridJobWorker extends GridWorker implements GridTimeoutObject {
X.hasCause(e, ClusterTopologyCheckedException.class))
// Should be throttled, because GridServiceProxy continuously retry getting service.
LT.error(log, e, "Failed to execute job [jobId=" + ses.getJobId() + ", ses=" + ses + ']');
- else
+ else {
U.error(log, "Failed to execute job [jobId=" + ses.getJobId() + ", ses=" + ses + ']', e);
+ if (X.hasCause(e, OutOfMemoryError.class))
+ ctx.failure().process(new FailureContext(FailureType.CRITICAL_ERROR, e));
+ }
+
ex = e;
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
index ff68e72..63f5027 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
@@ -17,6 +17,7 @@
package org.apache.ignite.internal.processors.service;
+import java.lang.Thread.UncaughtExceptionHandler;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -103,6 +104,7 @@ import org.apache.ignite.services.ServiceConfiguration;
import org.apache.ignite.services.ServiceDeploymentException;
import org.apache.ignite.services.ServiceDescriptor;
import org.apache.ignite.thread.IgniteThreadFactory;
+import org.apache.ignite.thread.OomExceptionHandler;
import org.apache.ignite.transactions.Transaction;
import org.jetbrains.annotations.Nullable;
import java.util.concurrent.ConcurrentHashMap;
@@ -112,7 +114,6 @@ import static org.apache.ignite.IgniteSystemProperties.getString;
import static org.apache.ignite.configuration.DeploymentMode.ISOLATED;
import static org.apache.ignite.configuration.DeploymentMode.PRIVATE;
import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_SERVICES_COMPATIBILITY_MODE;
-import static org.apache.ignite.internal.processors.cache.GridCacheUtils.UTILITY_CACHE_NAME;
import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED;
import static org.apache.ignite.transactions.TransactionIsolation.REPEATABLE_READ;
@@ -154,8 +155,12 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
/** Busy lock. */
private volatile GridSpinBusyLock busyLock = new GridSpinBusyLock();
+ /** Uncaught exception handler for thread pools. */
+ private final UncaughtExceptionHandler oomeHnd = new OomExceptionHandler(ctx);
+
/** Thread factory. */
- private ThreadFactory threadFactory = new IgniteThreadFactory(ctx.igniteInstanceName(), "service");
+ private ThreadFactory threadFactory = new IgniteThreadFactory(ctx.igniteInstanceName(), "service",
+ oomeHnd);
/** Thread local for service name. */
private ThreadLocal<String> svcName = new ThreadLocal<>();
@@ -175,7 +180,8 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
public GridServiceProcessor(GridKernalContext ctx) {
super(ctx);
- depExe = Executors.newSingleThreadExecutor(new IgniteThreadFactory(ctx.igniteInstanceName(), "srvc-deploy"));
+ depExe = Executors.newSingleThreadExecutor(new IgniteThreadFactory(ctx.igniteInstanceName(),
+ "srvc-deploy", oomeHnd));
String servicesCompatibilityMode = getString(IGNITE_SERVICES_COMPATIBILITY_MODE);
@@ -373,7 +379,8 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
busyLock = new GridSpinBusyLock();
- depExe = Executors.newSingleThreadExecutor(new IgniteThreadFactory(ctx.igniteInstanceName(), "srvc-deploy"));
+ depExe = Executors.newSingleThreadExecutor(new IgniteThreadFactory(ctx.igniteInstanceName(),
+ "srvc-deploy", oomeHnd));
start();
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/thread/IgniteStripedThreadPoolExecutor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/thread/IgniteStripedThreadPoolExecutor.java b/modules/core/src/main/java/org/apache/ignite/thread/IgniteStripedThreadPoolExecutor.java
index 3cd7484..418812f 100644
--- a/modules/core/src/main/java/org/apache/ignite/thread/IgniteStripedThreadPoolExecutor.java
+++ b/modules/core/src/main/java/org/apache/ignite/thread/IgniteStripedThreadPoolExecutor.java
@@ -17,6 +17,7 @@
package org.apache.ignite.thread;
+import java.lang.Thread.UncaughtExceptionHandler;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
@@ -45,10 +46,11 @@ public class IgniteStripedThreadPoolExecutor implements ExecutorService {
* @param igniteInstanceName Node name.
* @param threadNamePrefix Thread name prefix.
*/
- public IgniteStripedThreadPoolExecutor(int concurrentLvl, String igniteInstanceName, String threadNamePrefix) {
+ public IgniteStripedThreadPoolExecutor(int concurrentLvl, String igniteInstanceName, String threadNamePrefix,
+ UncaughtExceptionHandler eHnd) {
execs = new ExecutorService[concurrentLvl];
- ThreadFactory factory = new IgniteThreadFactory(igniteInstanceName, threadNamePrefix);
+ ThreadFactory factory = new IgniteThreadFactory(igniteInstanceName, threadNamePrefix, eHnd);
for (int i = 0; i < concurrentLvl; i++)
execs[i] = Executors.newSingleThreadExecutor(factory);
@@ -173,4 +175,4 @@ public class IgniteStripedThreadPoolExecutor implements ExecutorService {
@Override public String toString() {
return S.toString(IgniteStripedThreadPoolExecutor.class, this);
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
index 062c973..23bf14d 100644
--- a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
+++ b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
@@ -17,9 +17,9 @@
package org.apache.ignite.thread;
+import java.lang.Thread.UncaughtExceptionHandler;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.atomic.AtomicInteger;
-
import org.apache.ignite.internal.managers.communication.GridIoPolicy;
import org.apache.ignite.internal.util.typedef.internal.S;
import org.jetbrains.annotations.NotNull;
@@ -41,6 +41,9 @@ public class IgniteThreadFactory implements ThreadFactory {
/** */
private final byte plc;
+ /** Exception handler. */
+ private final UncaughtExceptionHandler eHnd;
+
/**
* Constructs new thread factory for given grid. All threads will belong
* to the same default thread group.
@@ -49,7 +52,19 @@ public class IgniteThreadFactory implements ThreadFactory {
* @param threadName Thread name.
*/
public IgniteThreadFactory(String igniteInstanceName, String threadName) {
- this(igniteInstanceName, threadName, GridIoPolicy.UNDEFINED);
+ this(igniteInstanceName, threadName, null);
+ }
+
+ /**
+ * Constructs new thread factory for given grid. All threads will belong
+ * to the same default thread group.
+ *
+ * @param igniteInstanceName Ignite instance name.
+ * @param threadName Thread name.
+ * @param eHnd Uncaught exception handler.
+ */
+ public IgniteThreadFactory(String igniteInstanceName, String threadName, UncaughtExceptionHandler eHnd) {
+ this(igniteInstanceName, threadName, GridIoPolicy.UNDEFINED, eHnd);
}
/**
@@ -59,16 +74,23 @@ public class IgniteThreadFactory implements ThreadFactory {
* @param igniteInstanceName Ignite instance name.
* @param threadName Thread name.
* @param plc {@link GridIoPolicy} for thread pool.
+ * @param eHnd Uncaught exception handler.
*/
- public IgniteThreadFactory(String igniteInstanceName, String threadName, byte plc) {
+ public IgniteThreadFactory(String igniteInstanceName, String threadName, byte plc, UncaughtExceptionHandler eHnd) {
this.igniteInstanceName = igniteInstanceName;
this.threadName = threadName;
this.plc = plc;
+ this.eHnd = eHnd;
}
/** {@inheritDoc} */
@Override public Thread newThread(@NotNull Runnable r) {
- return new IgniteThread(igniteInstanceName, threadName, r, idxGen.incrementAndGet(), -1, plc);
+ Thread thread = new IgniteThread(igniteInstanceName, threadName, r, idxGen.incrementAndGet(), -1, plc);
+
+ if (eHnd != null)
+ thread.setUncaughtExceptionHandler(eHnd);
+
+ return thread;
}
/** {@inheritDoc} */
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
index 83c64c3..fed77ad 100644
--- a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
+++ b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
@@ -17,6 +17,7 @@
package org.apache.ignite.thread;
+import java.lang.Thread.UncaughtExceptionHandler;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadFactory;
@@ -53,7 +54,8 @@ public class IgniteThreadPoolExecutor extends ThreadPoolExecutor {
maxPoolSize,
keepAliveTime,
workQ,
- GridIoPolicy.UNDEFINED);
+ GridIoPolicy.UNDEFINED,
+ null);
}
/**
@@ -68,6 +70,7 @@ public class IgniteThreadPoolExecutor extends ThreadPoolExecutor {
* @param workQ The queue to use for holding tasks before they are executed. This queue will hold only
* runnable tasks submitted by the {@link #execute(Runnable)} method.
* @param plc {@link GridIoPolicy} for thread pool.
+ * @param eHnd Uncaught exception handler for thread pool.
*/
public IgniteThreadPoolExecutor(
String threadNamePrefix,
@@ -76,14 +79,15 @@ public class IgniteThreadPoolExecutor extends ThreadPoolExecutor {
int maxPoolSize,
long keepAliveTime,
BlockingQueue<Runnable> workQ,
- byte plc) {
+ byte plc,
+ UncaughtExceptionHandler eHnd) {
super(
corePoolSize,
maxPoolSize,
keepAliveTime,
TimeUnit.MILLISECONDS,
workQ,
- new IgniteThreadFactory(igniteInstanceName, threadNamePrefix, plc)
+ new IgniteThreadFactory(igniteInstanceName, threadNamePrefix, plc, eHnd)
);
}
@@ -114,4 +118,4 @@ public class IgniteThreadPoolExecutor extends ThreadPoolExecutor {
new AbortPolicy()
);
}
-}
\ No newline at end of file
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/main/java/org/apache/ignite/thread/OomExceptionHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/thread/OomExceptionHandler.java b/modules/core/src/main/java/org/apache/ignite/thread/OomExceptionHandler.java
new file mode 100644
index 0000000..3a62ad8
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/thread/OomExceptionHandler.java
@@ -0,0 +1,44 @@
+/*
+ * 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.thread;
+
+import org.apache.ignite.failure.FailureContext;
+import org.apache.ignite.failure.FailureType;
+import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.util.typedef.X;
+
+/**
+ * OOM exception handler for system threads.
+ */
+public class OomExceptionHandler implements Thread.UncaughtExceptionHandler {
+ /** Context. */
+ private final GridKernalContext ctx;
+
+ /**
+ * @param ctx Context.
+ */
+ public OomExceptionHandler(GridKernalContext ctx) {
+ this.ctx = ctx;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void uncaughtException(Thread t, Throwable e) {
+ if (X.hasCause(e, OutOfMemoryError.class))
+ ctx.failure().process(new FailureContext(FailureType.CRITICAL_ERROR, e));
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/test/java/org/apache/ignite/failure/OomFailureHandlerTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/failure/OomFailureHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/failure/OomFailureHandlerTest.java
new file mode 100644
index 0000000..2af94b8
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/failure/OomFailureHandlerTest.java
@@ -0,0 +1,255 @@
+/*
+ * 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.failure;
+
+import javax.cache.processor.EntryProcessor;
+import javax.cache.processor.EntryProcessorException;
+import javax.cache.processor.MutableEntry;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.events.Event;
+import org.apache.ignite.events.EventType;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.IgniteInterruptedCheckedException;
+import org.apache.ignite.internal.util.lang.GridAbsPredicate;
+import org.apache.ignite.lang.IgniteCallable;
+import org.apache.ignite.lang.IgniteFuture;
+import org.apache.ignite.lang.IgnitePredicate;
+import org.apache.ignite.services.Service;
+import org.apache.ignite.services.ServiceContext;
+import org.apache.ignite.testframework.GridTestUtils;
+
+/**
+ * Out of memory error failure handler test.
+ */
+public class OomFailureHandlerTest extends AbstractFailureHandlerTest {
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+ IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+ cfg.setCacheConfiguration(new CacheConfiguration()
+ .setName(DEFAULT_CACHE_NAME)
+ .setCacheMode(CacheMode.PARTITIONED)
+ .setBackups(0)
+ );
+
+ return cfg;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ super.afterTest();
+
+ stopAllGrids();
+ }
+
+ /**
+ * Test OOME in IgniteCompute.
+ */
+ public void testComputeOomError() throws Exception {
+ IgniteEx ignite0 = startGrid(0);
+ IgniteEx ignite1 = startGrid(1);
+
+ try {
+ IgniteFuture<Boolean> res = ignite0.compute(ignite0.cluster().forNodeId(ignite1.cluster().localNode().id()))
+ .callAsync(new IgniteCallable<Boolean>() {
+ @Override public Boolean call() throws Exception {
+ throw new OutOfMemoryError();
+ }
+ });
+
+ res.get();
+ }
+ catch (Throwable ignore) {
+ // Expected.
+ }
+
+ assertFailureState(ignite0, ignite1);
+ }
+
+ /**
+ * Test OOME in EntryProcessor.
+ */
+ public void testEntryProcessorOomError() throws Exception {
+ IgniteEx ignite0 = startGrid(0);
+ IgniteEx ignite1 = startGrid(1);
+
+ IgniteCache<Integer, Integer> cache0 = ignite0.getOrCreateCache(DEFAULT_CACHE_NAME);
+ IgniteCache<Integer, Integer> cache1 = ignite1.getOrCreateCache(DEFAULT_CACHE_NAME);
+
+ awaitPartitionMapExchange();
+
+ Integer key = primaryKey(cache1);
+
+ cache1.put(key, key);
+
+ try {
+ IgniteFuture fut = cache0.invokeAsync(key, new EntryProcessor<Integer, Integer, Object>() {
+ @Override public Object process(MutableEntry<Integer, Integer> entry,
+ Object... arguments) throws EntryProcessorException {
+ throw new OutOfMemoryError();
+ }
+ });
+
+ fut.get();
+ }
+ catch (Throwable ignore) {
+ // Expected.
+ }
+
+ assertFailureState(ignite0, ignite1);
+ }
+
+ /**
+ * Test OOME in service method invocation.
+ */
+ public void testServiceInvokeOomError() throws Exception {
+ IgniteEx ignite0 = startGrid(0);
+ IgniteEx ignite1 = startGrid(1);
+
+ IgniteCache<Integer, Integer> cache1 = ignite1.getOrCreateCache(DEFAULT_CACHE_NAME);
+
+ awaitPartitionMapExchange();
+
+ Integer key = primaryKey(cache1);
+
+ ignite0.services().deployKeyAffinitySingleton("fail-invoke-service", new FailServiceImpl(false),
+ DEFAULT_CACHE_NAME, key);
+
+ FailService svc = ignite0.services().serviceProxy("fail-invoke-service", FailService.class, false);
+
+ try {
+ svc.fail();
+ }
+ catch (Throwable ignore) {
+ // Expected.
+ }
+
+ assertFailureState(ignite0, ignite1);
+ }
+
+ /**
+ * Test OOME in service execute.
+ */
+ public void testServiceExecuteOomError() throws Exception {
+ IgniteEx ignite0 = startGrid(0);
+ IgniteEx ignite1 = startGrid(1);
+
+ IgniteCache<Integer, Integer> cache1 = ignite1.getOrCreateCache(DEFAULT_CACHE_NAME);
+
+ awaitPartitionMapExchange();
+
+ Integer key = primaryKey(cache1);
+
+ ignite0.services().deployKeyAffinitySingleton("fail-execute-service", new FailServiceImpl(true),
+ DEFAULT_CACHE_NAME, key);
+
+ assertFailureState(ignite0, ignite1);
+ }
+
+ /**
+ * Test OOME in event listener.
+ */
+ public void testEventListenerOomError() throws Exception {
+ IgniteEx ignite0 = startGrid(0);
+ IgniteEx ignite1 = startGrid(1);
+
+ IgniteCache<Integer, Integer> cache0 = ignite0.getOrCreateCache(DEFAULT_CACHE_NAME);
+ IgniteCache<Integer, Integer> cache1 = ignite1.getOrCreateCache(DEFAULT_CACHE_NAME);
+
+ awaitPartitionMapExchange();
+
+ ignite1.events().localListen(new IgnitePredicate<Event>() {
+ @Override public boolean apply(Event evt) {
+ throw new OutOfMemoryError();
+ }
+ }, EventType.EVT_CACHE_OBJECT_PUT);
+
+ Integer key = primaryKey(cache1);
+
+ try {
+ cache0.put(key, key);
+ }
+ catch (Throwable ignore) {
+ // Expected.
+ }
+
+ assertFailureState(ignite0, ignite1);
+ }
+
+ /**
+ * @param igniteWork Working ignite instance.
+ * @param igniteFail Failed ignite instance.
+ */
+ private static void assertFailureState(Ignite igniteWork, Ignite igniteFail) throws IgniteInterruptedCheckedException {
+ assertTrue(GridTestUtils.waitForCondition(new GridAbsPredicate() {
+ @Override public boolean apply() {
+ return dummyFailureHandler(igniteFail).failure();
+ }
+ }, 5000L));
+
+ assertFalse(dummyFailureHandler(igniteWork).failure());
+ }
+
+ /**
+ *
+ */
+ private interface FailService extends Service {
+ /**
+ * Fail.
+ */
+ void fail();
+ }
+
+ /**
+ *
+ */
+ private static class FailServiceImpl implements FailService {
+ /** Fail on execute. */
+ private final boolean failOnExec;
+
+ /**
+ * @param failOnExec Fail on execute.
+ */
+ private FailServiceImpl(boolean failOnExec) {
+ this.failOnExec = failOnExec;
+ }
+
+ /** {@inheritDoc} */
+ @Override public void fail() {
+ throw new OutOfMemoryError();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void cancel(ServiceContext ctx) {
+ }
+
+ /** {@inheritDoc} */
+ @Override public void init(ServiceContext ctx) throws Exception {
+ }
+
+ /** {@inheritDoc} */
+ @Override public void execute(ServiceContext ctx) throws Exception {
+ if (failOnExec)
+ throw new OutOfMemoryError();
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/ignite/blob/d1be9b85/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
index c4b7d92..c388f1d 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
@@ -22,6 +22,7 @@ import junit.framework.TestSuite;
import org.apache.ignite.GridSuppressedExceptionSelfTest;
import org.apache.ignite.failure.FailureHandlerTriggeredTest;
import org.apache.ignite.failure.IoomFailureHandlerTest;
+import org.apache.ignite.failure.OomFailureHandlerTest;
import org.apache.ignite.failure.StopNodeFailureHandlerTest;
import org.apache.ignite.failure.StopNodeOrHaltFailureHandlerTest;
import org.apache.ignite.internal.ClassSetTest;
@@ -199,6 +200,7 @@ public class IgniteBasicTestSuite extends TestSuite {
suite.addTestSuite(StopNodeFailureHandlerTest.class);
suite.addTestSuite(StopNodeOrHaltFailureHandlerTest.class);
suite.addTestSuite(IoomFailureHandlerTest.class);
+ suite.addTestSuite(OomFailureHandlerTest.class);
return suite;
}
[7/9] ignite git commit: IGNITE-6679 Clean up some deprecated cache
metrics
Posted by ak...@apache.org.
IGNITE-6679 Clean up some deprecated cache metrics
Signed-off-by: Anton Vinogradov <av...@apache.org>
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/32fc6c3c
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/32fc6c3c
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/32fc6c3c
Branch: refs/heads/ignite-8201
Commit: 32fc6c3c1b013c8477acb9cf51d8326a13307c64
Parents: 14402e4
Author: NSAmelchev <ns...@gmail.com>
Authored: Wed Apr 11 16:59:59 2018 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Wed Apr 11 16:59:59 2018 +0300
----------------------------------------------------------------------
.../src/main/java/org/apache/ignite/cache/CacheMetrics.java | 7 +++++++
1 file changed, 7 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/32fc6c3c/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 0b1cb87..c466bee 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
@@ -262,6 +262,7 @@ public interface CacheMetrics {
*
* @return Current size of evict queue.
*/
+ @Deprecated
public int getDhtEvictQueueCurrentSize();
/**
@@ -283,6 +284,7 @@ public interface CacheMetrics {
*
* @return Committed transaction queue size.
*/
+ @Deprecated
public int getTxCommitQueueSize();
/**
@@ -290,6 +292,7 @@ public interface CacheMetrics {
*
* @return Prepared transaction queue size.
*/
+ @Deprecated
public int getTxPrepareQueueSize();
/**
@@ -297,6 +300,7 @@ public interface CacheMetrics {
*
* @return Start version counts map size.
*/
+ @Deprecated
public int getTxStartVersionCountsSize();
/**
@@ -332,6 +336,7 @@ public interface CacheMetrics {
*
* @return Committed DHT transaction queue size.
*/
+ @Deprecated
public int getTxDhtCommitQueueSize();
/**
@@ -339,6 +344,7 @@ public interface CacheMetrics {
*
* @return Prepared DHT transaction queue size.
*/
+ @Deprecated
public int getTxDhtPrepareQueueSize();
/**
@@ -346,6 +352,7 @@ public interface CacheMetrics {
*
* @return DHT start version counts map size.
*/
+ @Deprecated
public int getTxDhtStartVersionCountsSize();
/**