Some followup: I have analysed the R/R loops in details and found that

- the user B saved changes at 11:00:25.220
- at this moment, there was a user A's R/R loop (which never touched the 
relevant data), running from 11:00:24.570 to 11:00:25.548
- the next user A's R/R loop started at 11:00:38.113, read the relevant data, 
did not see the changes of 11:00:25.220

In other words,
- at 11:00:25.220, user A's EC was locked; it should not merge the changes 
immediately...
- ... but, at 11:00:25.548 the user A's EC was unlocked: at this moment the 
11:00:25.220 changes should be merged into the EC...
- ... which self-evidently did not happen, for in the next R/R loop started at 
11:00:38.113 the 11:00:25.220 changes were still not visible.

How could that happen? What could prevent the merge at the EC unlock/RR loop 
end?

Thanks for any advice,
OC

> On 16 Jun 2021, at 6:35, OCsite <webobjects-...@wocommunity.org> wrote:
> 
> Matthew,
> 
> no luck this way: one instance only, and one OSC 
> (ERXObjectStoreCoordinatorPool.maxCoordinators=1).
> 
> Thanks,
> OC
> 
>> On 16. 6. 2021, at 2:57, Matthew Ness <webobjects-...@wocommunity.org 
>> <mailto:webobjects-...@wocommunity.org>> wrote:
>> 
>> 
>> On Wed, Jun 16, 2021, at 1:42 AM, OCsite wrote:
>>> Hi there,
>>> 
>>> today we have bumped into a weird behaviour which I can't grok. We got an 
>>> old/invalid value for a :1 relationship to an important object (important 
>>> enough we even added its FK to the modelled locked attributes aside of the 
>>> PK; not that it helped any, but thanks to that, we see the current snapshot 
>>> values in the database operations).
>>> 
>>> 1. user A stored new object into the relationship; since we log all 
>>> database operations, we can see for his EC how this happened:
>>> 
>>> 11:00:12.995 UPDATE on 'DBAuction' ((uid = 1005602) and 
>>> (lastValidPriceOfferID = 1061694)) -> {lastValidPriceOfferID:1061695}
>>> 
>>> The saveChanges operation did not fail and the appropriate R/R loop did end 
>>> without a glitch, no exception, no problem at all, at 11:00:13.036.
>>> 
>>> 2. user B changed the object; again, we can see for his EC
>>> 
>>> 11:00:25.220 UPDATE on 'DBAuction' ((uid = 1005602) and 
>>> (lastValidPriceOfferID = 1061695)) -> {lastValidPriceOfferID:1061698}
>>> 
>>> The saveChanges operation again finished successfully and the appropriate 
>>> R/R loop did end all right at 11:00:25.424.
>>> 
>>> 3. in a new R/R loop which started at 11:00:40.947, user A read the value 
>>> (the very standard way through storedValueForKey('lastValidPriceOffer') — 
>>> which is the one we observe all the time, modelled as a simple :1 
>>> relationship with FK lastValidPriceOfferID) —, and got the stale object 
>>> PK:1061695! 
>>> 
>>> How is it possible that the step 2 did not update values in user A's EC? 
>>> Incidentally, to make extra sure we do not get stale values even if R/R 
>>> threads happen to overlap, the code uses in the step 3 looks like this:
>>> 
>>>     synchronized (alock) { // lock for the DBAuction 1005602 object 
>>> (conceptually on PK to lock out all users regardless their ECs)
>>>         try {
>>>             auction.editingContext().unlock() // so as to process recent 
>>> changes from other ECs (thanks, Chuck!)
>>>             auction.editingContext().lock()   // of course we have to keep 
>>> it locked
>>>             DBPriceOffer wins=auction.lastValidPriceOffer() // simply calls 
>>> storedValueForKey('lastValidPriceOffer')
>>>             println "... last valid $wins"
>>> 
>>> and this very log shows we have got the old price offer, the one with 
>>> PK:1061695.
>>> 
>>> I could understand this if user A changed the object to 1061695 and did not 
>>> save it (in which case the EC sync would not touch the change; but then it 
>>> would be all right, if the change was not saved), but he very definitely 
>>> did save the 1061695 successfully in step 1, and never changed it later 
>>> (until he got it again — the old/invalid value! — in step 3).
>>> 
>>> Can anyone see a scenario which would lead to him seeing still 1061695 in 
>>> step 3, regardless that
>>> - he did save it successfully at 11:00:12 and never changed it later;
>>> - another user did change it to 1061698 and successfully did save at 
>>> 11:00:25;
>>> - aside of the extra lock/unlock shown above, there is no manual EC 
>>> locking, ECs are auto-locked at R/Rs;
>>> - and besides, even if the extra lock/unlock was not used, the R/R threads 
>>> here did not overlap, so the change should be synced all right, and the 
>>> user should get 1061698 in the step 3?
>>> 
>>> What do I overlook?
>>> 
>>> Thanks and all the best,
>>> OC
>>> 
>> 
>> Hi,
>> 
>> How many instances of the application aretypically running?
>> 
>> Regards,
>> 
>> -- 
>> Matt
>> https://logicsquad.net <https://logicsquad.net/>
>> https://www.linkedin.com/company/logic-squad/ 
>> <https://www.linkedin.com/company/logic-squad/>
 _______________________________________________
Do not post admin requests to the list. They will be ignored.
Webobjects-dev mailing list      (Webobjects-dev@lists.apple.com)
Help/Unsubscribe/Update your Subscription:
https://lists.apple.com/mailman/options/webobjects-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to