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