This is an automated email from the ASF dual-hosted git repository.
ilyak 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 e61d347 IGNITE-10732 Force -Dfile.encoding=UTF-8 when not specified
otherwise - Fixes #5725.
e61d347 is described below
commit e61d3477b461f7216bfa7878e1e3c06f8b314879
Author: Ilya Kasnacheev <[email protected]>
AuthorDate: Thu Jan 10 16:38:00 2019 +0300
IGNITE-10732 Force -Dfile.encoding=UTF-8 when not specified otherwise -
Fixes #5725.
Signed-off-by: Ilya Kasnacheev <[email protected]>
---
bin/include/parseargs.sh | 10 ++++++++++
.../java/org/apache/ignite/internal/IgniteKernal.java | 19 +++++++++++++++++++
.../startup/cmdline/CommandLineTransformer.java | 10 +++++++++-
.../cmdline/GridCommandLineTransformerSelfTest.java | 6 +++---
modules/platforms/cpp/core/src/ignition.cpp | 17 ++++++++++++++++-
.../dotnet/Apache.Ignite.Core/Impl/IgniteManager.cs | 8 +++++++-
6 files changed, 64 insertions(+), 6 deletions(-)
diff --git a/bin/include/parseargs.sh b/bin/include/parseargs.sh
index 3ab255e..1efb48e 100755
--- a/bin/include/parseargs.sh
+++ b/bin/include/parseargs.sh
@@ -51,3 +51,13 @@ do
esac
shift
done
+
+#
+# Set 'file.encoding' to UTF-8 default if not specified otherwise
+#
+case "${JVM_OPTS}" in
+ *-Dfile.encoding=*)
+ ;;
+ *)
+ JVM_OPTS="${JVM_OPTS} -Dfile.encoding=UTF-8";;
+esac
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 3a3af8e..9633f89 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -29,6 +29,7 @@ import java.io.Serializable;
import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.lang.reflect.Constructor;
+import java.nio.charset.Charset;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.util.ArrayList;
@@ -40,6 +41,7 @@ import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.ListIterator;
+import java.util.Locale;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
@@ -1077,6 +1079,9 @@ public class IgniteKernal implements IgniteEx,
IgniteMXBean, Externalizable {
gw.writeUnlock();
}
+ // Check whether UTF-8 is the default character encoding.
+ checkFileEncoding();
+
// Check whether physical RAM is not exceeded.
checkPhysicalRam();
@@ -1406,6 +1411,20 @@ public class IgniteKernal implements IgniteEx,
IgniteMXBean, Externalizable {
}
/**
+ * Check whether UTF-8 is the default character encoding.
+ * Differing character encodings across cluster may lead to erratic
behavior.
+ */
+ private void checkFileEncoding() {
+ String encodingDisplayName =
Charset.defaultCharset().displayName(Locale.ENGLISH);
+
+ if (!"UTF-8".equals(encodingDisplayName)) {
+ U.quietAndWarn(log, "Default character encoding is " +
encodingDisplayName +
+ ". Specify UTF-8 character encoding by setting
-Dfile.encoding=UTF-8 JVM parameter. " +
+ "Differing character encodings across cluster may lead to
erratic behavior.");
+ }
+ }
+
+ /**
* Checks whether physical RAM is not exceeded.
*/
@SuppressWarnings("ConstantConditions")
diff --git
a/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CommandLineTransformer.java
b/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CommandLineTransformer.java
index f4aad17..e449bfa 100644
---
a/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CommandLineTransformer.java
+++
b/modules/core/src/main/java/org/apache/ignite/startup/cmdline/CommandLineTransformer.java
@@ -204,10 +204,15 @@ public class CommandLineTransformer {
* @param args Collection of unknown (from JCommander point of view)
arguments.
*/
private void parseJvmOptionsAndSpringConfig(Iterable<String> args) {
+ boolean hadFileEncoding = false;
+
for (String arg : args) {
if (arg.startsWith(JVM_OPTION_PREFIX)) {
String jvmOpt = arg.substring(JVM_OPTION_PREFIX.length());
+ if (jvmOpt.startsWith("-Dfile.encoding="))
+ hadFileEncoding = true;
+
if (!checkJVMOptionIsSupported(jvmOpt))
throw new RuntimeException(JVM_OPTION_PREFIX + " JVM
parameters for Ignite batch scripts " +
"with double quotes are not supported. " +
@@ -222,6 +227,9 @@ public class CommandLineTransformer {
throw new RuntimeException("Unrecognised parameter has
been found: " + arg);
}
}
+
+ if (!hadFileEncoding)
+ jvmOptions = (jvmOptions.isEmpty() ? "" : (jvmOptions + " ")) +
"-Dfile.encoding=UTF-8";
}
/**
@@ -234,4 +242,4 @@ public class CommandLineTransformer {
private boolean checkJVMOptionIsSupported(String jvmOpt) {
return !(jvmOpt.contains("-XX:OnError") ||
jvmOpt.contains("-XX:OnOutOfMemoryError"));
}
-}
\ No newline at end of file
+}
diff --git
a/modules/core/src/test/java/org/apache/ignite/startup/cmdline/GridCommandLineTransformerSelfTest.java
b/modules/core/src/test/java/org/apache/ignite/startup/cmdline/GridCommandLineTransformerSelfTest.java
index d08ed6b..fbcb547 100644
---
a/modules/core/src/test/java/org/apache/ignite/startup/cmdline/GridCommandLineTransformerSelfTest.java
+++
b/modules/core/src/test/java/org/apache/ignite/startup/cmdline/GridCommandLineTransformerSelfTest.java
@@ -36,7 +36,7 @@ public class GridCommandLineTransformerSelfTest extends
GridCommonAbstractTest {
public void testTransformIfNoArguments() throws Exception {
assertEquals(
"\"INTERACTIVE=0\" \"QUIET=-DIGNITE_QUIET=true\" \"NO_PAUSE=0\" " +
- "\"NO_JMX=0\" \"JVM_XOPTS=\" \"CONFIG=\"",
+ "\"NO_JMX=0\" \"JVM_XOPTS=-Dfile.encoding=UTF-8\" \"CONFIG=\"",
CommandLineTransformer.transform());
}
@@ -111,7 +111,7 @@ public class GridCommandLineTransformerSelfTest extends
GridCommonAbstractTest {
public void testTransformIfOnlyPathToConfigSpecified() throws Exception {
assertEquals(
"\"INTERACTIVE=0\" \"QUIET=-DIGNITE_QUIET=true\" \"NO_PAUSE=0\"
\"NO_JMX=0\" " +
- "\"JVM_XOPTS=\" \"CONFIG=c:\\qw.xml\"",
+ "\"JVM_XOPTS=-Dfile.encoding=UTF-8\" \"CONFIG=c:\\qw.xml\"",
CommandLineTransformer.transform("c:\\qw.xml"));
}
@@ -122,7 +122,7 @@ public class GridCommandLineTransformerSelfTest extends
GridCommonAbstractTest {
public void testTransformIfAllSupportedArguments() throws Exception {
assertEquals(
"\"INTERACTIVE=1\" \"QUIET=-DIGNITE_QUIET=false\" \"NO_PAUSE=1\"
\"NO_JMX=1\" " +
- "\"JVM_XOPTS=-Xmx1g -Xms1m\" " +
+ "\"JVM_XOPTS=-Xmx1g -Xms1m -Dfile.encoding=UTF-8\" " +
"\"CONFIG=\"c:\\path to\\русский каталог\"\"",
CommandLineTransformer.transform("-i", "-np", "-v", "-J-Xmx1g",
"-J-Xms1m", "-nojmx",
"\"c:\\path to\\русский каталог\""));
diff --git a/modules/platforms/cpp/core/src/ignition.cpp
b/modules/platforms/cpp/core/src/ignition.cpp
index 7d90a52..3891be1 100644
--- a/modules/platforms/cpp/core/src/ignition.cpp
+++ b/modules/platforms/cpp/core/src/ignition.cpp
@@ -111,6 +111,10 @@ namespace ignite
int idx = 0;
+ std::string fileEncParam = "-Dfile.encoding=";
+
+ bool hadFileEnc = false;
+
// 1. Set classpath.
std::string cpFull = "-Djava.class.path=" + cp;
@@ -131,8 +135,19 @@ namespace ignite
opts[idx++] = CopyChars(xmxStr.c_str());
// 4. Set the rest options.
- for (std::list<std::string>::const_iterator i =
cfg.jvmOpts.begin(); i != cfg.jvmOpts.end(); ++i)
+ for (std::list<std::string>::const_iterator i =
cfg.jvmOpts.begin(); i != cfg.jvmOpts.end(); ++i) {
+ if (i->find(fileEncParam) != std::string::npos)
+ hadFileEnc = true;
+
opts[idx++] = CopyChars(i->c_str());
+ }
+
+ // 5. Set file.encoding.
+ if (!hadFileEnc) {
+ std::string fileEncFull = fileEncParam + "UTF-8";
+
+ opts[idx++] = CopyChars(fileEncFull.c_str());
+ }
}
/**
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteManager.cs
b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteManager.cs
index 47260a7..e2a4b9f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteManager.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteManager.cs
@@ -40,6 +40,9 @@ namespace Apache.Ignite.Core.Impl
/** Java Command line argument: Xmx. Case sensitive. */
private const string CmdJvmMaxMemJava = "-Xmx";
+ /** Java Command line argument: file.encoding. Case sensitive. */
+ private const string CmdJvmFileEncoding = "-Dfile.encoding=";
+
/** Monitor for DLL load synchronization. */
private static readonly object SyncRoot = new object();
@@ -93,7 +96,7 @@ namespace Apache.Ignite.Core.Impl
return cbs;
}
}
-
+
/// <summary>
/// Memory manager attached to currently running JVM.
/// </summary>
@@ -141,6 +144,9 @@ namespace Apache.Ignite.Core.Impl
cfg.JvmMaxMemoryMb != IgniteConfiguration.DefaultJvmMaxMem)
jvmOpts.Add(string.Format(CultureInfo.InvariantCulture,
"{0}{1}m", CmdJvmMaxMemJava, cfg.JvmMaxMemoryMb));
+ if (!jvmOpts.Any(opt => opt.StartsWith(CmdJvmFileEncoding,
StringComparison.Ordinal)))
+ jvmOpts.Add(string.Format(CultureInfo.InvariantCulture,
"{0}UTF-8", CmdJvmFileEncoding));
+
return jvmOpts;
}