You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by dg...@apache.org on 2019/06/19 08:49:07 UTC
[ignite] branch master updated: IGNITE-11934 Bugs & tests fixes -
Fixes #6619
This is an automated email from the ASF dual-hosted git repository.
dgovorukhin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new 48a38de IGNITE-11934 Bugs & tests fixes - Fixes #6619
48a38de is described below
commit 48a38dedb8b21ae34611a1a1f38474f305ba8a1e
Author: Dmitriy Govorukhin <dm...@gmail.com>
AuthorDate: Wed Jun 19 11:48:23 2019 +0300
IGNITE-11934 Bugs & tests fixes - Fixes #6619
Co-authored-by: Vladislav Pyatkov <vl...@gmail.com>
Co-authored-by: Ivan Bessonov <be...@gmail.com>
Co-authored-by: Anton Kalashnikov <ka...@yandex.ru>
Co-authored-by: Dmitriy Govorukhin <dm...@gmail.com>
Co-authored-by: Igor Seliverstov <gv...@gmail.com>
---
modules/compress/pom.xml | 7 +
modules/core/pom.xml | 2 +-
.../apache/ignite/internal/IgniteVersionUtils.java | 15 +-
.../commandline/diagnostic/DiagnosticCommand.java | 19 +-
.../commandline/diagnostic/PageLocksCommand.java | 219 ++++++++++++---------
.../atomic/GridNearAtomicAbstractUpdateFuture.java | 6 +
.../pagelocktracker/PageLockTrackerManager.java | 11 +-
.../wal/filehandle/FileHandleManagerImpl.java | 4 +
.../processors/diagnostic/DiagnosticProcessor.java | 2 +-
.../internal/visor/diagnostic/Operation.java | 28 +++
.../visor/diagnostic/VisorPageLocksResult.java | 22 +--
.../visor/diagnostic/VisorPageLocksTask.java | 33 ++--
.../diagnostic/VisorPageLocksTrackerArgs.java | 93 ++-------
.../apache/ignite/lang/IgniteProductVersion.java | 2 +-
.../ignite/spi/discovery/tcp/ServerImpl.java | 83 +++++---
.../messages/TcpDiscoveryAuthFailedMessage.java | 14 +-
...ClientConnectAfterCommunicationFailureTest.java | 41 +---
.../FailBackupOnAtomicOperationTest.java | 165 ++++++++++++++++
.../db/checkpoint/CheckpointFreeListTest.java | 12 +-
.../pagelocktracker/AbstractPageLockTest.java | 2 +
.../pagelocktracker/SharedPageLockTrackerTest.java | 46 +++--
.../pagelocktracker/log/PageLockLogTest.java | 84 +-------
.../pagelocktracker/stack/PageLockStackTest.java | 3 +-
.../wal/reader/FilteredWalIteratorTest.java | 3 +-
.../persistence/wal/scanner/WalScannerTest.java | 54 +++--
.../tcp/TcpCommunicationSpiFreezingClientTest.java | 4 +
.../ignite/testsuites/IgniteCacheTestSuite9.java | 3 +
.../ignite/testsuites/IgnitePdsMvccTestSuite4.java | 16 ++
.../apache/ignite/util/GridCommandHandlerTest.java | 149 ++++++++++++--
29 files changed, 727 insertions(+), 415 deletions(-)
diff --git a/modules/compress/pom.xml b/modules/compress/pom.xml
index a87269f..efcf18f 100644
--- a/modules/compress/pom.xml
+++ b/modules/compress/pom.xml
@@ -108,6 +108,13 @@
<version>1.4.8</version>
<scope>test</scope>
</dependency>
+
+ <dependency>
+ <groupId>org.mockito</groupId>
+ <artifactId>mockito-all</artifactId>
+ <version>${mockito.version}</version>
+ <scope>test</scope>
+ </dependency>
</dependencies>
<build>
diff --git a/modules/core/pom.xml b/modules/core/pom.xml
index 3642eb4..ca0d4b5 100644
--- a/modules/core/pom.xml
+++ b/modules/core/pom.xml
@@ -126,7 +126,7 @@
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-all</artifactId>
- <version>1.9.5</version>
+ <version>${mockito.version}</version>
<scope>test</scope>
</dependency>
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
index 9fe0043..cd17078 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteVersionUtils.java
@@ -33,7 +33,7 @@ public class IgniteVersionUtils {
public static final IgniteProductVersion VER;
/** UTC build date formatter. */
- public static final SimpleDateFormat BUILD_TSTAMP_DATE_FORMATTER;
+ private static final SimpleDateFormat BUILD_TSTAMP_DATE_FORMATTER;
/** Formatted build date. */
public static final String BUILD_TSTAMP_STR;
@@ -75,7 +75,7 @@ public class IgniteVersionUtils {
BUILD_TSTAMP_DATE_FORMATTER.setTimeZone(TimeZone.getTimeZone("UTC"));
- BUILD_TSTAMP_STR = BUILD_TSTAMP_DATE_FORMATTER.format(new Date(BUILD_TSTAMP * 1000));
+ BUILD_TSTAMP_STR = formatBuildTimeStamp(BUILD_TSTAMP * 1000);
COPYRIGHT = BUILD_TSTAMP_STR.substring(0, 4) + " Copyright(C) Apache Software Foundation";
@@ -91,6 +91,17 @@ public class IgniteVersionUtils {
}
/**
+ * Builds string date representation in "yyyyMMdd" format.
+ * "synchronized" because it uses {@link SimpleDateFormat} which is not threadsafe.
+ *
+ * @param ts Timestamp.
+ * @return Timestamp date in UTC timezone.
+ */
+ public static synchronized String formatBuildTimeStamp(long ts) {
+ return BUILD_TSTAMP_DATE_FORMATTER.format(new Date(ts));
+ }
+
+ /**
* Private constructor.
*/
private IgniteVersionUtils() {
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java
index c985c20..4d4ba89 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/DiagnosticCommand.java
@@ -17,6 +17,7 @@
package org.apache.ignite.internal.commandline.diagnostic;
+import java.util.Arrays;
import org.apache.ignite.internal.client.GridClientConfiguration;
import org.apache.ignite.internal.commandline.Command;
import org.apache.ignite.internal.commandline.CommandArgIterator;
@@ -32,9 +33,7 @@ import static org.apache.ignite.internal.commandline.diagnostic.DiagnosticSubCom
*
*/
public class DiagnosticCommand implements Command<DiagnosticSubCommand> {
- /**
- *
- */
+ /** */
private DiagnosticSubCommand subcommand;
/**
@@ -107,9 +106,19 @@ public class DiagnosticCommand implements Command<DiagnosticSubCommand> {
}
/**
- *
+ * Print diagnostic command help.
*/
private void printDiagnosticHelp() {
- logger.log(join(" ", UTILITY_NAME, DIAGNOSTIC, PAGE_LOCKS + " - dump page locks info."));
+ logger.logWithIndent(join(" ", UTILITY_NAME, DIAGNOSTIC, PAGE_LOCKS + " - dump page locks info."));
+
+ logger.nl();
+
+ logger.logWithIndent("Subcommands:");
+
+ Arrays.stream(DiagnosticSubCommand.values()).forEach(c -> {
+ if (c.subcommand() != null) c.subcommand().printUsage(logger);
+ });
+
+ logger.nl();
}
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java
index c89c8c2..5c32d76 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/commandline/diagnostic/PageLocksCommand.java
@@ -18,9 +18,10 @@
package org.apache.ignite.internal.commandline.diagnostic;
import java.io.File;
+import java.util.Arrays;
+import java.util.HashSet;
import java.util.Map;
import java.util.Set;
-import java.util.TreeSet;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.client.GridClient;
import org.apache.ignite.internal.client.GridClientConfiguration;
@@ -28,71 +29,56 @@ import org.apache.ignite.internal.commandline.Command;
import org.apache.ignite.internal.commandline.CommandArgIterator;
import org.apache.ignite.internal.commandline.CommandLogger;
import org.apache.ignite.internal.commandline.TaskExecutor;
+import org.apache.ignite.internal.commandline.argument.CommandArg;
+import org.apache.ignite.internal.commandline.argument.CommandArgUtils;
+import org.apache.ignite.internal.visor.diagnostic.Operation;
import org.apache.ignite.internal.visor.diagnostic.VisorPageLocksResult;
import org.apache.ignite.internal.visor.diagnostic.VisorPageLocksTask;
import org.apache.ignite.internal.visor.diagnostic.VisorPageLocksTrackerArgs;
import static org.apache.ignite.internal.commandline.CommandHandler.UTILITY_NAME;
import static org.apache.ignite.internal.commandline.CommandList.DIAGNOSTIC;
+import static org.apache.ignite.internal.commandline.CommandLogger.join;
+import static org.apache.ignite.internal.commandline.CommandLogger.optional;
import static org.apache.ignite.internal.commandline.diagnostic.DiagnosticSubCommand.PAGE_LOCKS;
+import static org.apache.ignite.internal.commandline.diagnostic.PageLocksCommand.PageLocksCommandArg.ALL;
+import static org.apache.ignite.internal.commandline.diagnostic.PageLocksCommand.PageLocksCommandArg.DUMP;
+import static org.apache.ignite.internal.commandline.diagnostic.PageLocksCommand.PageLocksCommandArg.DUMP_LOG;
+import static org.apache.ignite.internal.commandline.diagnostic.PageLocksCommand.PageLocksCommandArg.NODES;
+import static org.apache.ignite.internal.commandline.diagnostic.PageLocksCommand.PageLocksCommandArg.PATH;
+import static org.apache.ignite.internal.processors.diagnostic.DiagnosticProcessor.DEFAULT_TARGET_FOLDER;
/**
*
*/
-public class PageLocksCommand implements Command<PageLocksCommand.Args> {
- /**
- *
- */
- public static final String DUMP = "dump";
-
- /**
- *
- */
- public static final String DUMP_LOG = "dump_log";
-
- /**
- *
- */
- private Args args;
+public class PageLocksCommand implements Command<PageLocksCommand.Arguments> {
+ /** */
+ private Arguments arguments;
/**
*
*/
private CommandLogger logger;
- /**
- *
- */
- private boolean help;
/** {@inheritDoc} */
@Override public Object execute(GridClientConfiguration clientCfg, CommandLogger logger) throws Exception {
this.logger = logger;
- if (help) {
- help = false;
-
- printUsage(logger);
+ Set<String> nodeIds = arguments.nodeIds;
- return null;
- }
-
- Set<String> nodeIds = args.nodeIds;
+ Map<ClusterNode, VisorPageLocksResult> res;
try (GridClient client = Command.startClient(clientCfg)) {
- if (args.allNodes) {
+ if (arguments.allNodes) {
client.compute().nodes().forEach(n -> {
nodeIds.add(String.valueOf(n.consistentId()));
nodeIds.add(n.nodeId().toString());
});
}
- }
- VisorPageLocksTrackerArgs taskArg = new VisorPageLocksTrackerArgs(args.op, args.type, args.filePath, nodeIds);
+ VisorPageLocksTrackerArgs taskArg = new VisorPageLocksTrackerArgs(arguments.op, arguments.filePath, nodeIds);
- Map<ClusterNode, VisorPageLocksResult> res;
-
- try (GridClient client = Command.startClient(clientCfg)) {
res = TaskExecutor.executeTask(
client,
VisorPageLocksTask.class,
@@ -107,56 +93,73 @@ public class PageLocksCommand implements Command<PageLocksCommand.Args> {
}
/** {@inheritDoc} */
- @Override public Args arg() {
- return args;
+ @Override public Arguments arg() {
+ return arguments;
}
/** {@inheritDoc} */
@Override public void parseArguments(CommandArgIterator argIter) {
- if (argIter.hasNextSubArg()) {
- String cmd = argIter.nextArg("").toLowerCase();
-
- if (DUMP.equals(cmd) || DUMP_LOG.equals(cmd)) {
- boolean allNodes = false;
- String filePath = null;
-
- Set<String> nodeIds = new TreeSet<>();
-
- while (argIter.hasNextArg()){
- String nextArg = argIter.nextArg("").toLowerCase();
-
- if ("--all".equals(nextArg))
- allNodes = true;
- else if ("--nodes".equals(nextArg)) {
- while (argIter.hasNextArg()){
- nextArg = argIter.nextArg("").toLowerCase();
-
- nodeIds.add(nextArg);
- }
- }
- else {
- if (new File(nextArg).isDirectory())
- filePath = nextArg;
- }
- }
-
- args = new Args(DUMP, cmd, filePath, allNodes, nodeIds);
+ Operation op = Operation.DUMP_LOG;
+
+ String path = null;
+ boolean allNodes = false;
+ Set<String> nodeIds = new HashSet<>();
+
+ while (argIter.hasNextArg()) {
+ String nextArg = argIter.nextArg("");
+
+ PageLocksCommandArg arg = CommandArgUtils.of(nextArg, PageLocksCommandArg.class);
+
+ if (arg == null)
+ break;
+
+ switch (arg) {
+ case DUMP:
+ op = Operation.DUMP_FILE;
+
+ break;
+ case DUMP_LOG:
+ op = Operation.DUMP_LOG;
+
+ break;
+ case ALL:
+ allNodes = true;
+
+ break;
+ case NODES:
+ nodeIds.addAll(argIter.nextStringSet(""));
+
+ break;
+ case PATH:
+ path = argIter.nextArg("");
+
+ break;
+ default:
+ throw new IllegalArgumentException(
+ "Unexpected argumetn:" + arg + ", supported:" + Arrays.toString(PageLocksCommandArg.values())
+ );
}
- else
- help = true;
}
+
+ arguments = new Arguments(op, path, allNodes, nodeIds);
}
/** {@inheritDoc} */
@Override public void printUsage(CommandLogger logger) {
logger.log("View pages locks state information on the node or nodes.");
- logger.log(CommandLogger.join(" ",
+ logger.log(join(" ",
UTILITY_NAME, DIAGNOSTIC, PAGE_LOCKS, DUMP,
- "[--path path_to_directory] [--all|--nodes nodeId1,nodeId2,..|--nodes consistentId1,consistentId2,..]",
- "// Save page locks dump to file generated in IGNITE_HOME/work directory."));
- logger.log(CommandLogger.join(" ",
+ optional(PATH, "path_to_directory"),
+ optional(ALL),
+ optional(CommandLogger.or(NODES, "nodeId1,nodeId2,..")),
+ optional(CommandLogger.or(NODES, "consistentId1,consistentId2,..")),
+ "// Save page locks dump to file generated in IGNITE_HOME" +
+ File.separatorChar + "work" + File.separatorChar + DEFAULT_TARGET_FOLDER + " directory."));
+ logger.log(join(" ",
UTILITY_NAME, DIAGNOSTIC, PAGE_LOCKS, DUMP_LOG,
- "[--all|--nodes nodeId1,nodeId2,..|--nodes consistentId1,consistentId2,..]",
+ optional(ALL),
+ optional(CommandLogger.or(NODES, "nodeId1,nodeId2,..")),
+ optional(CommandLogger.or(NODES, "consistentId1,consistentId2,..")),
"// Pring page locks dump to console on the node or nodes."));
logger.nl();
}
@@ -170,47 +173,71 @@ public class PageLocksCommand implements Command<PageLocksCommand.Args> {
});
}
- /**
- *
- */
- public static class Args {
- /**
- *
- */
- private final String op;
+ /** */
+ public static class Arguments {
+ /** */
+ private final Operation op;
- /**
- *
- */
- private final String type;
-
- /**
- *
- */
+ /** */
private final String filePath;
- /**
- *
- */
+ /** */
private final boolean allNodes;
- /**
- *
- */
+ /** */
private final Set<String> nodeIds;
/**
* @param op Operation.
- * @param type Type.
* @param filePath File path.
+ * @param allNodes If {@code True} include all available nodes for command. If {@code False} include only subset.
* @param nodeIds Node ids.
*/
- public Args(String op, String type, String filePath, boolean allNodes, Set<String> nodeIds) {
+ public Arguments(
+ Operation op,
+ String filePath,
+ boolean allNodes,
+ Set<String> nodeIds
+ ) {
this.op = op;
- this.type = type;
this.filePath = filePath;
this.allNodes = allNodes;
this.nodeIds = nodeIds;
}
}
+
+ enum PageLocksCommandArg implements CommandArg {
+ /** */
+ DUMP("dump"),
+
+ /** */
+ DUMP_LOG("dump_log"),
+
+ /** */
+ PATH("--path"),
+
+ /** */
+ NODES("--nodes"),
+
+ /** */
+ ALL("--all");
+
+ /** Option name. */
+ private final String name;
+
+ /** */
+ PageLocksCommandArg(String name) {
+ this.name = name;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String argName() {
+ return name;
+ }
+
+ /** {@inheritDoc} */
+ @Override public String toString() {
+ return name;
+ }
+ }
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
index 983b094..e388ba2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
@@ -809,6 +809,12 @@ public abstract class GridNearAtomicAbstractUpdateFuture extends GridCacheFuture
* @param cctx Context.
*/
private void initMapping(List<UUID> nodeIds, GridCacheContext cctx) {
+ if (nodeIds.isEmpty() && req.initMappingLocally()) {
+ mappedNodes = U.newHashMap(nodeIds.size());
+
+ rcvdCnt = 0;
+ }
+
assert rcvdCnt <= nodeIds.size();
expCnt = nodeIds.size();
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/PageLockTrackerManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/PageLockTrackerManager.java
index ff2faa5..09f49b1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/PageLockTrackerManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/PageLockTrackerManager.java
@@ -33,9 +33,11 @@ import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lifecycle.LifecycleAware;
import org.jetbrains.annotations.NotNull;
+import static java.io.File.separatorChar;
import static org.apache.ignite.IgniteSystemProperties.IGNITE_PAGE_LOCK_TRACKER_TYPE;
import static org.apache.ignite.IgniteSystemProperties.getInteger;
import static org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.LockTrackerFactory.HEAP_LOG;
+import static org.apache.ignite.internal.processors.diagnostic.DiagnosticProcessor.DEFAULT_TARGET_FOLDER;
/**
* Page lock manager.
@@ -121,10 +123,11 @@ public class PageLockTrackerManager implements LifecycleAware {
try {
// Write dump to file.
- ToFileDumpProcessor.toFileDump(dump, new File(U.defaultWorkDirectory()), managerNameId);
+ ToFileDumpProcessor.toFileDump(dump, new File(U.defaultWorkDirectory() +
+ separatorChar + DEFAULT_TARGET_FOLDER + separatorChar), managerNameId);
}
catch (IgniteCheckedException e) {
- log.warning("Faile to save locks dump file.", e);
+ log.warning("Failed to save locks dump file.", e);
}
}
}
@@ -167,7 +170,9 @@ public class PageLockTrackerManager implements LifecycleAware {
ThreadPageLocksDumpLock dump = sharedPageLockTracker.dump();
try {
- return ToFileDumpProcessor.toFileDump(dump, new File(U.defaultWorkDirectory()), managerNameId);
+ return ToFileDumpProcessor.toFileDump(dump,
+ new File(U.defaultWorkDirectory() +
+ File.separatorChar + DEFAULT_TARGET_FOLDER + File.separatorChar), managerNameId);
}
catch (IgniteCheckedException e) {
throw U.convertException(e);
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FileHandleManagerImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FileHandleManagerImpl.java
index 657eee6..b02d5f4 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FileHandleManagerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/filehandle/FileHandleManagerImpl.java
@@ -398,6 +398,8 @@ public class FileHandleManagerImpl implements FileHandleManager {
err = t;
}
finally {
+ this.err = err;
+
unparkWaiters(Long.MAX_VALUE);
if (err == null && !isCancelled)
@@ -564,6 +566,8 @@ public class FileHandleManagerImpl implements FileHandleManager {
assert hdl.written == hdl.fileIO.position();
}
catch (IOException e) {
+ err = e;
+
StorageException se = new StorageException("Failed to write buffer.", e);
cctx.kernalContext().failure().process(new FailureContext(CRITICAL_ERROR, se));
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/diagnostic/DiagnosticProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/diagnostic/DiagnosticProcessor.java
index c8d143b..cfc75ed 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/diagnostic/DiagnosticProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/diagnostic/DiagnosticProcessor.java
@@ -51,7 +51,7 @@ public class DiagnosticProcessor extends GridProcessorAdapter {
private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH-mm-ss_SSS");
/** Folder name for store diagnostic info. **/
- static final String DEFAULT_TARGET_FOLDER = "diagnostic";
+ public static final String DEFAULT_TARGET_FOLDER = "diagnostic";
/** File format. */
static final String FILE_FORMAT = ".txt";
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/Operation.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/Operation.java
new file mode 100644
index 0000000..1738913
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/Operation.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.visor.diagnostic;
+
+/**
+ * Operation type for {@link VisorPageLocksTask}
+ */
+public enum Operation {
+ /** Dump page locks to file operation. */
+ DUMP_FILE,
+ /** Dump page locks to log. */
+ DUMP_LOG
+}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksResult.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksResult.java
index 26dc754..8a6253c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksResult.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksResult.java
@@ -21,6 +21,7 @@ import java.io.IOException;
import java.io.ObjectInput;
import java.io.ObjectOutput;
import org.apache.ignite.internal.dto.IgniteDataTransferObject;
+import org.apache.ignite.internal.util.typedef.internal.U;
/**
*
@@ -48,30 +49,13 @@ public class VisorPageLocksResult extends IgniteDataTransferObject {
/** {@inheritDoc} */
@Override protected void writeExternalData(ObjectOutput out) throws IOException {
- if (payload == null) {
- out.writeInt(0);
- }
- else {
- byte[] bytes = payload.getBytes();
- int length = bytes.length;
-
- out.writeInt(length);
- out.write(bytes);
- }
+ U.writeString(out, payload);
}
/** {@inheritDoc} */
@Override protected void readExternalData(byte protoVer, ObjectInput in)
throws IOException, ClassNotFoundException {
- int length = in.readInt();
-
- if (length != 0) {
- byte[] bytes = new byte[length];
-
- in.read(bytes);
-
- payload = new String(bytes);
- }
+ payload = U.readString(in);
}
/**
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTask.java
index a155eef..59f3a83 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTask.java
@@ -30,6 +30,7 @@ import java.util.UUID;
import org.apache.ignite.IgniteException;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.compute.ComputeJobResult;
+import org.apache.ignite.internal.cluster.NodeOrderComparator;
import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.PageLockTrackerManager;
import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.dumpprocessors.ToStringDumpProcessor;
import org.apache.ignite.internal.processors.task.GridInternal;
@@ -74,7 +75,7 @@ public class VisorPageLocksTask
@Nullable @Override protected Map<ClusterNode, VisorPageLocksResult> reduce0(
List<ComputeJobResult> results
) throws IgniteException {
- Map<ClusterNode, VisorPageLocksResult> mapRes = new TreeMap<>();
+ Map<ClusterNode, VisorPageLocksResult> mapRes = new TreeMap<>(NodeOrderComparator.getInstance());
results.forEach(j -> {
if (j.getException() == null)
@@ -111,25 +112,27 @@ public class VisorPageLocksTask
@Override protected VisorPageLocksResult run(VisorPageLocksTrackerArgs arg) {
PageLockTrackerManager lockTrackerMgr = ignite.context().cache().context().diagnostic().pageLockTracker();
- String op = arg.type();
-
String result;
- if ("dump".equals(op)) {
- String filePath = arg.filePath() != null ?
- lockTrackerMgr.dumpLocksToFile(arg.filePath()) :
- lockTrackerMgr.dumpLocksToFile();
+ switch (arg.operation()) {
+ case DUMP_LOG:
+ lockTrackerMgr.dumpLocksToLog();
- result = "Page locks dump was writtern to file " + filePath;
- }
- else if ("dump_log".equals(op)) {
- lockTrackerMgr.dumpLocksToLog();
+ result = "Page locks dump was printed to console " +
+ ToStringDumpProcessor.DATE_FMT.format(new Date(System.currentTimeMillis()));
+
+ break;
+ case DUMP_FILE:
+ String filePath = arg.filePath() != null ?
+ lockTrackerMgr.dumpLocksToFile(arg.filePath()) :
+ lockTrackerMgr.dumpLocksToFile();
+
+ result = "Page locks dump was writtern to file " + filePath;
- result = "Page locks dump was printed to console " +
- ToStringDumpProcessor.DATE_FMT.format(new Date(System.currentTimeMillis()));
+ break;
+ default:
+ result = "Unsupported operation: " + arg.operation();
}
- else
- result = "Unsupported operation: " + op;
return new VisorPageLocksResult(result);
}
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTrackerArgs.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTrackerArgs.java
index 9478291..28f8ef0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTrackerArgs.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/diagnostic/VisorPageLocksTrackerArgs.java
@@ -34,115 +34,60 @@ public class VisorPageLocksTrackerArgs extends IgniteDataTransferObject {
private static final long serialVersionUID = 0L;
/** */
- private String op;
-
- /** */
- private String type;
+ private Operation op;
/** */
private String filePath;
/** */
- @Nullable private Set<String> consistentIds;
+ @Nullable private Set<String> nodeIds;
- /**
- * Default constructor.
- */
+ /** */
public VisorPageLocksTrackerArgs() {
}
/**
* @param op Operation.
- * @param type Type.
* @param filePath File path.
- * @param consistentIds Consistend id.
+ * @param nodeIds Set of ids.
*/
- public VisorPageLocksTrackerArgs(String op, String type, String filePath, Set<String> consistentIds) {
+ public VisorPageLocksTrackerArgs(Operation op, String filePath, Set<String> nodeIds) {
this.op = op;
- this.type = type;
this.filePath = filePath;
- this.consistentIds = consistentIds;
+ this.nodeIds = nodeIds;
}
/** {@inheritDoc} */
@Override protected void writeExternalData(ObjectOutput out) throws IOException {
- if (op == null)
- out.writeInt(0);
- else {
- byte[] bytes = op.getBytes();
- out.writeInt(bytes.length);
- out.write(bytes);
- }
-
- if (type == null)
- out.writeInt(0);
- else {
- byte[] bytes = type.getBytes();
- out.writeInt(bytes.length);
- out.write(bytes);
- }
-
- if (filePath == null)
- out.writeInt(0);
- else {
- byte[] bytes = filePath.getBytes();
- out.writeInt(bytes.length);
- out.write(bytes);
- }
-
- if (consistentIds != null)
- U.writeCollection(out, consistentIds);
+ out.writeObject(op);
+
+ U.writeString(out,filePath);
+
+ U.writeCollection(out, nodeIds);
}
/** {@inheritDoc} */
@Override protected void readExternalData(byte protoVer, ObjectInput in) throws IOException, ClassNotFoundException {
- int opLenght = in.readInt();
-
- if (opLenght != 0) {
- byte[] bytes = new byte[opLenght];
-
- in.read(bytes);
-
- op = new String(bytes);
- }
-
- int typeLenght = in.readInt();
+ op = (Operation)in.readObject();
- if (typeLenght != 0) {
- byte[] bytes = new byte[typeLenght];
+ filePath = U.readString(in);
- in.read(bytes);
-
- type = new String(bytes);
- }
-
- int filePathLenght = in.readInt();
-
- if (filePathLenght != 0) {
- byte[] bytes = new byte[filePathLenght];
-
- in.read(bytes);
-
- filePath = new String(bytes);
- }
-
- consistentIds = U.readSet(in);
+ nodeIds = U.readSet(in);
}
- public String operation() {
+ /** */
+ public Operation operation() {
return op;
}
- public String type() {
- return type;
- }
-
+ /** */
public String filePath() {
return filePath;
}
+ /** */
public Set<String> nodeIds(){
- return Collections.unmodifiableSet(consistentIds);
+ return Collections.unmodifiableSet(nodeIds);
}
}
diff --git a/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java b/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
index 4af513b..737816c 100644
--- a/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
+++ b/modules/core/src/main/java/org/apache/ignite/lang/IgniteProductVersion.java
@@ -259,7 +259,7 @@ public class IgniteProductVersion implements Comparable<IgniteProductVersion>, E
/** {@inheritDoc} */
@Override public String toString() {
- String revTsStr = IgniteVersionUtils.BUILD_TSTAMP_DATE_FORMATTER.format(new Date(revTs * 1000));
+ String revTsStr = IgniteVersionUtils.formatBuildTimeStamp(revTs * 1000);
String hash = U.byteArray2HexString(revHash).toLowerCase();
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 bb2fec0..bdd1b6d 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
@@ -2990,6 +2990,8 @@ class ServerImpl extends TcpDiscoveryImpl {
else if (msg instanceof TcpDiscoveryRingLatencyCheckMessage)
processRingLatencyCheckMessage((TcpDiscoveryRingLatencyCheckMessage)msg);
+ else if (msg instanceof TcpDiscoveryAuthFailedMessage)
+ processAuthFailedMessage((TcpDiscoveryAuthFailedMessage)msg);
else
assert false : "Unknown message type: " + msg.getClass().getSimpleName();
@@ -3013,6 +3015,23 @@ class ServerImpl extends TcpDiscoveryImpl {
spi.stats.onMessageProcessingFinished(msg);
}
+ /**
+ * Processes authentication failed message.
+ *
+ * @param authFailedMsg Authentication failed message.
+ */
+ private void processAuthFailedMessage(TcpDiscoveryAuthFailedMessage authFailedMsg) {
+ try {
+ sendDirectlyToClient(authFailedMsg.getTargetNodeId(), authFailedMsg);
+ }
+ catch (IgniteSpiException ex) {
+ log.warning(
+ "Skipping send auth failed message to client due to some trouble with connection detected: "
+ + ex.getMessage()
+ );
+ }
+ }
+
/** {@inheritDoc} */
@Override protected void noMessageLoop() {
if (locNode == null)
@@ -3935,8 +3954,10 @@ class ServerImpl extends TcpDiscoveryImpl {
U.addressesAsString(node));
try {
- trySendMessageDirectly(node, new TcpDiscoveryAuthFailedMessage(locNodeId,
- spi.locHost));
+ trySendMessageDirectly(
+ node,
+ new TcpDiscoveryAuthFailedMessage(locNodeId, spi.locHost, node.id())
+ );
}
catch (IgniteSpiException e) {
if (log.isDebugEnabled())
@@ -3971,8 +3992,10 @@ class ServerImpl extends TcpDiscoveryImpl {
", addrs=" + U.addressesAsString(node));
try {
- trySendMessageDirectly(node, new TcpDiscoveryAuthFailedMessage(locNodeId,
- spi.locHost));
+ trySendMessageDirectly(
+ node,
+ new TcpDiscoveryAuthFailedMessage(locNodeId, spi.locHost, node.id())
+ );
}
catch (IgniteSpiException e) {
if (log.isDebugEnabled())
@@ -4387,14 +4410,7 @@ class ServerImpl extends TcpDiscoveryImpl {
throw new IgniteSpiException("Router node is a client node: " + node);
if (routerNode.id().equals(getLocalNodeId())) {
- ClientMessageWorker worker = clientMsgWorkers.get(node.id());
-
- if (worker == null)
- throw new IgniteSpiException("Client node already disconnected: " + node);
-
- msg.verify(getLocalNodeId()); // Client worker require verified messages.
-
- worker.addMessage(msg);
+ sendDirectlyToClient(node.id(), msg);
return;
}
@@ -4428,6 +4444,22 @@ class ServerImpl extends TcpDiscoveryImpl {
}
/**
+ * @param clientNodeId Client node id.
+ * @param msg Message to send.
+ * @throws IgniteSpiException Last failure if all attempts failed.
+ */
+ private void sendDirectlyToClient(UUID clientNodeId, TcpDiscoveryAbstractMessage msg) {
+ ClientMessageWorker worker = clientMsgWorkers.get(clientNodeId);
+
+ if (worker == null)
+ throw new IgniteSpiException("Client node already disconnected: " + clientNodeId);
+
+ msg.verify(getLocalNodeId()); // Client worker require verified messages.
+
+ worker.addMessage(msg);
+ }
+
+ /**
* Processes node added message.
*
* For coordinator node method marks the messages as verified for rest of nodes to apply the
@@ -4579,8 +4611,10 @@ class ServerImpl extends TcpDiscoveryImpl {
finally {
if (authFailed) {
try {
- trySendMessageDirectly(node, new TcpDiscoveryAuthFailedMessage(locNodeId,
- spi.locHost));
+ trySendMessageDirectly(
+ node,
+ new TcpDiscoveryAuthFailedMessage(locNodeId, spi.locHost, node.id())
+ );
}
catch (IgniteSpiException e) {
if (log.isDebugEnabled())
@@ -4644,7 +4678,7 @@ class ServerImpl extends TcpDiscoveryImpl {
if (spi.nodeAuth != null && spi.nodeAuth.isGlobalNodeAuthentication()) {
TcpDiscoveryAbstractMessage authFail =
- new TcpDiscoveryAuthFailedMessage(locNodeId, spi.locHost);
+ new TcpDiscoveryAuthFailedMessage(locNodeId, spi.locHost, node.id());
try {
ClassLoader ldr = U.resolveClassLoader(spi.ignite().configuration());
@@ -6621,10 +6655,6 @@ class ServerImpl extends TcpDiscoveryImpl {
// Send receipt back.
spi.writeToSocket(msg, sock, RES_OK, sockTimeout);
- boolean ignored = false;
-
- TcpDiscoverySpiState state = null;
-
synchronized (mux) {
if (spiState == CONNECTING) {
joinRes.set(msg);
@@ -6634,16 +6664,19 @@ class ServerImpl extends TcpDiscoveryImpl {
mux.notifyAll();
}
else {
- ignored = true;
+ UUID targetNode = ((TcpDiscoveryAuthFailedMessage)msg).getTargetNodeId();
- state = spiState;
+ if (targetNode == null || targetNode.equals(locNodeId)) {
+ if (log.isDebugEnabled())
+ log.debug("Auth failed message has been ignored [msg=" + msg +
+ ", spiState=" + spiState + ']');
+ }
+ else
+ //It can happen when current node is router node and target node is client.
+ msgWorker.addMessage(msg);
}
}
- if (ignored && log.isDebugEnabled())
- log.debug("Auth failed message has been ignored [msg=" + msg +
- ", spiState=" + state + ']');
-
continue;
}
else if (msg instanceof TcpDiscoveryCheckFailedMessage) {
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAuthFailedMessage.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAuthFailedMessage.java
index d563fbe..6136461 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAuthFailedMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/messages/TcpDiscoveryAuthFailedMessage.java
@@ -35,16 +35,28 @@ public class TcpDiscoveryAuthFailedMessage extends TcpDiscoveryAbstractMessage {
/** Coordinator address. */
private transient InetAddress addr;
+ /** Node id for which authentication was failed. */
+ private UUID targetNodeId;
+
/**
* Constructor.
*
* @param creatorNodeId Creator node ID.
* @param addr Coordinator address.
+ * @param targetNodeId Node for which authentication was failed.
*/
- public TcpDiscoveryAuthFailedMessage(UUID creatorNodeId, InetAddress addr) {
+ public TcpDiscoveryAuthFailedMessage(UUID creatorNodeId, InetAddress addr, UUID targetNodeId) {
super(creatorNodeId);
this.addr = addr;
+ this.targetNodeId = targetNodeId;
+ }
+
+ /**
+ * @return Node for which authentication was failed.
+ */
+ public UUID getTargetNodeId() {
+ return targetNodeId;
}
/**
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java b/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java
index 358faf20..bc1ef6d 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/IgniteClientConnectAfterCommunicationFailureTest.java
@@ -18,15 +18,13 @@
package org.apache.ignite.internal;
import java.util.Arrays;
-import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.ignite.Ignite;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.util.nio.GridCommunicationClient;
import org.apache.ignite.internal.util.typedef.internal.U;
-import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
-import org.apache.ignite.spi.discovery.tcp.ipfinder.multicast.TcpDiscoveryMulticastIpFinder;
import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.junit.Test;
@@ -34,7 +32,6 @@ import org.junit.Test;
* Tests client to be able restore connection to cluster on subsequent attempts after communication problems.
*/
public class IgniteClientConnectAfterCommunicationFailureTest extends GridCommonAbstractTest {
-
/** {@inheritDoc} */
@Override protected void afterTest() throws Exception {
stopAllGrids();
@@ -42,18 +39,10 @@ public class IgniteClientConnectAfterCommunicationFailureTest extends GridCommon
/** {@inheritDoc} */
@Override protected IgniteConfiguration getConfiguration(String gridName) throws Exception {
- IgniteConfiguration cfg = super.getConfiguration(gridName);
-
- ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(new TcpDiscoveryMulticastIpFinder());
-
- cfg.setNetworkTimeout(500);
- cfg.setCommunicationSpi(new TcpCommunicationSpi(gridName.contains("block")));
-
- if (gridName.contains("client")) {
- cfg.setClientMode(true);
- }
-
- return cfg;
+ return super.getConfiguration(gridName)
+ .setNetworkTimeout(500)
+ .setCommunicationSpi(new TcpCommunicationSpi(gridName.contains("block")))
+ .setClientMode(gridName.contains("client"));
}
/**
@@ -126,38 +115,28 @@ public class IgniteClientConnectAfterCommunicationFailureTest extends GridCommon
/**
* Whether this instance should actually block.
*/
- private final boolean isBlocking;
-
- /**
- * Local node ID that is prevented from creating connections.
- */
- private volatile UUID blockedNodeId = null;
+ private final AtomicBoolean isBlocking;
/**
*
* @param isBlocking Whether this instance should actually block.
*/
public TcpCommunicationSpi(boolean isBlocking) {
- this.isBlocking = isBlocking;
+ this.isBlocking = new AtomicBoolean(isBlocking);
}
/** {@inheritDoc} */
@Override protected GridCommunicationClient createTcpClient(ClusterNode node, int connIdx)
throws IgniteCheckedException {
- if (blockHandshakeOnce(getLocalNode().id())) {
+ if (blockHandshakeOnce())
throw new IgniteCheckedException("Node is blocked");
- }
return super.createTcpClient(node, connIdx);
}
/** Check if this connection is blocked. */
- private boolean blockHandshakeOnce(UUID nodeId) {
- if (isBlocking && (blockedNodeId == null || blockedNodeId.equals(nodeId))) {
- blockedNodeId = nodeId;
- return true;
- }
- return false;
+ private boolean blockHandshakeOnce() {
+ return isBlocking.compareAndSet(true, false);
}
}
}
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/FailBackupOnAtomicOperationTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/FailBackupOnAtomicOperationTest.java
new file mode 100644
index 0000000..b835033
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/FailBackupOnAtomicOperationTest.java
@@ -0,0 +1,165 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache.distributed;
+
+import java.util.List;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheWriteSynchronizationMode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.DataRegionConfiguration;
+import org.apache.ignite.configuration.DataStorageConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteInternalFuture;
+import org.apache.ignite.internal.TestRecordingCommunicationSpi;
+import org.apache.ignite.internal.processors.cache.distributed.dht.atomic.GridNearAtomicUpdateResponse;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.junit.Test;
+
+/**
+ * Fail backup node on not entry modified operation.
+ * It shold to lead mapping issue on FULL_SYNC cache only, bacause in this case cliwnt try to map operation to nodes locally.
+ */
+public class FailBackupOnAtomicOperationTest extends GridCommonAbstractTest {
+ /** Persistence. */
+ private boolean persistence = false;
+
+ /** Client. */
+ private static boolean client = false;
+
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+ return super.getConfiguration(igniteInstanceName)
+ .setClientMode(client)
+ .setConsistentId(igniteInstanceName)
+ .setCommunicationSpi(new TestRecordingCommunicationSpi())
+ .setDataStorageConfiguration(new DataStorageConfiguration()
+ .setDefaultDataRegionConfiguration(new DataRegionConfiguration()
+ .setMaxSize(200L * 1024 * 1024)
+ .setPersistenceEnabled(persistence)))
+ .setCacheConfiguration(new CacheConfiguration(DEFAULT_CACHE_NAME)
+ .setWriteSynchronizationMode(CacheWriteSynchronizationMode.FULL_SYNC)
+ .setBackups(2)
+ .setAtomicityMode(CacheAtomicityMode.ATOMIC));
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() throws Exception {
+ stopAllGrids();
+
+ persistence = false;
+ client = false;
+
+ cleanPersistenceDir();
+
+ super.afterTest();
+ }
+
+ /**
+ * @throws Exception If fail.
+ */
+ @Test
+ public void testNodeFailOnCacheReadWithPersistent() throws Exception {
+ persistence = true;
+ nodeFailOnCacheOp();
+ }
+
+ /**
+ * @throws Exception If fail.
+ */
+ @Test
+ public void testNodeFailOnCacheReadWithoutPersistent() throws Exception {
+ nodeFailOnCacheOp();
+ }
+
+ /**
+ *
+ */
+ public void nodeFailOnCacheOp() throws Exception {
+ Ignite ignite0 = startGrids(3);
+
+ ignite0.cluster().active(true);
+
+ client = true;
+
+ Ignite igniteClient = startGrid("client");
+
+ client = false;
+
+ awaitPartitionMapExchange();
+
+ IgniteCache cache = igniteClient.cache(DEFAULT_CACHE_NAME);
+
+ List<Integer> keys = primaryKeys(ignite(1).cache(cache.getName()), 3, 0);
+
+ for (Integer key : keys) {
+ IgniteInternalFuture fut = GridTestUtils.runAsync(new Runnable() {
+ @Override public void run() {
+ int i = keys.indexOf(key);
+
+ switch (keys.indexOf(key)) {
+ case 0:
+ info("Cmd: getAndReplace");
+
+ cache.getAndReplace(key, key);
+
+ break;
+ case 1:
+ info("Cmd: invoke");
+
+ cache.invoke(key, (entry, arguments) -> 0);
+
+ break;
+ case 2:
+ info("Cmd: remove");
+
+ cache.remove(key);
+
+ break;
+ default:
+ fail("The op: " + i + " is not implemented");
+ }
+ }
+ });
+
+ TestRecordingCommunicationSpi communicationSpi = (TestRecordingCommunicationSpi)ignite(1).configuration().getCommunicationSpi();
+
+ communicationSpi.blockMessages(GridNearAtomicUpdateResponse.class, "client");
+
+ communicationSpi.waitForBlocked();
+
+ ignite0.close();
+
+ communicationSpi.stopBlock();
+
+ try {
+ fut.get(10_000);
+ }
+ catch (IgniteCheckedException e) {
+ fail("Atomic update hangs. " + e.getMessage());
+ }
+
+ startGrid(0);
+
+ awaitPartitionMapExchange();
+ }
+ }
+}
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/CheckpointFreeListTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/CheckpointFreeListTest.java
index fe244b4..5074329 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/CheckpointFreeListTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/checkpoint/CheckpointFreeListTest.java
@@ -32,8 +32,6 @@ import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.CyclicBarrier;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
import java.util.concurrent.atomic.AtomicReferenceArray;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -236,7 +234,9 @@ public class CheckpointFreeListTest extends GridCommonAbstractTest {
Collections.shuffle(cachedEntry);
//Remove half of entries.
- Collection<T2<Integer, byte[]>> entriesToRemove = cachedEntry.stream().limit(cachedEntry.size() / 2).collect(Collectors.toCollection(ConcurrentLinkedQueue::new));
+ Collection<T2<Integer, byte[]>> entriesToRemove = cachedEntry.stream()
+ .limit(cachedEntry.size() / 2)
+ .collect(Collectors.toCollection(ConcurrentLinkedQueue::new));
entriesToRemove.forEach(t2 -> cache.remove(t2.get1()));
@@ -276,7 +276,7 @@ public class CheckpointFreeListTest extends GridCommonAbstractTest {
break;
//Notify put thread that node successfully started.
- nodeStartBarrier.await(20000, TimeUnit.MILLISECONDS);
+ nodeStartBarrier.await();
nodeStartBarrier.reset();
int awaitSize = entriesToRemove.size() - iterationDataCount;
@@ -304,7 +304,7 @@ public class CheckpointFreeListTest extends GridCommonAbstractTest {
GridTestUtils.runAsync(() -> {
while (true) {
try {
- nodeStartBarrier.await(10000, TimeUnit.MILLISECONDS);
+ nodeStartBarrier.await();
Ignite ignite = ignite(0);
@@ -320,7 +320,7 @@ public class CheckpointFreeListTest extends GridCommonAbstractTest {
iter.remove();
}
}
- catch (TimeoutException | InterruptedException | BrokenBarrierException e) {
+ catch (InterruptedException | BrokenBarrierException e) {
return;
}
catch (Exception e) {
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/AbstractPageLockTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/AbstractPageLockTest.java
index 0f7579d..4ac9c82 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/AbstractPageLockTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/AbstractPageLockTest.java
@@ -43,12 +43,14 @@ public abstract class AbstractPageLockTest {
}
}
+ /** */
protected int nextRandomWaitTimeout(int bound) {
ThreadLocalRandom rnd = ThreadLocalRandom.current();
return rnd.nextInt(bound);
}
+ /** */
protected void checkNextOp(PageLockLogSnapshot lockLog, long nextOpPageId, long nextOp, int nextOpStructureId) {
assertEquals(nextOpStructureId, lockLog.nextOpStructureId);
assertEquals(nextOp, lockLog.nextOp);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/SharedPageLockTrackerTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/SharedPageLockTrackerTest.java
index 49869f7..1afebe9 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/SharedPageLockTrackerTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/SharedPageLockTrackerTest.java
@@ -33,6 +33,7 @@ import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelo
import org.apache.ignite.internal.processors.cache.persistence.tree.util.PageLockListener;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.GridTestUtils.SF;
import org.junit.Assert;
import org.junit.Test;
@@ -40,7 +41,6 @@ import static org.apache.ignite.internal.processors.cache.persistence.diagnostic
import static org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.LockTrackerFactory.HEAP_STACK;
import static org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.LockTrackerFactory.OFF_HEAP_LOG;
import static org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.LockTrackerFactory.OFF_HEAP_STACK;
-import static org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.dumpprocessors.ToStringDumpProcessor.toStringDump;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertSame;
@@ -62,13 +62,15 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
for (int i = 0; i < trackerTypes.length; i++) {
LockTrackerFactory.DEFAULT_TYPE = trackerTypes[i];
- doTestTakeDumpByCount(5, 1, 10, 1);
+ int dumps = SF.apply(30, 10, 40);
- doTestTakeDumpByCount(5, 2, 10, 2);
+ doTestTakeDumpByCount(5, 1, dumps, 1);
- doTestTakeDumpByCount(10, 3, 20, 4);
+ doTestTakeDumpByCount(5, 2, dumps, 2);
- doTestTakeDumpByCount(20, 6, 40, 8);
+ doTestTakeDumpByCount(10, 3, dumps, 4);
+
+ doTestTakeDumpByCount(20, 6, dumps, 8);
}
}
@@ -84,13 +86,15 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
for (int i = 0; i < trackerTypes.length; i++) {
LockTrackerFactory.DEFAULT_TYPE = trackerTypes[i];
- doTestTakeDumpByTime(5, 1, 40_000, 1);
+ int time = SF.apply(30_000, 5_000, 40_000);
+
+ doTestTakeDumpByTime(5, 1, time, 1);
- doTestTakeDumpByTime(5, 2, 20_000, 2);
+ doTestTakeDumpByTime(5, 2, time, 2);
- doTestTakeDumpByTime(10, 3, 10_000, 4);
+ doTestTakeDumpByTime(10, 3, time, 4);
- doTestTakeDumpByTime(20, 6, 10_000, 8);
+ doTestTakeDumpByTime(20, 6, time, 8);
}
}
@@ -127,6 +131,8 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
pages.addAll(pageMetas);
+ boolean latchDown = false;
+
while (!stop.get()) {
Collections.shuffle(locks);
Collections.shuffle(pages);
@@ -156,8 +162,11 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
}
}
- if (awaitThreadStartLatch.getCount() > 0)
+ if (!latchDown) {
awaitThreadStartLatch.countDown();
+
+ latchDown = true;
+ }
}
}, threads, "PageLocker");
@@ -168,8 +177,6 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
ThreadPageLocksDumpLock dump = sharedPageLockTracker.dump();
- System.out.println(toStringDump(dump));
-
assertEquals(threads, dump.threadStates.size());
assertEquals(0, dump.threadStates.stream().filter(e -> e.invalidContext != null).count());
}
@@ -212,17 +219,19 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
pages.addAll(pageMetas);
+ boolean latchDown = false;
+
while (!stop.get()) {
Collections.shuffle(locks);
Collections.shuffle(pages);
for (PageLockListener lsnr : locks) {
for (PageMeta pageMeta : pages) {
- //awaitRandom(5);
+ awaitRandom(5);
lsnr.onBeforeReadLock(pageMeta.structureId, pageMeta.pageId, pageMeta.page);
- //awaitRandom(5);
+ awaitRandom(5);
lsnr.onReadLock(pageMeta.structureId, pageMeta.pageId, pageMeta.page, pageMeta.pageAddr);
}
@@ -233,14 +242,17 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
for (PageLockListener lsnr : locks) {
for (PageMeta pageMeta : pages) {
- // awaitRandom(5);
+ awaitRandom(5);
lsnr.onReadUnlock(pageMeta.structureId, pageMeta.pageId, pageMeta.page, pageMeta.pageAddr);
}
}
- if (awaitThreadStartLatch.getCount() > 0)
+ if (!latchDown) {
awaitThreadStartLatch.countDown();
+
+ latchDown = true;
+ }
}
}, threads, "PageLocker");
@@ -258,8 +270,6 @@ public class SharedPageLockTrackerTest extends AbstractPageLockTest {
ThreadPageLocksDumpLock dump = sharedPageLockTracker.dump();
- System.out.println(toStringDump(dump));
-
assertEquals(threads, dump.threadStates.size());
assertEquals(0, dump.threadStates.stream().filter(e -> e.invalidContext != null).count());
}
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/log/PageLockLogTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/log/PageLockLogTest.java
index 19ca152..9ffd46b 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/log/PageLockLogTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/log/PageLockLogTest.java
@@ -23,6 +23,7 @@ import org.apache.ignite.internal.IgniteInternalFuture;
import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.AbstractPageLockTest;
import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.log.PageLockLogSnapshot.LogEntry;
import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.GridTestUtils.SF;
import org.junit.Assert;
import org.junit.Test;
@@ -67,8 +68,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(0, logDump.headIdx);
assertTrue(logDump.locklog.isEmpty());
checkNextOp(logDump, pageId, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -77,8 +76,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(1, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId, READ_LOCK, STRUCTURE_ID, 1);
checkNextOp(logDump, 0, 0, 0);
@@ -87,8 +84,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertTrue(logDump.locklog.isEmpty());
checkNextOp(logDump, 0, 0, 0);
}
@@ -111,8 +106,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(0, logDump.headIdx);
assertTrue(logDump.locklog.isEmpty());
checkNextOp(logDump, pageId1, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -121,8 +114,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(1, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkNextOp(logDump, 0, 0, 0);
@@ -131,8 +122,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(1, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkNextOp(logDump, pageId2, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -141,8 +130,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(2, logDump.locklog.size());
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
@@ -153,8 +140,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(3, logDump.locklog.size());
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
@@ -165,9 +150,7 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
lockLog.onReadUnlock(STRUCTURE_ID, pageId1, page1, pageAddr1);
logDump = lockLog.dump();
-
- out.println(logDump);
-
+
assertTrue(logDump.locklog.isEmpty());
checkNextOp(logDump, 0, 0, 0);
}
@@ -193,8 +176,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(0, logDump.headIdx);
assertTrue(logDump.locklog.isEmpty());
checkNextOp(logDump, pageId1, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -203,8 +184,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(1, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkNextOp(logDump, 0, 0, 0);
@@ -213,8 +192,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(1, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkNextOp(logDump, pageId2, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -223,8 +200,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(2, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -234,8 +209,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(2, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -245,8 +218,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(3, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -257,8 +228,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(4, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -270,8 +239,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(5, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -284,8 +251,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(0, logDump.headIdx);
assertTrue(logDump.locklog.isEmpty());
checkNextOp(logDump, 0, 0, 0);
@@ -312,8 +277,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(0, logDump.headIdx);
assertTrue(logDump.locklog.isEmpty());
checkNextOp(logDump, pageId1, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -322,8 +285,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(1, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkNextOp(logDump, 0, 0, 0);
@@ -332,8 +293,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(1, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkNextOp(logDump, pageId2, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -342,8 +301,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(2, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -353,8 +310,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(3, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -365,8 +320,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(3, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -377,8 +330,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(4, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -390,8 +341,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(5, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -404,8 +353,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(0, logDump.headIdx);
assertTrue(logDump.locklog.isEmpty());
checkNextOp(logDump, 0, 0, 0);
@@ -432,8 +379,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(0, logDump.headIdx);
assertTrue(logDump.locklog.isEmpty());
checkNextOp(logDump, pageId1, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -442,8 +387,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(1, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkNextOp(logDump, 0, 0, 0);
@@ -452,8 +395,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(1, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkNextOp(logDump, pageId2, BEFORE_READ_LOCK, STRUCTURE_ID);
@@ -462,8 +403,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(2, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -473,8 +412,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(2, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -484,8 +421,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(3, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -496,8 +431,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(4, logDump.headIdx);
checkLogEntry(logDump.locklog.get(0), pageId1, READ_LOCK, STRUCTURE_ID, 1);
checkLogEntry(logDump.locklog.get(1), pageId2, READ_LOCK, STRUCTURE_ID, 2);
@@ -507,8 +440,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
lockLog.onReadUnlock(STRUCTURE_ID, pageId3, page3, pageAddr3);
- out.println(lockLog);
-
logDump = lockLog.dump();
assertEquals(5, logDump.headIdx);
@@ -523,8 +454,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
logDump = lockLog.dump();
- out.println(logDump);
-
assertEquals(0, logDump.headIdx);
assertTrue(logDump.locklog.isEmpty());
checkNextOp(logDump, 0, 0, 0);
@@ -547,8 +476,6 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
lockLog.onReadLock(STRUCTURE_ID, pageId, page, pageAddr);
});
- out.println(lockLog);
-
log = lockLog.dump();
Assert.assertTrue(lockLog.isInvalid());
@@ -567,7 +494,7 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
long page = 2;
long pageAddr = 3;
- int cntlogs = 5_000;
+ int cntlogs = SF.applyLB(5_000, 1_000);
AtomicBoolean done = new AtomicBoolean();
@@ -618,9 +545,8 @@ public abstract class PageLockLogTest extends AbstractPageLockTest {
Assert.assertNotNull(logDump.name);
if (logDump.headIdx > 0) {
- //TODO
- /* for (int j = 0; j < log.headIdx; j++)
- Assert.assertTrue(String.valueOf(log.headIdx), log.pageIdLocksStack[j] != 0);*/
+ for (int j = 0; j < logDump.headIdx; j++)
+ Assert.assertNotNull(String.valueOf(logDump.headIdx), logDump.locklog.get(j));
}
Assert.assertNotNull(logDump);
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/stack/PageLockStackTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/stack/PageLockStackTest.java
index 397cfaa..43a4421 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/stack/PageLockStackTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/diagnostic/pagelocktracker/stack/PageLockStackTest.java
@@ -24,6 +24,7 @@ import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelo
import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.LockTrackerFactory;
import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.PageLockTracker;
import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.GridTestUtils.SF;
import org.junit.Assert;
import org.junit.Test;
@@ -673,7 +674,7 @@ public abstract class PageLockStackTest extends AbstractPageLockTest {
long page = 2;
long pageAddr = 3;
- int cntDumps = 5_000;
+ int cntDumps = SF.applyLB(5_000, 1_000);
AtomicBoolean done = new AtomicBoolean();
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/FilteredWalIteratorTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/FilteredWalIteratorTest.java
index dd40f81..aede022 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/FilteredWalIteratorTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/reader/FilteredWalIteratorTest.java
@@ -46,6 +46,7 @@ import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType
import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.PAGE_RECORD;
import static org.apache.ignite.internal.pagemem.wal.record.WALRecord.RecordType.PART_META_UPDATE_STATE;
import static org.apache.ignite.internal.processors.cache.distributed.dht.topology.GridDhtPartitionState.OWNING;
+import static org.apache.ignite.internal.processors.cache.persistence.wal.scanner.WalScannerTest.dummyPage;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.mockito.Mockito.when;
@@ -181,7 +182,7 @@ public class FilteredWalIteratorTest {
case 1:
return new IgniteBiTuple<>(ZERO_POINTER, new CheckpointRecord(new FileWALPointer(5738, 0, 0)));
case 2:
- return new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(1, 1), new byte[0], 10));
+ return new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(1, 1), dummyPage(1024, 1), 1024));
case 3:
return new IgniteBiTuple<>(ZERO_POINTER, new PartitionMetaStateRecord(1, 1, OWNING, 1));
case 4:
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/scanner/WalScannerTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/scanner/WalScannerTest.java
index 469b102..0081d3a 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/scanner/WalScannerTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/wal/scanner/WalScannerTest.java
@@ -18,6 +18,7 @@
package org.apache.ignite.internal.processors.cache.persistence.wal.scanner;
import java.io.File;
+import java.nio.ByteBuffer;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
@@ -35,9 +36,11 @@ import org.apache.ignite.internal.pagemem.wal.record.PageSnapshot;
import org.apache.ignite.internal.pagemem.wal.record.WALRecord;
import org.apache.ignite.internal.pagemem.wal.record.delta.FixCountRecord;
import org.apache.ignite.internal.pagemem.wal.record.delta.PartitionMetaStateRecord;
+import org.apache.ignite.internal.processors.cache.persistence.DummyPageIO;
import org.apache.ignite.internal.processors.cache.persistence.wal.FileWALPointer;
import org.apache.ignite.internal.processors.cache.persistence.wal.reader.IgniteWalIteratorFactory;
import org.apache.ignite.internal.processors.cache.persistence.wal.reader.IgniteWalIteratorFactory.IteratorParametersBuilder;
+import org.apache.ignite.internal.util.GridUnsafe;
import org.apache.ignite.internal.util.typedef.T2;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.lang.IgniteBiTuple;
@@ -75,13 +78,13 @@ public class WalScannerTest {
long expPageId = 984;
int grpId = 123;
- PageSnapshot expPageSnapshot = new PageSnapshot(new FullPageId(expPageId, grpId), new byte[0], 10);
+ PageSnapshot expPageSnapshot = new PageSnapshot(new FullPageId(expPageId, grpId), dummyPage(1024, expPageId), 1024);
CheckpointRecord expCheckpoint = new CheckpointRecord(new FileWALPointer(5738, 0, 0));
FixCountRecord expDeltaPage = new FixCountRecord(grpId, expPageId, 4);
WALIterator mockedIter = mockWalIterator(
new IgniteBiTuple<>(ZERO_POINTER, expPageSnapshot),
- new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(455, grpId), new byte[0], 10)),
+ new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(455, grpId), dummyPage(4096, 455), 1024)),
new IgniteBiTuple<>(ZERO_POINTER, expCheckpoint),
new IgniteBiTuple<>(ZERO_POINTER, new MetastoreDataRecord("key", new byte[0])),
new IgniteBiTuple<>(ZERO_POINTER, new PartitionMetaStateRecord(grpId, 1, OWNING, 1)),
@@ -125,14 +128,14 @@ public class WalScannerTest {
int grpId = 123;
- PageSnapshot expPageSnapshot = new PageSnapshot(new FullPageId(expPageId1, grpId), new byte[0], 10);
+ PageSnapshot expPageSnapshot = new PageSnapshot(new FullPageId(expPageId1, grpId), dummyPage(1024, expPageId1), 1024);
CheckpointRecord expCheckpoint = new CheckpointRecord(new FileWALPointer(5738, 0, 0));
FixCountRecord expDeltaPage1 = new FixCountRecord(grpId, expPageId2, 4);
FixCountRecord expDeltaPage2 = new FixCountRecord(grpId, expPageId3, 4);
WALIterator mockedIter = mockWalIterator(
new IgniteBiTuple<>(ZERO_POINTER, expPageSnapshot),
- new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(455, grpId), new byte[0], 10)),
+ new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(455, grpId), dummyPage(1024, 455), 1024)),
new IgniteBiTuple<>(ZERO_POINTER, expCheckpoint),
new IgniteBiTuple<>(ZERO_POINTER, new MetastoreDataRecord("key", new byte[0])),
new IgniteBiTuple<>(ZERO_POINTER, new PartitionMetaStateRecord(grpId, 1, OWNING, 1)),
@@ -183,7 +186,7 @@ public class WalScannerTest {
doNothing().when(log).info(valCapture.capture());
WALIterator mockedIter = mockWalIterator(
- new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expPageId, grpId), new byte[0], 10)),
+ new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expPageId, grpId), dummyPage(1024, expPageId), 1024)),
new IgniteBiTuple<>(ZERO_POINTER, new CheckpointRecord(new FileWALPointer(5738, 0, 0))),
new IgniteBiTuple<>(ZERO_POINTER, new FixCountRecord(grpId, expPageId, 4))
);
@@ -230,7 +233,7 @@ public class WalScannerTest {
int grpId = 123;
WALIterator mockedIter = mockWalIterator(
- new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expectedPageId, grpId), new byte[0], 10)),
+ new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expectedPageId, grpId), dummyPage(1024, expectedPageId), 1024)),
new IgniteBiTuple<>(ZERO_POINTER, new CheckpointRecord(new FileWALPointer(5738, 0, 0))),
new IgniteBiTuple<>(ZERO_POINTER, new FixCountRecord(grpId, expectedPageId, 4))
);
@@ -256,12 +259,12 @@ public class WalScannerTest {
targetFile.delete();
}
- // then: Should be find only expected value from file.
- assertEquals(actualRecords.size(), 3);
+ // then: Should be find only expected value from file. PageSnapshot string representation is 11 lines long.
+ assertEquals(13, actualRecords.size());
- assertRecord(actualRecords.get(0), "PageSnapshot [", "PAGE_RECORD");
- assertRecord(actualRecords.get(1), "CheckpointRecord [", "CHECKPOINT_RECORD");
- assertRecord(actualRecords.get(2), "FixCountRecord [", "BTREE_FIX_COUNT");
+ assertTrue(actualRecords.get(0), actualRecords.get(0).contains("PageSnapshot ["));
+ assertTrue(actualRecords.get(11), actualRecords.get(11).contains("CheckpointRecord ["));
+ assertTrue(actualRecords.get(12), actualRecords.get(12).contains("FixCountRecord ["));
}
/**
@@ -281,7 +284,7 @@ public class WalScannerTest {
doNothing().when(log).info(valCapture.capture());
WALIterator mockedIter = mockWalIterator(
- new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expPageId, grpId), new byte[0], 10)),
+ new IgniteBiTuple<>(ZERO_POINTER, new PageSnapshot(new FullPageId(expPageId, grpId), dummyPage(1024, expPageId), 1024)),
new IgniteBiTuple<>(ZERO_POINTER, new CheckpointRecord(new FileWALPointer(5738, 0, 0))),
new IgniteBiTuple<>(ZERO_POINTER, new FixCountRecord(grpId, expPageId, 4))
);
@@ -310,18 +313,18 @@ public class WalScannerTest {
// then: Should be find only expected value from file.
assertEquals(actualFileRecords.size(), 3);
- assertRecord(actualFileRecords.get(0), "PageSnapshot [", "PAGE_RECORD");
- assertRecord(actualFileRecords.get(1), "CheckpointRecord [", "CHECKPOINT_RECORD");
- assertRecord(actualFileRecords.get(2), "FixCountRecord [", "BTREE_FIX_COUNT");
+ assertTrue(actualFileRecords.get(0), actualFileRecords.get(0).contains("PageSnapshot ["));
+ assertTrue(actualFileRecords.get(1), actualFileRecords.get(1).contains("CheckpointRecord ["));
+ assertTrue(actualFileRecords.get(2), actualFileRecords.get(2).contains("FixCountRecord ["));
// then: Should be find only expected value from log.
List<String> actualLogRecords = valCapture.getAllValues();
assertEquals(actualLogRecords.size(), 1);
- assertRecord(actualLogRecords.get(0), "PageSnapshot [", "PAGE_RECORD");
- assertRecord(actualLogRecords.get(0), "CheckpointRecord [", "CHECKPOINT_RECORD");
- assertRecord(actualLogRecords.get(0), "FixCountRecord [", "BTREE_FIX_COUNT");
+ assertTrue(actualLogRecords.get(0), actualLogRecords.get(0).contains("PageSnapshot ["));
+ assertTrue(actualLogRecords.get(0), actualLogRecords.get(0).contains("CheckpointRecord ["));
+ assertTrue(actualLogRecords.get(0), actualLogRecords.get(0).contains("FixCountRecord ["));
}
/**
@@ -344,4 +347,19 @@ public class WalScannerTest {
return mockedIter;
}
+
+ /** */
+ public static byte[] dummyPage(int pageSize, long pageId) {
+ ByteBuffer pageBuf = ByteBuffer.allocateDirect(pageSize);
+
+ DummyPageIO.VERSIONS.latest().initNewPage(GridUnsafe.bufferAddress(pageBuf), pageId, pageSize);
+
+ byte[] pageData = new byte[pageSize];
+
+ pageBuf.get(pageData);
+
+ GridUnsafe.cleanDirectBuffer(pageBuf);
+
+ return pageData;
+ }
}
diff --git a/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpiFreezingClientTest.java b/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpiFreezingClientTest.java
index 926a056..8fc920b 100644
--- a/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpiFreezingClientTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpiFreezingClientTest.java
@@ -123,6 +123,10 @@ public class TcpCommunicationSpiFreezingClientTest extends GridCommonAbstractTes
}
catch (ClusterTopologyException e) {
// Expected.
+
+ e.printStackTrace();
+
+ System.out.println(e);
}
finally {
stopAllGrids();
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java
index d9f15c3..4263f9d 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite9.java
@@ -34,6 +34,7 @@ import org.apache.ignite.internal.processors.cache.IgniteCacheGetCustomCollectio
import org.apache.ignite.internal.processors.cache.IgniteCacheLoadRebalanceEvictionSelfTest;
import org.apache.ignite.internal.processors.cache.distributed.CacheAtomicPrimarySyncBackPressureTest;
import org.apache.ignite.internal.processors.cache.distributed.CacheOperationsInterruptTest;
+import org.apache.ignite.internal.processors.cache.distributed.FailBackupOnAtomicOperationTest;
import org.apache.ignite.internal.processors.cache.distributed.IgniteCachePrimarySyncTest;
import org.apache.ignite.internal.processors.cache.distributed.IgniteTxCachePrimarySyncTest;
import org.apache.ignite.internal.processors.cache.distributed.IgniteTxCacheWriteSynchronizationModesMultithreadedTest;
@@ -115,6 +116,8 @@ public class IgniteCacheTestSuite9 {
GridTestUtils.addTestIfNeeded(suite, GridCacheLongRunningTransactionDiagnosticsTest.class, ignoredTests);
+ GridTestUtils.addTestIfNeeded(suite, FailBackupOnAtomicOperationTest.class, ignoredTests);
+
return suite;
}
}
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsMvccTestSuite4.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsMvccTestSuite4.java
index 239372c..78c9480 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsMvccTestSuite4.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsMvccTestSuite4.java
@@ -22,6 +22,13 @@ import java.util.Set;
import org.apache.ignite.IgniteSystemProperties;
import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsTaskCancelingTest;
import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsPartitionPreloadTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.PageLockTrackerManagerTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.SharedPageLockTrackerTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.dumpprocessors.ToFileDumpProcessorTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.log.HeapArrayLockLogTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.log.OffHeapLockLogTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.stack.HeapArrayLockStackTest;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.stack.OffHeapLockStackTest;
import org.apache.ignite.internal.processors.cache.persistence.file.FileDownloaderTest;
import org.apache.ignite.testframework.junits.DynamicSuite;
import org.junit.runner.RunWith;
@@ -46,6 +53,15 @@ public class IgnitePdsMvccTestSuite4 {
ignoredTests.add(FileDownloaderTest.class);
ignoredTests.add(IgnitePdsTaskCancelingTest.class);
+ // Skip page lock tracker tests for MVCC suite.
+ ignoredTests.add(PageLockTrackerManagerTest.class);
+ ignoredTests.add(SharedPageLockTrackerTest.class);
+ ignoredTests.add(ToFileDumpProcessorTest.class);
+ ignoredTests.add(HeapArrayLockLogTest.class);
+ ignoredTests.add(HeapArrayLockStackTest.class);
+ ignoredTests.add(OffHeapLockLogTest.class);
+ ignoredTests.add(OffHeapLockStackTest.class);
+
return IgnitePdsTestSuite4.suite(ignoredTests);
}
}
diff --git a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
index 2b0bb1d..eb0e82c 100644
--- a/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/util/GridCommandHandlerTest.java
@@ -87,6 +87,7 @@ import org.apache.ignite.internal.processors.cache.distributed.near.GridNearLock
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxFinishRequest;
import org.apache.ignite.internal.processors.cache.distributed.near.GridNearTxLocal;
import org.apache.ignite.internal.processors.cache.persistence.GridCacheDatabaseSharedManager;
+import org.apache.ignite.internal.processors.cache.persistence.diagnostic.pagelocktracker.dumpprocessors.ToFileDumpProcessor;
import org.apache.ignite.internal.processors.cache.transactions.IgniteInternalTx;
import org.apache.ignite.internal.processors.cache.transactions.IgniteTxEntry;
import org.apache.ignite.internal.processors.cache.transactions.IgniteTxManager;
@@ -115,6 +116,7 @@ import org.apache.ignite.transactions.TransactionTimeoutException;
import org.jetbrains.annotations.NotNull;
import org.junit.Test;
+import static java.io.File.separatorChar;
import static java.nio.file.Files.delete;
import static java.nio.file.Files.newDirectoryStream;
import static java.util.Arrays.asList;
@@ -129,6 +131,7 @@ import static org.apache.ignite.internal.commandline.OutputFormat.MULTI_LINE;
import static org.apache.ignite.internal.commandline.OutputFormat.SINGLE_LINE;
import static org.apache.ignite.internal.commandline.cache.CacheSubcommands.HELP;
import static org.apache.ignite.internal.processors.cache.verify.VerifyBackupPartitionsDumpTask.IDLE_DUMP_FILE_PREFIX;
+import static org.apache.ignite.internal.processors.diagnostic.DiagnosticProcessor.DEFAULT_TARGET_FOLDER;
import static org.apache.ignite.testframework.GridTestUtils.waitForCondition;
import static org.apache.ignite.transactions.TransactionConcurrency.OPTIMISTIC;
import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
@@ -153,6 +156,12 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
/** Additional data region configuration. */
private DataRegionConfiguration dataRegionConfiguration;
+ /** */
+ private File defaultDiagnosticDir;
+
+ /** */
+ private File customDiagnosticDir;
+
/**
* @return Folder in work directory.
* @throws IgniteCheckedException If failed to resolve folder name.
@@ -185,6 +194,10 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
stopAllGrids();
+ initDiagnosticDir();
+
+ cleanDiagnosticDir();
+
sysOut = System.out;
testOut = new ByteArrayOutputStream(1024 * 1024);
@@ -206,6 +219,8 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
delete(path);
}
+ cleanDiagnosticDir();
+
System.clearProperty(IGNITE_ENABLE_EXPERIMENTAL_COMMAND);
System.setOut(sysOut);
@@ -216,6 +231,25 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
}
/**
+ * @throws IgniteCheckedException If failed.
+ */
+ private void initDiagnosticDir() throws IgniteCheckedException {
+ defaultDiagnosticDir = new File(U.defaultWorkDirectory()
+ + separatorChar + DEFAULT_TARGET_FOLDER + separatorChar);
+
+ customDiagnosticDir = new File(U.defaultWorkDirectory()
+ + separatorChar + "diagnostic_test_dir" + separatorChar);
+ }
+
+ /**
+ * Clean diagnostic directories.
+ */
+ private void cleanDiagnosticDir() {
+ U.delete(defaultDiagnosticDir);
+ U.delete(customDiagnosticDir);
+ }
+
+ /**
*
*/
protected void injectTestSystemOut() {
@@ -2702,29 +2736,108 @@ public class GridCommandHandlerTest extends GridCommonAbstractTest {
ignite.cluster().active(true);
- String dir = U.defaultWorkDirectory() + "/diagnostic/";
+ assertEquals(
+ EXIT_CODE_OK,
+ execute("--diagnostic")
+ );
+
+ assertEquals(
+ EXIT_CODE_OK,
+ execute("--diagnostic", "help")
+ );
+
+ // Dump locks only on connected node to default path.
+ assertEquals(
+ EXIT_CODE_OK,
+ execute("--diagnostic", "pageLocks", "dump")
+ );
+
+ // Check file dump in default path.
+ checkNumberFiles(defaultDiagnosticDir, 1);
+
+ assertEquals(
+ EXIT_CODE_OK,
+ execute("--diagnostic", "pageLocks", "dump_log")
+ );
+
+ // Dump locks only on connected node to specific path.
+ assertEquals(
+ EXIT_CODE_OK,
+ execute("--diagnostic", "pageLocks", "dump", "--path", customDiagnosticDir.getAbsolutePath())
+ );
+
+ // Check file dump in specific path.
+ checkNumberFiles(customDiagnosticDir, 1);
+
+ // Dump locks only all nodes.
+ assertEquals(
+ EXIT_CODE_OK,
+ execute("--diagnostic", "pageLocks", "dump", "--all")
+ );
+
+ // Current cluster 4 nodes -> 4 files + 1 from previous operation.
+ checkNumberFiles(defaultDiagnosticDir, 5);
+
+ assertEquals(
+ EXIT_CODE_OK,
+ execute("--diagnostic", "pageLocks", "dump_log", "--all")
+ );
+
+ assertEquals(
+ EXIT_CODE_OK,
+ execute("--diagnostic", "pageLocks", "dump",
+ "--path", customDiagnosticDir.getAbsolutePath(), "--all")
+ );
- assertEquals(EXIT_CODE_OK, execute("--diagnostic"));
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "help"));
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "help"));
+ // Current cluster 4 nodes -> 4 files + 1 from previous operation.
+ checkNumberFiles(customDiagnosticDir, 5);
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump"));
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump_log"));
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", dir));
+ // Dump locks only 2 nodes use nodeIds as arg.
+ assertEquals(
+ EXIT_CODE_OK,
+ execute("--diagnostic", "pageLocks", "dump",
+ "--nodes", node0.id().toString() + "," + node2.id().toString())
+ );
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", "--all"));
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump_log", "--all"));
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", dir, "--all"));
+ // Dump locks only for 2 nodes -> 2 files + 5 from previous operation.
+ checkNumberFiles(defaultDiagnosticDir, 7);
+
+ // Dump locks only for 2 nodes use constIds as arg.
+ assertEquals(
+ EXIT_CODE_OK,
+ execute("--diagnostic", "pageLocks", "dump",
+ "--nodes", node0.consistentId().toString() + "," + node2.consistentId().toString())
+ );
+
+ assertEquals(
+ EXIT_CODE_OK,
+ execute("--diagnostic", "pageLocks", "dump_log",
+ "--nodes", node1.id().toString() + "," + node3.id().toString())
+ );
+
+ assertEquals(
+ EXIT_CODE_OK,
+ execute(
+ "--diagnostic", "pageLocks", "dump",
+ "--path", customDiagnosticDir.getAbsolutePath(),
+ "--nodes", node1.consistentId().toString() + "," + node3.consistentId().toString())
+ );
+
+ // Dump locks only for 2 nodes -> 2 files + 5 from previous operation.
+ checkNumberFiles(customDiagnosticDir, 7);
+ }
+
+ /**
+ * @param dir Directory.
+ * @param numberFiles Number of files.
+ */
+ private void checkNumberFiles(File dir, int numberFiles) {
+ File[] files = dir.listFiles((d, name) -> name.startsWith(ToFileDumpProcessor.PREFIX_NAME));
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", "--nodes",
- node0.id().toString(), node2.id().toString()));
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", "--nodes",
- node0.consistentId().toString(), node2.consistentId().toString()));
+ assertEquals(numberFiles, files.length);
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump_log", "--nodes",
- node1.id().toString(), node3.id().toString()));
- assertEquals(EXIT_CODE_OK, execute("--diagnostic", "pageLocks", "dump", dir, "--nodes",
- node1.consistentId().toString(), node3.consistentId().toString()));
+ for (int i = 0; i < files.length; i++)
+ assertTrue(files[i].length() > 0);
}
/**