Mikhail Petrov created IGNITE-16068:
---------------------------------------
Summary: Operations hang with different node character encoding
and authentication enabled.
Key: IGNITE-16068
URL: https://issues.apache.org/jira/browse/IGNITE-16068
Project: Ignite
Issue Type: Bug
Reporter: Mikhail Petrov
Reproducer:
{code:java}
/** */
public class AuthenticatorMultiJvmEncodingTest extends GridCommonAbstractTest {
/** Character encoding name that will be applied to the next Ignite process
start. */
private String jvmCharacterEncoding;
/** {@inheritDoc} */
@Override protected IgniteConfiguration getConfiguration(String
igniteInstanceName) throws Exception {
IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
cfg.setAuthenticationEnabled(true);
cfg.setDataStorageConfiguration(new DataStorageConfiguration()
.setDefaultDataRegionConfiguration(new DataRegionConfiguration()
.setMaxSize(100 * (1 << 20))
.setPersistenceEnabled(true)));
return cfg;
}
/** {@inheritDoc} */
@Override protected List<String> additionalRemoteJvmArgs() {
List<String> args = super.additionalRemoteJvmArgs();
args.add("-Dfile.encoding=" + jvmCharacterEncoding);
return args;
}
/** {@inheritDoc} */
@Override protected boolean isRemoteJvm(String igniteInstanceName) {
return getTestIgniteInstanceIndex(igniteInstanceName) != 0;
}
/** {@inheritDoc} */
@Override protected void beforeTest() throws Exception {
super.beforeTest();
cleanPersistenceDir();
}
/** */
@Test
public void testMultipleJvmInstancesWithDifferentEncoding() throws
Exception {
startGrid(0);
jvmCharacterEncoding = "Big5";
startGrid(1);
jvmCharacterEncoding = "UTF-8";
startGrid(2);
grid(0).cluster().state(ACTIVE);
grid(0).createCache(DEFAULT_CACHE_NAME);
String login = "語";
String pwd = "語";
try (AutoCloseable ignored =
withSecurityContextOnAllNodes(authenticate(grid(0), "ignite", "ignite"))) {
grid(0).context().security().createUser(login, pwd.toCharArray());
}
try (
IgniteClient cli = Ignition.startClient(new
ClientConfiguration().setAddresses("127.0.0.1:10800")
.setUserName(login)
.setUserPassword(pwd))
) {
ClientCache<Integer, Integer> cache = cli.cache(DEFAULT_CACHE_NAME);
Map<Integer, Integer> entries = new HashMap<>();
for (int i = 0; i < 1000; i++)
entries.put(i, i);
cache.putAll(entries);
}
}
}
{code}
Exception on server node before hanging:
{code:java}
java.lang.IllegalStateException: Failed to find security context for subject
with given ID : c950cc94-38f1-304d-b858-2aa6e9478357
[2021-12-06 23:24:10,507][INFO ][Thread-2][jvm-5950cce2] at
org.apache.ignite.internal.processors.security.IgniteSecurityProcessor.withContext(IgniteSecurityProcessor.java:167)
[2021-12-06 23:24:10,507][INFO ][Thread-2][jvm-5950cce2] at
org.apache.ignite.internal.managers.communication.GridIoManager.invokeListener(GridIoManager.java:1906)
[2021-12-06 23:24:10,507][INFO ][Thread-2][jvm-5950cce2] at
org.apache.ignite.internal.managers.communication.GridIoManager.processRegularMessage0(GridIoManager.java:1528)
[2021-12-06 23:24:10,507][INFO ][Thread-2][jvm-5950cce2] at
org.apache.ignite.internal.managers.communication.GridIoManager.access$5300(GridIoManager.java:242)
[2021-12-06 23:24:10,507][INFO ][Thread-2][jvm-5950cce2] at
org.apache.ignite.internal.managers.communication.GridIoManager$9.execute(GridIoManager.java:1421)
[2021-12-06 23:24:10,507][INFO ][Thread-2][jvm-5950cce2] at
org.apache.ignite.internal.managers.communication.TraceRunnable.run(TraceRunnable.java:55)
[2021-12-06 23:24:10,507][INFO ][Thread-2][jvm-5950cce2] at
org.apache.ignite.internal.util.StripedExecutor$Stripe.body(StripedExecutor.java:569)
[2021-12-06 23:24:10,507][INFO ][Thread-2][jvm-5950cce2] at
org.apache.ignite.internal.util.worker.GridWorker.run(GridWorker.java:125)
[2021-12-06 23:24:10,507][INFO ][Thread-2][jvm-5950cce2] at
java.lang.Thread.run(Thread.java:748)
{code}
The main reason of described above behavior is that
IgniteAuthenticatorProcessor uses default JVM character encoding when
calculating security subject ID. So different nodes can add the same user with
different IDs if they are running in JVMS with different default characters
encoding. As a result user can not be found during operations that involve
multiple nodes.
--
This message was sent by Atlassian Jira
(v8.20.1#820001)