ken@gvax.cs.cornell.edu (Ken Birman) (01/18/91)
I've fixed a fault-tolerance bug in the token tool, which was
handling the "pass on failure" flag incorrectly and jamming after
certain failure sequences.
First, a fix to the manual: the manual says to set this flag to
FALSE if you want the token to pass on failure (in t_request).
In fact, TRUE means pass on failures. FALSE means don't (i.e. if
your own code will handle doing so)
Here's a patch script to get the tool to implement this flag. The
old code was not passing on failure regardless of what you said to do:
*** /tmp/,RCSt1a15996 Thu Jan 17 16:55:11 1991
--- cl_token.c Thu Jan 17 16:54:49 1991
***************
*** 315,321 ****
static void ignore(mp)
message *mp;
! {}
static void
do_send_token(msg, gaddr, how, tp)
--- 315,322 ----
static void ignore(mp)
message *mp;
! {
! }
static void
do_send_token(msg, gaddr, how, tp)
***************
*** 322,340 ****
message *msg;
address *gaddr;
int how;
! register char *tp;
{
send_token(tp);
cc_terminate("");
}
static void
! t_failed(tp)
register token *tp;
{
if(tp->t_flag&T_PASS_ON_FAIL)
! coord_cohort((message*)0, &(tp->t_gaddr),
! do_send_token, ignore, tp);
else
tp->t_flag |= T_FAIL;
}
--- 323,342 ----
message *msg;
address *gaddr;
int how;
! register token *tp;
{
+ tp->t_flag |= T_HOLD;
send_token(tp);
cc_terminate("");
}
static void
! t_failed(gaddr_p, paddr_p, event, tp)
register token *tp;
+ register address *gaddr_p, *paddr_p;
{
if(tp->t_flag&T_PASS_ON_FAIL)
! coord_cohort((message*)0, &tp->t_gaddr, do_send_token, ignore, tp)
;
else
tp->t_flag |= T_FAIL;
}
***************
*** 360,367 ****
if(tp->t_watch)
pg_watch_cancel(tp->t_watch);
if(pass_on_fail)
! tp->t_watch = pg_watch(&tp->t_gaddr, &tp->t_holder, W_FAIL,
t_failed, tp);
else
tp->t_watch = 0;
}
--- 362,371 ----
if(tp->t_watch)
pg_watch_cancel(tp->t_watch);
if(pass_on_fail)
! {
! tp->t_watch = pg_watch(&tp->t_gaddr, &tp->t_holder, W_LEAVE,
t_failed, tp);
+ }
else
tp->t_watch = 0;
}