As Alice said, it gets couriouser and couriouser.

On 27. 11. 2014, at 18:35, OC <[email protected]> wrote:
> 30-odd objects simply disappeared, just like that. At one moment, I've 
> started getting "databaseContextFailedToFetchObject" callbacks, and when I 
> checked, the offending objects indeed did not exist -- whilst the FKs from 
> other objects did (and caused those callbacks when relationships fired).
> 
> Can (far as anyone knows) any combination of FrontBase locks[*] and Remote 
> Synchronizer lead to deletion (not wrong contents, but outright 
> disappearance) of a number of table rows?!?
> 
> [*] note: it was in an older version of my application, which far as I know 
> runs serialized/pessimistic

Combining FB logs and all the other possible sources, well, I can't be entirely 
sure, but it really looks like

(a) user launched a request which eventually lead to the following code, where 
'dg' is an ERXDisplayGroup, 'pt' an EO of appropriate kind to which the 
'formPrototype' :1 relationship indeed does lead:

===
dg.dataSource=new EODatabaseDataSource(this.defaultEditingContext,entityName) 
// the auction entity, T_AUCTION table
EOQualifier qq=new 
EOKeyValueQualifier('formPrototype',EOQualifier.QualifierOperatorEqual,pt)
if (baseQualifier) qq=new EOAndQualifier([qq,baseQualifier] as NSArray) // base 
qualifier was nonempty
dg.dataSource.fetchSpecification=new EOFetchSpecification(entityName,qq,null)
dg.fetch()
===

(b) inside the fetch, "Exception condition 379: Optimistic locking" happened 
(note that it has been, far as I can say, in _pessimistic_ FrontBase mode, 
isolation serializable):

===
13:55:33.433 WARN  <er.extensions.appserver.ERXComponentRequestHandler>: 
Exception occurred while handling request:
Exception condition 379. Optimistic locking: multiple transaction conflict 
detected.at com.frontbase.jdbc.FBJErrorMetaData.errorMessageAtIndex(Unknown 
Source)
at com.frontbase.jdbc.FBJErrorMetaData.getExceptionChain(Unknown Source)
at com.frontbase.jdbc.FBJConnection.checkMetaData(Unknown Source)
at com.frontbase.jdbc.FBJConnection.commit(Unknown Source)
at 
com.webobjects.jdbcadaptor.JDBCContext.commitTransaction(JDBCContext.java:452)
at com.webobjects.jdbcadaptor.JDBCChannel._endFetch(JDBCChannel.java:417)
at com.webobjects.jdbcadaptor.JDBCChannel.fetchRow(JDBCChannel.java:1458)
at 
com.webobjects.eoaccess.EODatabaseChannel._fetchObject(EODatabaseChannel.java:321)
at 
com.webobjects.eoaccess.EODatabaseContext._objectsWithFetchSpecificationEditingContext(EODatabaseContext.java:3071)
at 
er.extensions.eof.ERXDatabaseContext._objectsWithFetchSpecificationEditingContext(ERXDatabaseContext.java:68)
at 
com.webobjects.eoaccess.EODatabaseContext.objectsWithFetchSpecification(EODatabaseContext.java:3195)
at 
com.webobjects.eocontrol.EOObjectStoreCoordinator.objectsWithFetchSpecification(EOObjectStoreCoordinator.java:488)
at 
com.webobjects.eocontrol.EOEditingContext.objectsWithFetchSpecification(EOEditingContext.java:4069)
at er.extensions.eof.ERXEC.objectsWithFetchSpecification(ERXEC.java:1308)
at 
com.webobjects.eoaccess.EODatabaseDataSource.fetchObjects(EODatabaseDataSource.java:589)
at com.webobjects.appserver.WODisplayGroup.fetch(WODisplayGroup.java:2132)
at er.extensions.appserver.ERXDisplayGroup.fetch(ERXDisplayGroup.java:167)
...
===

(c) shortly afterwards, the user did log out, which (among others) adds an 
audit record and saves changes, both through the session default EC. Alas, in 
that version, I haven't logged out whether there were changes in the EC (and 
which of them), but it looks like reasonably good guess there were _somehow_ 
stored deleteObjects, consisting precisely of those auctions the display group 
of the previous step would display, were the exception not happen.

Far as I can say, nothing else happened meantime (but for "INFO  Sending 39 
changes. //log:er.extensions.remoteSynchronizer.ERXRemoteSynchronizer 
[ERXOSCProcessChanges]", which does not seem to be important). It seems the 
save generated the following SQL; T_AUCTION is the table corresponding to the 
display group entity:

===
INSERT INTO 
"T_AUDIT"("C_UID","C_CREATION_DATE","C_KIND","C_TITLE","C_IP_ADDRESS","C_CREATOR_ID")
 VALUES(1003352,TIMESTAMP '2014-11-25 13:56:22.287',2,'logout: 
"USERNAME"','212.27.219.66',1000027);

UPDATE "T_DF_FIELD" SET "C_CONTENT_DATA" = NULL WHERE "C_UID"=1000018;
UPDATE "T_DF_FIELD" SET "C_CONTENT_DATA" = @'B00508AE7027CAB40000012E' WHERE 
"C_UID"=1000018;
... ... number of other updates which do make sense, they usually happen at 
logout ...
UPDATE "T_DF_PROTOTYPE" SET "C_DF_VIEWS_DATA" = NULL WHERE "C_UID"=1000013;
UPDATE "T_DF_PROTOTYPE" SET "C_DF_VIEWS_DATA" = @'B00508AE702809B6000002FF' 
WHERE "C_UID"=1000013;

DELETE FROM "T_AUCTION" WHERE "C_UID"=1000076;
... ... 30-odd of them deleted, which DOES NOT make sense at all ...

--Tran: 36747 2014-11-25-13:56:57 394910 270 270 0 181465739 
0,FINServis,FINSERVIS,Europe/Prague
===

I must admit I am completely flabbergasted.

Does this make any sense to anybody? Might perhaps an extremely unlucky 
exception cause the ERXDisplayGroup.fetch method to delete the objects fetched? 
For indeed, it looks like the qualifier "qq" used above _would_ select 
precisely the auctions which were deleted, and none others.

Note please also there are relationships betw. those auctions and other 
objects. There are two owning/EODeleteRuleCascade to-many relationships, whose 
objects (which belong to the auctions deleted) were NOT deleted. There is one 
EODeleteRuleDeny to-many relationship, which does contain objects related to 
the deleted auctions, and the deletion happened anyway: whichever strange way 
the deletion operations were added to the save, they self-evidently were not 
properly validated through the model.

I've never heard of such quadruple-weird thing. Has anyone out there?

Thanks a big lot,
OC


 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      ([email protected])
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to [email protected]

Reply via email to