[MUD-Dev] C&C and Event Rescheduling
clawrenc at cup.hp.com
clawrenc at cup.hp.com
Mon Aug 11 16:58:22 CEST 1997
In <199708012349.BAA04053 at petra.zesoi.fer.hr>, on 08/01/97
at 05:03 PM, Miroslav Silovic <silovic at petra.zesoi.fer.hr> said:
>> >I consider this a good thing. Remember, you have change_parents
>> >function in Cold. When you call it, it guarantees that the database
>> >will be consistant after termination.
>>
>> FWLIW I have a similar call, but I don't guarantee consistancy.
>> Instead I rebuild the inheritance tree when an outdated object is
>> detected. This doesn't change the workload much -- it just spreads it
>> out over time.
>No, the problem we deal with is this: Suppose you have a helpnode,
>and some moron decides to reparent it to room. Now this is almost
>surely and admin mistake, but this is what then happens: helpnode is
>tracked by help indices, and rooms are tracked by their realms. Now
>if you /only/ change the inheritance, you have a room in a help index
>and a room without its realm. This, of course, is a Bad Thing,
>because you have also broken the help index.
>The idea, then, is to call destructor method that destroys the
>helpnode part of the help node (indidentally removing it from its
>index) and calls constructor that does the housecleaning needed to
>add a consistant room.
>Now do this to a helpnode with 2000 descendants. Each of them is a
>helpnode and, well, needs to be cleared.
>Of course, this is not very realistic example, but adding parents to
>user object may well be very desirable, and if the parent require
>some internal state (suppose you're adding combat stats object to
>user), Cold will guarantee that the entire hierarchy is properly
>initialized.
>This has *huge* working set, but the alternative of /not/ doing it
>caused incredible number of problems in the past (it's utterly
>annoying to have, for example, invalid objects in the player
>database).
I don't see the problem IF you have a fail safe method of determining
that an object's inheritance tree is outdated. For me the procedure
is:
Event X is executing.
References Object A.
Is A in X's working set?
No --
Is A's inheritance tree up to date?
No -- rebuild inheritance tree.
Yes -- continue.
Yes -- continue.
Add A to X's working set.
Continue.
Then you never need concern yourself if an object is out of date, as
any access to an object guarantees that it is up to date.
>> >Actually I intend to reschedule the tasks with random delays,
>> >precisely because of this (I believe this solution is standard).
>> >Deadlock is improbable, then, because sooner or later things will
>> >schedule in the right order, with proper pause between each.
>>
>> Random rescheduling is a standard approach, however I wouldn't label
>> it a solution. You might like to do a simulation here. I suspect
>> you'll be surprised by the results. The problem of this approach is
>> that its incredibly sensitive to both the load and to range of the
>> random number generated.
>>
>> Specific case: If the random generation varies by a value which is
>> generally far smaller than the specific contending events in question,
>> then they'll continue to contend for a long while. There are other
>> nasty cases (a simulation should show you most of the nasty ones).
>I actually intended to double the random delay on each reschedule.
>This should take care of most of the problems. But you're quite
>right, this will take some experimenting. Mind you, we don't even
>have OS-level threading in place (or even in progress) yet. :)
There's some definitional fall out here:
Is this a
-- select a random value, and then interatively double that
earlier value on each rescheduling?
or
-- on each interation select a random rescheduling time from a
range whose total size doubles?
or
-- on each interation select a random rescheduling time from a fixed
length range which is then appended to a time block whose length
doubles on each iteration?
I'm certain there are studies on this area, but I don't have time to
investigate. My temptation however would be to have the rescheduling
time follow:
Event X fails at time T.
X will be rescheduled at a time S.
S will be T + (N * Q) + rand(M * N)
where:
N is the number of times this event has been rescheduled.
Q is a fixed unit of time equal to 1/2 (this fraction requires
tuning) the runtime length of an average event.
M is a fixed unit of time equal to the shortest common runtime of
an event.
It could also be profitable to make S:
S will be T + rand(Q * N)
Testing would tell.
>I'm actually interested on your opinion on doubling the delays each
>time (well, doubling value 'x', then getting the delay as random(x),
>to be more precise).
Ahh, you've answered the above question. I *think* this would work
pretty well. I'd really want to program up a little simulator that
ran say a test bed of 50 or 100 (P) simultaneous events which compeat
for a limited set of N resources (N == P, N>P, N<P, N>>P etc). Let
the thing run for a few hours/day, vary the various weighting factors
and see what the results look like.
It should take about a day or less to design, write, and debug, Then
play with it for a week or so and see what sort of numbers and
performances you get out of it.
Note: You may also want to play with your random() algorithm, as well
as making the selection of seed on each call/thread be reset. many
random() implementation area really NOT random for strict sequential
calls.
>> Unter originally took the replication model. Latter design
>> discussions that I've heard of spoke of doing RPC until a threshhold
>> value (balance of local calls to remote calls from specific target) at
>> which point the object would be moved to the preferential server.
>I like this, but i'd have to do some thinking to figure how to do it
>(well, of course, I'll not be the only one to do the thinking).
It is what I'd like to do, but I have yet to come up with a really
decent design for it. *ponders* Something to chew on for those late
nights.
--
J C Lawrence Internet: claw at null.net
(Contractor) Internet: coder at ibm.net
---------------(*) Internet: clawrenc at cup.hp.com
...Honorary Member Clan McFUD -- Teamer's Avenging Monolith...
More information about the mud-dev-archive
mailing list