[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [List Home]
Re: [eclipselink-users] PersistenceProvider.createEntityManagerFactory() not work correctly when emSetupImpl.isUndeployed() returns true

Sorry.
I posted this bug.
https://bugs.eclipse.org/bugs/show_bug.cgi?id=396887

Thank you.


> Please log a bug in https://bugs.eclipse.org/bugs/
> 
> Eclipselink is under RT
> On 12/18/2012 7:22 PM, tech-ml@xxxxxxxxxx wrote:
> >
> > Thanks for reply.
> >
> > I'm sorry for the late reply.
> > I want to register now the bug.
> >
> > I'm grateful for your work.
> > Thanks.
> > --
> > TH
> > tech-ml@xxxxxxxxxx
> >
> >
> >> Please log a bug.
> >> Thanks a lot for finding the bug and suggesting the right solution,
> >> Andrei
> >>
> >> On 12/13/2012 8:39 PM, tech-ml@xxxxxxxxxx wrote:
> >>>
> >>> Hello Tom,
> >>>
> >>> I received following Exception:
> >>> Exception Description: Unable to predeploy PersistenceUnit [fooPU] in invalid state [Undeployed]
> >>>           at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1101)
> >>>           at org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:131)
> >>>           at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
> >>>           at javax.persistence.Persistence.createEntityManagerFactory(Unknown Source)
> >>>           at my.source.MyMethod()
> >>>
> >>> I think that the original intention is made so that a UNDEPLOYED state may be followed by the Line.133 .
> >>> But emSetupImpl.predeploy() is throw Exception when emSetupImpl.isUndeployed()==true, and createEMF() is has passed while checking on Line.126 .
> >>> When I call EntityManager.close() from another thread between PersistenceProvider.createEntityManagerFactory():Line.95 and Line.125, this problem reappears.
> >>>
> >>> Thread A      EMF      Thread B
> >>>      |                       |
> >>> createEMF----->-           |
> >>>      |           |           |
> >>>      |           |<------createEMF()Line.95-111
> >>> EMF.close()--->-           |
> >>>                  x<------createEMF()Line.125-131
> >>>
> >>>
> >>> I know that it should call EntityManager.close() at the end of the application, I could not but do like this this time.
> >>>
> >>> Thanks.
> >>>
> >>>
> >>>> What is the PersistenceException you see?
> >>>>
> >>>> On 13/12/2012 1:52 AM, TH wrote:
> >>>>> Hello all,
> >>>>>
> >>>>> I am using EclipseLink 2.3.2.
> >>>>> When I call PersistenceProvider.createEntityManagerFactory(), A
> >>>>> PersistenceException occurs rarely.
> >>>>>
> >>>>> I think that there is a problem in the following parts.
> >>>>> in PersistenceProvider.createEntityManagerFactory():
> >>>>> [Line.123 of eclipselink-src-2.3.2.v20111125-r10461]
> >>>>> [Line.123 of eclipselink-src-2.3.3.v20120629-r11760]
> >>>>> [Line.123 of eclipselink-src-2.4.0.v20120608-r11652]
> >>>>>
> >>>>> // synchronized to prevent undeploying by other threads.
> >>>>> boolean undeployed = false;
> >>>>> synchronized(emSetupImpl) {
> >>>>>        if(emSetupImpl.isUndeployed()) {
> >>>>>            undeployed = true;
> >>>>>        }
> >>>>>        // emSetupImpl has been already predeployed, predeploy will just
> >>>>> increment factoryCount.
> >>>>>        emSetupImpl.predeploy(emSetupImpl.getPersistenceUnitInfo(),
> >>>>> nonNullProperties);
> >>>>> }
> >>>>> if(undeployed) {
> >>>>>        // after the emSetupImpl has been obtained from emSetupImpls
> >>>>>        // it has been undeployed by factory.close() in another thread - start
> >>>>> all over again.
> >>>>>        return createEntityManagerFactory(emName, properties);
> >>>>> }
> >>>>>
> >>>>>
> >>>>> I think if emSetupImpl.isUndeployed() is true, do not call
> >>>>> emSetupImpl.predeploy().
> >>>>> Considering processing UNDEPLOYED in the part under it,
> >>>>> I think that it should become the following code:
> >>>>>
> >>>>> synchronized(emSetupImpl) {
> >>>>>        if(emSetupImpl.isUndeployed()) {
> >>>>>            undeployed = true;
> >>>>>        } else {
> >>>>>            // emSetupImpl has been already predeployed, predeploy will just
> >>>>> increment factoryCount.
> >>>>>            emSetupImpl.predeploy(emSetupImpl.getPersistenceUnitInfo(),
> >>>>> nonNullProperties);
> >>>>>        }
> >>>>> }
> >>>>>
> >>>>>
> >>>>> What do you think?
> >>>>> Thanks.
> >>>>>
> >>>>> P.S: Sorry for my bad English.
> >>>>>
> >>>> _______________________________________________
> >>>> eclipselink-users mailing list
> >>>> eclipselink-users@xxxxxxxxxxx
> >>>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> >>>>
> >>> _______________________________________________
> >>> eclipselink-users mailing list
> >>> eclipselink-users@xxxxxxxxxxx
> >>> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> >> _______________________________________________
> >> eclipselink-users mailing list
> >> eclipselink-users@xxxxxxxxxxx
> >> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> >>
> > _______________________________________________
> > eclipselink-users mailing list
> > eclipselink-users@xxxxxxxxxxx
> > https://dev.eclipse.org/mailman/listinfo/eclipselink-users
> _______________________________________________
> eclipselink-users mailing list
> eclipselink-users@xxxxxxxxxxx
> https://dev.eclipse.org/mailman/listinfo/eclipselink-users
>