[ https://issues.apache.org/jira/browse/SLING-6584?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Vlad Bailescu updated SLING-6584: --------------------------------- Attachment: SLING-6584.test.patch > Race condition in ModelAdapterFactory > ------------------------------------- > > Key: SLING-6584 > URL: https://issues.apache.org/jira/browse/SLING-6584 > Project: Sling > Issue Type: Bug > Components: Extensions > Affects Versions: Sling Models Impl 1.3.8 > Reporter: Vlad Bailescu > Priority: Critical > Fix For: Sling Models Impl 1.3.10 > > Attachments: SLING-6584.test.patch > > > There is a possible race condition in > https://github.com/apache/sling/blob/trunk/bundles/extensions/models/impl/src/main/java/org/apache/sling/models/impl/ModelAdapterFactory.java#L807-L815 > when two threads are trying to inject the same field, resulting in model not > being constructed. > {code} > try { > if (!accessible) { > field.setAccessible(true); > } > field.set(createdObject, result.getValue()); > } catch (Exception e) { > return new ModelClassException("Could not inject field due to reflection > issues", e); > } finally { > if (!accessible) { > field.setAccessible(false); > } > } > {code} > This is exposed by the unit test attached: > {code} > org.apache.sling.models.impl.ModelAdapterFactory - Could not adapt to model > org.apache.sling.models.factory.MissingElementsException: Could not inject > all required fields into class > org.apache.sling.models.testmodels.classes.WithOneConstructorModel > at > org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:593) > at > org.apache.sling.models.impl.ModelAdapterFactory.internalCreateModel(ModelAdapterFactory.java:335) > at > org.apache.sling.models.impl.ModelAdapterFactory.getAdapter(ModelAdapterFactory.java:211) > at > org.apache.sling.models.impl.ConstructorTest$1ModelCreator.call(ConstructorTest.java:153) > at > org.apache.sling.models.impl.ConstructorTest$1ModelCreator.call(ConstructorTest.java:149) > at java.util.concurrent.FutureTask.run(FutureTask.java:266) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) > at java.lang.Thread.run(Thread.java:745) > Suppressed: org.apache.sling.models.factory.MissingElementException: > Could not inject private int > org.apache.sling.models.testmodels.classes.WithOneConstructorModel.attribute > at > org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:598) > ... 8 more > Caused by: org.apache.sling.models.factory.ModelClassException: Could > not inject field due to reflection issues > at > org.apache.sling.models.impl.ModelAdapterFactory.setField(ModelAdapterFactory.java:812) > at > org.apache.sling.models.impl.ModelAdapterFactory.access$100(ModelAdapterFactory.java:112) > at > org.apache.sling.models.impl.ModelAdapterFactory$SetFieldCallback.inject(ModelAdapterFactory.java:378) > at > org.apache.sling.models.impl.ModelAdapterFactory.injectElement(ModelAdapterFactory.java:473) > at > org.apache.sling.models.impl.ModelAdapterFactory.createObject(ModelAdapterFactory.java:596) > ... 8 more > Caused by: java.lang.IllegalAccessException: Class > org.apache.sling.models.impl.ModelAdapterFactory can not access a member of > class org.apache.sling.models.testmodels.classes.WithOneConstructorModel with > modifiers "private" > at > sun.reflect.Reflection.ensureMemberAccess(Reflection.java:101) > at > java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:295) > at > java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:287) > at java.lang.reflect.Field.set(Field.java:755) > at > org.apache.sling.models.impl.ModelAdapterFactory.setField(ModelAdapterFactory.java:810) > ... 12 more > {code} -- This message was sent by Atlassian JIRA (v6.3.15#6346)