commit: r442 - trunk/daemon
[email protected] Fri, 06 Jan 2012 20:10:41 -0500
| Newsgroups | gmane.network.spread.cvs |
|---|---|
| Message-ID | <[email protected]> |
Author: jonathan Date: 2012-01-06 20:10:41 -0500 (Fri, 06 Jan 2012) New Revision: 442 Modified: trunk/daemon/Changelog trunk/daemon/protocol.c Log: Document Token Hurry algorithm to determine if token should be held. Also fix bug where request to send is sometimes delayed by the hurry timeout when it shouldn't be. Modified: trunk/daemon/Changelog =================================================================== --- trunk/daemon/Changelog 2012-01-07 00:43:24 UTC (rev 441) +++ trunk/daemon/Changelog 2012-01-07 01:10:41 UTC (rev 442) @@ -1,3 +1,10 @@ +Fri Jan 6 19:58:12 2012 Jonathan Stanton <[email protected]> + + * protocol.c (Handle_hurry): Fix token hurry bug where one daemon + wanted to send, but the token entered hold state until hurry + timeout expired. Prevents 2 second latency delay to send in certain + circumstances. + Fri Jan 6 01:01:01 2012 Jonathan Stanton <[email protected]> * include/sp.h, scatter.h (dummy_scat_element): Fix scatter type Modified: trunk/daemon/protocol.c =================================================================== --- trunk/daemon/protocol.c 2012-01-07 00:43:24 UTC (rev 441) +++ trunk/daemon/protocol.c 2012-01-07 01:10:41 UTC (rev 442) @@ -485,7 +485,7 @@ if( (Memb_state() != EVS ) && (Token->seq > MAX_WRAP_SEQUENCE_VALUE ) ) { Alarm( PRINT, "Prot_handle_token: Token Sequence number (%ld) approaching 2^31 so trigger membership to reset it.\n", Token->seq); - + /* return swallows token and will break ring and trigger membership */ return; } @@ -1329,6 +1329,26 @@ } } +/* The Token is in "hold" state at a leader or non-leader daemon + * if the following conditions hold: + * + * 1) A normal token is circling: + * "Memb_state() == OP or GATHER with Alive token" + * These are the only states when a token that allows message sends is circling + * 2) All messages are stable at all daemons (i.e. every daemon knows that all messages are stable): + * "ARU == Highest_Seq" + * Otherwise we need to cycle the token so all daemons will learn about the messages and the ARU of + * other daemons so they can laearn about stability of all messages. + * 3) Only one copy of a token with a particular ARQ value has been sent around the ring: + * "Get_retrans(Last_token->type) <= 1" + * This is true when the token is sent on in the Prot_handle_token() function after being recreated or + * if it is sent the first time Prot_token_hurry() is called because of a timeout after Prot_handle_token has created a new token. + * 4) The token are circulated at least once without doing any work (no new messages or updates to counters) + * AND no daemon has requested the token in order to send new messages (sent a Hurry request) + * "Token_counter > 1" + * This measures the lack of interest by any daemon in introducing new work and is only used in Spread + * to detect this lack of interest - i.e. it has no other role. + */ static int Is_token_hold() { if( ( Memb_state() == OP || @@ -1355,6 +1375,11 @@ if( Conf_id_in_conf( Memb_active_ptr(), pack_ptr->proc_id ) != -1 ) { Alarm( PROTOCOL, "Handle_hurry: sending token now\n"); + /* Reset token_counter so token protocol knows someone wants to send + * and token should not go into hold state until everyone gets a chance + * to send. + */ + Token_counter = 0; Prot_token_hurry(); } }