puzzling exception in DataRowStore

From: Bryan Lewis (brya..aine.rr.com)
Date: Tue Jun 06 2006 - 11:40:58 EDT

  • Next message: Andrus Adamchik: "Re: very, very serious problem - null values where objects should be"

    We got a scary exception yesterday on our production server. I have no
    good reason to think it's a cayenne issue but we're looking at several
    possibilities. I thought I'd mention it here in case it rang a bell
    with someone. Restarting our app server resolved the problem and it
    hasn't come back today. The cayenne version was 1.2B3. There were no
    changes on that server for a couple of weeks.

    The first exception report (of 56, until I stopped the server) and the
    most common was the following, on a fairly routine SelectQuery:

     java.lang.NullPointerException
     org.apache.commons.collections.map.LRUMap.reuseMapping(LRUMap.java:272)
     org.apache.commons.collections.map.LRUMap.addMapping(LRUMap.java:243)
     org.apache.commons.collections.map.AbstractHashedMap.put(AbstractHashedMap.java:282)
     org.objectstyle.cayenne.access.DataRowStore.processUpdatedSnapshots(DataRowStore.java:537)
     org.objectstyle.cayenne.access.DataRowStore.processSnapshotChanges(DataRowStore.java:496)
     org.objectstyle.cayenne.access.ObjectStore.snapshotsUpdatedForObjects(ObjectStore.java:556)
     org.objectstyle.cayenne.access.ObjectResolver.objectsFromDataRows(ObjectResolver.java:162)
     org.objectstyle.cayenne.access.ObjectResolver.synchronizedObjectsFromDataRows(ObjectResolver.java:137)

     org.objectstyle.cayenne.access.DataDomainQueryAction.interceptObjectConversion(DataDomainQueryAction.java:373)
     org.objectstyle.cayenne.access.DataDomainQueryAction.execute(DataDomainQueryAction.java:151)
     org.objectstyle.cayenne.access.DataDomain.onQuery(DataDomain.java:765)
     org.objectstyle.cayenne.util.ObjectContextQueryAction.runQuery(ObjectContextQueryAction.java:253)
     org.objectstyle.cayenne.access.DataContextQueryAction.execute(DataContextQueryAction.java:90)
     org.objectstyle.cayenne.access.DataContext.onQuery(DataContext.java:1422)
     org.objectstyle.cayenne.access.DataContext.performQuery(DataContext.java:1411)

    The line in DataRowStore was:

                    DataRow oldSnapshot = (DataRow) snapshots.put(key,
    newSnapshot);

    That called a method in commons.collections.map.LRUMap:

        protected void reuseMapping(LinkEntry entry, int hashIndex, int
    hashCode, Object key, Object value) {
            // find the entry before the entry specified in the hash table
            int removeIndex = hashIndex(entry.hashCode, data.length);
            HashEntry loop = data[removeIndex];
            HashEntry previous = null;
            while (loop != entry) {
                previous = loop;
                loop = loop.next; // line 272
            }

    I guess this says the LRUMap was corrupted somehow. A HashEntry had a
    null 'next' pointer. Seems like something that couldn't happen, eh?. I
    suppose a cosmic ray could've zapped a memory cell.

    Any thoughts?



    This archive was generated by hypermail 2.0.0 : Tue Jun 06 2006 - 11:41:27 EDT