cayenne-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Andrus Adamchik (JIRA)" <j...@apache.org>
Subject [jira] [Updated] (CAY-2096) Potential race condition resolving hollow object
Date Fri, 05 Aug 2016 08:08:21 GMT

     [ https://issues.apache.org/jira/browse/CAY-2096?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]

Andrus Adamchik updated CAY-2096:
---------------------------------
    Description: 
This was reported by one of the users. When reading properties of a HOLLOW object, the following
exception is thrown:

Caused by: org.apache.cayenne.FaultFailureException: [v.3.1 Sep 20 2014 14:06:21] Error resolving
fault for ObjectId: <ObjectId:MyObject, id=12345> and state (hollow). Possible cause
- matching row is missing from the database.
        at org.apache.cayenne.BaseContext.prepareForAccess(BaseContext.java:226)
        at org.apache.cayenne.CayenneDataObject.readProperty(CayenneDataObject.java:180)

Note that this exception is not really FaultFailure, as the data was returned from the DB,
but the object still remained HOLLOW at the point where the exception is thrown. While researching
the issue, we noticed that the object is reset to hollow from a Cayenne event thread while
processing incoming SnapshotEvents. Presumably inside DataRowUtils.refreshObjectWithSnapshot
.. So this is a race condition between the thread reading object properties and event thread.
(This is why I hate snapshot events!)

One possible solution would be to check for HOLLOW status and retry resolving the object N
times (essentially optimistic approach instead of locking big chunks of code). 

But first we need to understand what types of SnapshotEvents actually turn object into the
HOLLOW state. I don't think this happens under normal circumstances.

  was:
This was reported by one of the users. When reading properties of a HOLLOW object, the following
exception is thrown:

Caused by: org.apache.cayenne.FaultFailureException: [v.3.1 Sep 20 2014 14:06:21] Error resolving
fault for ObjectId: <ObjectId:MyObject, id=12345> and state (hollow). Possible cause
- matching row is missing from the database.
        at org.apache.cayenne.BaseContext.prepareForAccess(BaseContext.java:226)
        at org.apache.cayenne.CayenneDataObject.readProperty(CayenneDataObject.java:180)

Note that this exception is not really FaultFailure, as the data was returned from the DB,
but the object still remained HOLLOW at the point where the exception is thrown. While researching
the issue, we noticed that the object is reset to hollow via a Cayenne event thread. Presumably
inside DataRowUtils.refreshObjectWithSnapshot .. So this is a race condition between the thread
reading object properties and event thread. (This is why I hate snapshot events!)

One possible solution would be to check for HOLLOW status and retry resolving the object N
times (essentially optimistic approach instead of locking big chunks of code). 

But first we need to understand what types of SnapshotEvents actually turn object into the
HOLLOW state. I don't think this happens under normal circumstances.


> Potential race condition resolving hollow object
> ------------------------------------------------
>
>                 Key: CAY-2096
>                 URL: https://issues.apache.org/jira/browse/CAY-2096
>             Project: Cayenne
>          Issue Type: Bug
>    Affects Versions: 3.1
>            Reporter: Andrus Adamchik
>            Assignee: Andrus Adamchik
>
> This was reported by one of the users. When reading properties of a HOLLOW object, the
following exception is thrown:
> Caused by: org.apache.cayenne.FaultFailureException: [v.3.1 Sep 20 2014 14:06:21] Error
resolving fault for ObjectId: <ObjectId:MyObject, id=12345> and state (hollow). Possible
cause - matching row is missing from the database.
>         at org.apache.cayenne.BaseContext.prepareForAccess(BaseContext.java:226)
>         at org.apache.cayenne.CayenneDataObject.readProperty(CayenneDataObject.java:180)
> Note that this exception is not really FaultFailure, as the data was returned from the
DB, but the object still remained HOLLOW at the point where the exception is thrown. While
researching the issue, we noticed that the object is reset to hollow from a Cayenne event
thread while processing incoming SnapshotEvents. Presumably inside DataRowUtils.refreshObjectWithSnapshot
.. So this is a race condition between the thread reading object properties and event thread.
(This is why I hate snapshot events!)
> One possible solution would be to check for HOLLOW status and retry resolving the object
N times (essentially optimistic approach instead of locking big chunks of code). 
> But first we need to understand what types of SnapshotEvents actually turn object into
the HOLLOW state. I don't think this happens under normal circumstances.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message