[ https://issues.apache.org/jira/browse/IGNITE-8547?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Ilya Kasnacheev updated IGNITE-8547: ------------------------------------ Description: Due to the following problem: {code} package jvmtest; import java.util.ArrayList; import java.util.List; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class LegTypeTest { public static void main(String[] args) throws InterruptedException, BrokenBarrierException { List<Thread> threadList = new ArrayList<>(); CyclicBarrier b1 = new CyclicBarrier(16); CyclicBarrier b2 = new CyclicBarrier(17); for (int i = 0; i < 16; i++) { final int ii = i; Thread thread = new Thread(() -> { try { b1.await(); if (ii % 2 == 0) Class.forName("jvmtest.LegTypeTest$E$1"); if (ii % 2 == 1) Class.forName("jvmtest.LegTypeTest$E"); b2.await(); } catch (Exception e) { e.printStackTrace(); } }); thread.start(); threadList.add(thread); } b2.await(); for (Thread thread : threadList) { thread.join(); } } private enum E { A("A"), B("B") { @Override public String virtual() { return null; } }; private String displayString; E(String displayString) { this.displayString = displayString; } public String virtual() { return displayString; } } } {code} When doing Class.forName on different enum values deadlock can be caused. And that's exactly what OptimizedMarshaller does. See also the attached test. was: Due to the following problem: {code} package jvmtest; import java.util.ArrayList; import java.util.List; import java.util.concurrent.BrokenBarrierException; import java.util.concurrent.CyclicBarrier; public class LegTypeTest { public static void main(String[] args) throws InterruptedException, BrokenBarrierException { List<Thread> threadList = new ArrayList<>(); CyclicBarrier b1 = new CyclicBarrier(16); CyclicBarrier b2 = new CyclicBarrier(17); for (int i = 0; i < 16; i++) { final int ii = i; Thread thread = new Thread(() -> { try { b1.await(); if (ii % 2 == 0) Class.forName("jvmtest.LegTypeTest$E$1"); if (ii % 2 == 1) Class.forName("jvmtest.LegTypeTest$E"); b2.await(); } catch (Exception e) { e.printStackTrace(); } }); thread.start(); threadList.add(thread); } b2.await(); for (Thread thread : threadList) { thread.join(); } } private enum E { A("A"), B("B") { @Override public String virtual() { return null; } }; private String displayString; E(String displayString) { this.displayString = displayString; } public String virtual() { return displayString; } } } {code} When doing Class.forName on different enum values deadlock can be caused. And that's exactly what OptimizedMarshaller does. See also the attached test. > Deserialization of Enum values as anonymous classes may cause deadlock > ---------------------------------------------------------------------- > > Key: IGNITE-8547 > URL: https://issues.apache.org/jira/browse/IGNITE-8547 > Project: Ignite > Issue Type: Bug > Affects Versions: 1.9 > Reporter: Ilya Kasnacheev > Assignee: Ilya Kasnacheev > Priority: Major > Attachments: MarshallerDeadlockMultiJvmTest.java > > > Due to the following problem: > {code} > package jvmtest; > import java.util.ArrayList; > import java.util.List; > import java.util.concurrent.BrokenBarrierException; > import java.util.concurrent.CyclicBarrier; > public class LegTypeTest { > public static void main(String[] args) throws InterruptedException, > BrokenBarrierException { > List<Thread> threadList = new ArrayList<>(); > CyclicBarrier b1 = new CyclicBarrier(16); > CyclicBarrier b2 = new CyclicBarrier(17); > for (int i = 0; i < 16; i++) { > final int ii = i; > Thread thread = new Thread(() -> { > try { > b1.await(); > if (ii % 2 == 0) > Class.forName("jvmtest.LegTypeTest$E$1"); > if (ii % 2 == 1) > Class.forName("jvmtest.LegTypeTest$E"); > b2.await(); > } catch (Exception e) { > e.printStackTrace(); > } > }); > thread.start(); > threadList.add(thread); > } > b2.await(); > for (Thread thread : threadList) { > thread.join(); > } > } > private enum E { > A("A"), > B("B") { > @Override > public String virtual() { > return null; > } > }; > private String displayString; > E(String displayString) { > this.displayString = displayString; > } > public String virtual() { > return displayString; > } > } > } > {code} > When doing Class.forName on different enum values deadlock can be caused. And > that's exactly what OptimizedMarshaller does. > See also the attached test. -- This message was sent by Atlassian JIRA (v7.6.3#76005)