Re: IllegalStateException in DataRowStore (thrown by LRUMap)

From: Lothar Krenzien (lkrenzie..eb.de)
Date: Mon Jun 19 2006 - 06:17:22 EDT

  • Next message: Tomi NA: "Re: modifying relationship list"

    Hi Andrus,

    thanks for your effort. The IllegalStateException occured (for me) only after synchronzied all methods that uses the LRUMap and with Apache Commons 3.2. After changed back to 3.1 I can't reproduce it. But as I mentioned earlier I get lots (!) of NPE in LRU map. The problem is, that we get this error only after a while when the server is under heavy load. Our application is a struts based application with a JSP / HTML frontend and Tomcat 5.5.15. Additionally there are two servlets for importing data in the database (MSSQL 2000).

    I posted the exception also in the apache commons group. So here's there answer. As I understood it could be synchronizing problem or a problem with immutable keys. Maybe it helps you.

    --------------------------------------------------------------------------------------------------------------------------------------------------------
    Can you also check all loops of the map are synchronized correctly:

    synchronied (map) {
    Iterator it = mpap.keySet().iterator();
    while (it.hasNext()) {
    ..
    }
    }

    and so on. The synchronized MUST be around the whole looping.

    Stephen

    > Hi there,
    >
    > we used Version 3.2 and synchronized all access to LRUMap. WE get this IllegalStateException. Can you reproduce this behauviour?
    >
    >
    >
    >
    >
    > 2006-06-14 00:26:22,359 [ERROR] BaseDataLoggerGate.com.sunreader.sr2.gate.BaseDataLoggerGate.doPost: >
    > java.lang.IllegalStateException: Entry.next=null, data[removeIndex]=<ObjectId:TblStatusstatus=ins>=org.objectstyle.cayenne.DataRo..f1d2ce[values={description=inserted, status=ins}, version=-9223372036854491432, replaces=-9223372036854775808] previous=<ObjectId:TblEffBlockDataeffBlockDataId=24455598>=org.objectstyle.cayenne.DataRo..bac35[values={tempValue=31.35, efficiencyValue=1.0761, effBlockDataId=24455598, energyValue=8.16, efficiencyBlockId=767, status=ins, irradiationValue=673.98, earnings=4.4064, importEffBlockDataId=1042169, dataDate=Mon Jun 12 11:30:00 CEST 2006, co2Saving=6.12}, version=-9223372036854494908, replaces=-9223372036854495032] key=<ObjectId:TblLoggerloggerId=923> value=org.objectstyle.cayenne.DataRo..a87890[values={plantId=923, newSerialNumber=null, commChannelType=analog, loggerProductId=1, loggerId=923, serialNumber=DL-NE101-01331, commChannelManufacturer=Conergy}, version=-9223372036854491407, replaces=-9223372036854775808] size=10000 maxSize=1000
    0
    > Please check that your keys are immutable, and that you have used synchronization properly. If so, then please report this to commons-de..akarta.apache.org as a bug.
    > at org.apache.commons.collections.map.LRUMap.reuseMapping(LRUMap.java:300)
    > at org.apache.commons.collections.map.LRUMap.addMapping(LRUMap.java:266)
    > at org.apache.commons.collections.map.AbstractHashedMap.put(AbstractHashedMap.java:283)
    > at org.objectstyle.cayenne.access.DataRowStore.processUpdatedSnapshots(DataRowStore.java:621)
    > at org.objectstyle.cayenne.access.DataRowStore.processSnapshotChanges(DataRowStore.java:575)
    > at org.objectstyle.cayenne.access.DataRowStore.snapshotsUpdatedForObjects(DataRowStore.java:314)
    > at org.objectstyle.cayenne.access.ObjectResolver.objectsFromDataRows(ObjectResolver.java:159)
    > at org.objectstyle.cayenne.access.ObjectResolver.synchronizedObjectsFromDataRows(ObjectResolver.java:134)
    > at org.objectstyle.cayenne.access.DataDomainQueryAction.interceptObjectConversion(DataDomainQueryAction.java:375)
    > at org.objectstyle.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:151)
    > at org.objectstyle.cayenne.access.DataDomain.onQuery(DataDomain.java:765)
    > at org.objectstyle.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:253)
    > at org.objectstyle.cayenne.access.DataContextQueryAction.execute(DataContextQueryAction.java:90)
    > at org.objectstyle.cayenne.access.DataContext.onQuery(DataContext.java:1422)
    > at org.objectstyle.cayenne.access.DataContext.performQuery(DataContext.java:1411)
    > at com.sunreader.sr2.back.dao.ProductDAO.isLoggerAlreadyAvailable(Unknown Source)
    >
    >
    > Thanks a lot,
    >
    >
    >
    >
    > After extensive testing, we can only reproduce this when the map has not
    > been correctly synchronized, or a mutable key has been used (as opposed
    > to an immutable one).
    >
    > If you upgrade to collections v3.2 you will get extra logging which may
    > help diagnose the problem.
    >
    > Stephen
    >
    >
    >>Hi all,
    >>
    >>I am working with Cayenne and I ´ve get the following Exception:
    >>
    >>Caused by: java.lang.NullPointerException
    >> at org.apache.commons.collections.map.LRUMap.reuseMapping(LRUMap.java:272)
    >> at org.apache.commons.collections.map.LRUMap.addMapping(LRUMap.java:243)
    >> at org.apache.commons.collections.map.AbstractHashedMap.put(AbstractHashedMap.java:282)
    >> at org.objectstyle.cayenne.access.DataRowStore.processUpdatedSnapshots(DataRowStore.java:621)
    >> at org.objectstyle.cayenne.access.DataRowStore.processSnapshotChanges(DataRowStore.java:575)
    >> at org.objectstyle.cayenne.access.DataRowStore.snapshotsUpdatedForObjects(DataRowStore.java:314)
    >> at org.objectstyle.cayenne.access.ObjectResolver.objectsFromDataRows(ObjectResolver.java:159)
    >> at org.objectstyle.cayenne.access.ObjectResolver.synchronizedObjectsFromDataRows(ObjectResolver.java:134)
    >> at org.objectstyle.cayenne.access.DataDomainQueryAction.interceptObjectConversion(DataDomainQueryAction.java:375)
    >> at org.objectstyle.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:151)
    >> at org.objectstyle.cayenne.access.DataDomain.onQuery(DataDomain.java:765)
    >> at org.objectstyle.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:253)
    >> at org.objectstyle.cayenne.access.DataContextQueryAction.execute(DataContextQueryAction.java:90)
    >> at org.objectstyle.cayenne.access.DataContext.onQuery(DataContext.java:1422)
    >> at org.objectstyle.cayenne.access.DataContext.performQuery(DataContext.java:1411)
    >> at org.objectstyle.cayenne.access.DataContextFaults$ToOneFault.doResolveFault(DataContextFaults.java:144)
    >> at org.objectstyle.cayenne.access.DataContextFaults$ToOneFault.resolveFault(DataContextFaults.java:117)
    >> at org.objectstyle.cayenne.CayenneDataObject.readProperty(CayenneDataObject.java:245)
    >> at com.sunreader.sr2.back.auto._TblAccount.getTblPerson(Unknown Source)
    >> at com.sunreader.sr2.back.dao.UserDAO.setAccountPersonData(Unknown Source)
    >>
    >>
    >>We have posted this exception in cayenne newsgroup before and we found out, that the
    >
    > caller of LRUMap is responsible for the thread safety. We´ve changed some methods calls in
    > caeynne temporarily, but we still get this exception. Could anyone help us and tell, waht
    > was going wrong here?
    >
    >>We using commons-collection v.3.1
    >>
    >>This behauvior occurs when the machine is under heavy load and a lot threads access are
    >
    > created.
    >
    >>Thanks in advance,
    >>
    >

    > -----Ursprüngliche Nachricht-----
    > Von: cayenne-use..ncubator.apache.org
    > Gesendet: 19.06.06 11:03:45
    > An: cayenne-use..ncubator.apache.org
    > Betreff: Re: IllegalStateException in DataRowStore (thrown by LRUMap)

    > I did some research of CAY-565 over the weekend. Unfortunately I
    > can't reproduce the issue.
    >
    > I wrote a test case that randomly performs one of the operations -
    > select; insert of an object with relationship; object update; object
    > delete with relationship. Running up to 30 parallel request threads
    > with JMeter, I don't see any exceptions except for occasional fault
    > failures (that are expected under these test conditions as I don't
    > lock the objects). I even found and fixed an unrelated deadlock that
    > I am sure nobody has ever seen in the wild (CAY-573)... still can't
    > reproduce the LRUMap problem.
    >
    > I'll try to change the test conditions, but if Bryan or Lothar (two
    > people who have experienced the issue) have any more insights on the
    > ways to reproduce it, please share.
    >
    > Andrus
    >
    >
    > On Jun 16, 2006, at 1:27 PM, Andrus Adamchik wrote:
    > > On Jun 16, 2006, at 1:12 PM, Lothar Krenzien wrote:
    > >
    > >> I did it yesterday and now I'm getting the already known NPE
    > >> again. And I'm sure that I didn't changed the cayenne version. But
    > >> what I saw is that in the case of NPE always the same method of me
    > >> is called.
    > >
    > > Very very strange... so this would confirm a suspicion that there
    > > is a bug in the LRUMap not related to synchronization.
    > >
    > >
    > >> Another question :
    > >> I have a class which is extended from 'WebApplicationListener'. In
    > >> the method 'sessionDestroyed' the following code is executed :
    > >>
    > >> ObjectStore objectStore = dctx.getObjectStore();
    > >> objectStore.objectsInvalidated(objectStore.getObjects());
    > >>
    > >> It that really neccessary ?
    > >
    > > It may or may not be useful. On the one hand, the ObjectStore is
    > > about to go out of scope at this point, so it (and all its objects)
    > > will be garbage collected without any extra help.
    > >
    > > One other thing that invalidate does is throwing away cached
    > > snapshots from the cache shared by other sessions. On the positive
    > > side it frees up some memory, on the negative - it removes items
    > > from cache that could've otherwise speed up object resolution in
    > > other sessions.
    > >
    > > I'd say keep it if your sessions share just a few objects between
    > > each other or share no objects at all; throw it away if the object
    > > sets significantly overlap between individual sessions.
    > >
    > > Andrus
    > >
    >

    _____________________________________________________________________
    Der WEB.DE SmartSurfer hilft bis zu 70% Ihrer Onlinekosten zu sparen!
    http://smartsurfer.web.de/?mc=100071&distributionid=000000000071



    This archive was generated by hypermail 2.0.0 : Mon Jun 19 2006 - 07:00:08 EDT