[MUD-Dev] Re: atomic functions
Jon A. Lambert
jlsysinc at ix.netcom.com
Sun May 3 19:22:52 CEST 1998
On 3 May 98 at 19:43, Felix A. Croes wrote:
> Jon A. Lambert <jlsysinc at ix.netcom.com> wrote:
> > On 3 May 98 at 1:23, Felix A. Croes wrote:
[snip]
> > > Hmm. That is one thing I mean to do differently: if the current
> > > event fails to commit, then any events generated by it are unscheduled.
> >
> > Currently I have no way to do this.
>
> In your system, isn't it also necessary to check the state of successor
> events? For example: event A schedules event B, and then fails. Event
> B is started and succeeds. Event A is restarted, schedules event B
> again, and succeeds. Event B is started and succeeds. Now event A has
> completed once, but successor event B has completed twice, even though
> B can only be scheduled by A.
>
> Also, doesn't this imply that when A schedules B, it cannot pass along
> data to B? After all, that data has been prepared by an event that may
> turn out not to have existed.
>
> This looks like a very chaotic system to me. What are the advantages
> that make you prefer it?
>
Excellent questions. The implementation details of S&S vs. C&C come into
play here. C&C would check for event failure at the termination or close
of the event when all the object changes are being compared. OTOH S&S
attempts to obtain locks or escalate locks on objects during the events
execution. So failure is known prior to end of the event code.
So if Event B is logically dependent on Event A's success, Event A
should not issue Event B until such a point where it is guaranteed to
complete.
Perhaps an example would illustrate this better.
A() {
i = objX.property; // A read lock is issued on objX.
// code fragment
objX.property = j; // The read lock is escalated to a write lock.
// more code frags.
if (problem) throw USER_ERROR; // note this is a detected and
// expected state problem.
event B(); // If execution of A is here success of above
// is guaranteed.
// more code // Note if LOCK_FAIL is detected here Event
// A is no longer guaranteed to commit. So
// event B above is suspect if it is truly
// dependent on A's success.
catch {
if (USER_ERROR) { event C(); } // Error caught
if (LOCK_FAIL)
{ // By default on LOCK_FAIL, event A would be rescheduled
// Code here could override that behavior
// so even "event A(modified params);" is possible.
}
}
}
Of course this raises the ugly issue of deadlocks. For example, events
A and B are currently executing.
A() {
objX.prop = expr; // writelock on X obtained
--->objY.prop = expr; // currently waiting on writelock for Y
}
B() {
objY.prop = expr; // write lock on Y obtained
--->objX.prop = expr; // currently waiting on writelock for X
}
There a two extremes in implementing locking and a wide area of middle
ground.
1) Wait for lock forever.
2) Fail immediately upon not getting lock.
and
3) Spin-locking -- repeatably try to obtain locks for duration X,
X tries, or many other shemes.
So one of the events (A or B) will fail, release it's lock and be
rescheduled in my model.
Trivia note: My terminology "spin-lock" comes from IBM's MVS/ESA
architecture. MVS uses spin-locking in its page locking scheme
to implement shared memory.
Another possible downside of both C&C and S&S:
A() {
for each object in(biglistX) {
objX = biglistX.current();
objX.prop = expr;
}
}
What are the odds of this ever completing? Perhaps slim to none?
My solution:
A() {
for each object in(biglistX) {
objX = biglistX.current();
event objX.Setprop(expr); // events are issued for each object
// Event A would only requires readlock on biglistX
}
}
J.C. Lawrence is pretty steadfast in that C&C will outperform locking
and I am still skeptical. The only thing I can say with reasonable
certainty is that event rescheduling will be more frequent in C&C than
in S&S. And execution wait time will be longer in S&S than in C&C.
How this falls out in average throughput time, I an less certain.
--
--/*\ Jon A. Lambert - TychoMUD Internet:jlsysinc at ix.netcom.com /*\--
--/*\ Mud Server Developer's Page <http://www.netcom.com/~jlsysinc> /*\--
--/*\ "Everything that deceives may be said to enchant" - Plato /*\--
--
MUD-Dev: Advancing an unrealised future.
More information about the mud-dev-archive
mailing list