Hi there,

long time no see, my problems were plain and easy. Now though I am back with 
another thing I can't understand.

There's an EO with a (string) attribute, let's say foo.value. A number of 
sessions; session A occasionally sets the attribute, sessions B,C,D ... read 
it. All happens in default ECs of sessions (not that it, far as I can say, is 
important). Yesterday's log shows this sequence of events:

- A sets (and immediately saves to DB) foo.value "851;21.3.2018 10:48:19" 
(lucky us, the value indeed happens to contain a timestamp)
- B,C,D... all read (a number of times) proper foo.value "851;21.3.2018 
10:48:19"
- A sets (and saves) foo.value "980;21.3.2018 10:51:07"
- B reads (a number of times) OLD foo.value "851;21.3.2018 10:48:19" <----- 
this is the problem
- whilst C,D,... all read proper foo.value "980;21.3.2018 10:51:07"
- A sets (and saves) foo.value "1020;21.3.2018 10:52:20"
- B,C,D... all read (a number of times) proper foo.value "1020;21.3.2018 
10:52:20"

Now, do please correct me if I am missing something, but I know of only two 
cases which would explain the old foo.value in B:
(i) the EC has not been unlocked and synced yet. Not the case: B did read the 
wrong foo.value in a number of subsequent worker threads; besides, it 
unlocks/locks the EC itself (more to that below);
(ii) the foo.value in the EC of B is changed. Not the case either: B saves 
changes in its EC a number of times; if the value has been changed in there, it 
would get saved to the DB, which did not happen.

Is there any (iii) I have forgot?

Now, the code in which the value is read is somewhat non-standard; it needs to 
ensure some level of serialisation, and thus looks like this:

===
EOEditingContext ec=... // the EC of objects we work with, happens to be 
default EC of session here
synchronized (lock) { // only one thread allowed to do this at the same time
  ec.unlock() // make sure all the changes from other threads ...
  ec.lock()   // ... are properly merged to our EC before we use it
  ...      // some other irrelevant code
  log "$foo.value" // here the attribute value read from our EO is logged (the 
one which was wrong for B)
  ec.saveChanges() // changes made by the other irrelevant code are saved, if 
any (it would save change of foo.value if any too)
}
===

Note that the place where A does its foo.setValue(...); ec.saveChanges() is 
*not* under the lock; there's no need (I believe) to make it serialized. Only 
the “other irrelevant code” needs that.

About the only irregularity I has been able to find with the "980;21.3.2018 
10:51:07" was that it happened to been set whilst the session B did perform its 
synchronized section. It well might have happened in paralel with the 
“ec.unlock(); ec.lock()” part.

I wonder: might it perhaps be possible that, when one EC in a thread A does 
“ec.unlock(); ec.lock()”, and another EC in another thread at the same time 
changes (and saves) one of its EOs, that the change would NOT get properly 
merged to the first EC?

If not, well, does anybody have any idea what might be the culprit?

Thanks a lot for any advice,
OC
 
 _______________________________________________
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