Great work Reviewed-by: Steven Dake <[email protected]>
On 07/15/2011 06:31 AM, Jan Friesse wrote: > Signed-off-by: Jan Friesse <[email protected]> > --- > exec/totemrrp.c | 175 > +++++++++++++++++++++++++++++++++++-------------------- > 1 files changed, 112 insertions(+), 63 deletions(-) > > diff --git a/exec/totemrrp.c b/exec/totemrrp.c > index 0445be2..6bfacd9 100644 > --- a/exec/totemrrp.c > +++ b/exec/totemrrp.c > @@ -335,6 +335,11 @@ static void passive_mcast_flush_send ( > const void *msg, > unsigned int msg_len); > > +static void passive_monitor ( > + struct totemrrp_instance *rrp_instance, > + unsigned int iface_no, > + int is_token_recv_count); > + > static void passive_token_recv ( > struct totemrrp_instance *instance, > unsigned int iface_no, > @@ -484,6 +489,14 @@ static void active_timer_problem_decrementer_cancel ( > * #define ARR_SEQNO_START_MSG 0xfffffe00 > */ > > +/* > + * Threshold value when recv_count for passive rrp should be adjusted. > + * Set this value to some smaller for testing of adjusting proper > + * functionality. Also keep in mind that this value must be smaller > + * then rrp_problem_count_threshold > + */ > +#define PASSIVE_RECV_COUNT_THRESHOLD (INT_MAX / 2) > + > struct message_header { > char type; > char encapsulated; > @@ -841,50 +854,92 @@ static void passive_timer_problem_decrementer_cancel ( > } > */ > > - > -static void passive_mcast_recv ( > +/* > + * Monitor function implementation from rrp paper. > + * rrp_instance is passive rrp instance, iface_no is interface with received > messgae/token and > + * is_token_recv_count is boolean variable which donates if message is token > (>1) or regular > + * message (= 0) > + */ > +static void passive_monitor ( > struct totemrrp_instance *rrp_instance, > unsigned int iface_no, > - void *context, > - const void *msg, > - unsigned int msg_len) > + int is_token_recv_count) > { > struct passive_instance *passive_instance = (struct passive_instance > *)rrp_instance->rrp_algo_instance; > + unsigned int *recv_count; > unsigned int max; > unsigned int i; > - > - rrp_instance->totemrrp_deliver_fn ( > - context, > - msg, > - msg_len); > - > - if (rrp_instance->totemrrp_msgs_missing() == 0 && > - passive_instance->timer_expired_token) { > - /* > - * Delivers the last token > - */ > - rrp_instance->totemrrp_deliver_fn ( > - passive_instance->totemrrp_context, > - passive_instance->token, > - passive_instance->token_len); > - passive_timer_expired_token_cancel (passive_instance); > - } > + unsigned int min_all, min_active; > > /* > * Monitor for failures > - * TODO doesn't handle wrap-around of the mcast recv count > */ > - passive_instance->mcast_recv_count[iface_no] += 1; > + if (is_token_recv_count) { > + recv_count = passive_instance->token_recv_count; > + } else { > + recv_count = passive_instance->mcast_recv_count; > + } > + > + recv_count[iface_no] += 1; > + > max = 0; > for (i = 0; i < rrp_instance->interface_count; i++) { > - if (max < passive_instance->mcast_recv_count[i]) { > - max = passive_instance->mcast_recv_count[i]; > + if (max < recv_count[i]) { > + max = recv_count[i]; > + } > + } > + > + /* > + * Max is larger then threshold -> start adjusting process > + */ > + if (max > PASSIVE_RECV_COUNT_THRESHOLD) { > + min_all = min_active = recv_count[iface_no]; > + > + for (i = 0; i < rrp_instance->interface_count; i++) { > + if (recv_count[i] < min_all) { > + min_all = recv_count[i]; > + } > + > + if (passive_instance->faulty[i] == 0 && > + recv_count[i] < min_active) { > + min_active = recv_count[i]; > + } > + } > + > + if (min_all > 0) { > + /* > + * There is one or more faulty device with recv_count > > 0 > + */ > + for (i = 0; i < rrp_instance->interface_count; i++) { > + recv_count[i] -= min_all; > + } > + } else { > + /* > + * No faulty device with recv_count > 0, adjust only > active > + * devices > + */ > + for (i = 0; i < rrp_instance->interface_count; i++) { > + if (passive_instance->faulty[i] == 0) { > + recv_count[i] -= min_active; > + } > + } > + } > + > + /* > + * Find again max > + */ > + max = 0; > + > + for (i = 0; i < rrp_instance->interface_count; i++) { > + if (max < recv_count[i]) { > + max = recv_count[i]; > + } > } > } > > for (i = 0; i < rrp_instance->interface_count; i++) { > if ((passive_instance->faulty[i] == 0) && > - (max - passive_instance->mcast_recv_count[i] > > + (max - recv_count[i] > > > rrp_instance->totem_config->rrp_problem_count_threshold)) { > passive_instance->faulty[i] = 1; > poll_timer_add (rrp_instance->poll_handle, > @@ -905,6 +960,35 @@ static void passive_mcast_recv ( > } > } > > +static void passive_mcast_recv ( > + struct totemrrp_instance *rrp_instance, > + unsigned int iface_no, > + void *context, > + const void *msg, > + unsigned int msg_len) > +{ > + struct passive_instance *passive_instance = (struct passive_instance > *)rrp_instance->rrp_algo_instance; > + > + rrp_instance->totemrrp_deliver_fn ( > + context, > + msg, > + msg_len); > + > + if (rrp_instance->totemrrp_msgs_missing() == 0 && > + passive_instance->timer_expired_token) { > + /* > + * Delivers the last token > + */ > + rrp_instance->totemrrp_deliver_fn ( > + passive_instance->totemrrp_context, > + passive_instance->token, > + passive_instance->token_len); > + passive_timer_expired_token_cancel (passive_instance); > + } > + > + passive_monitor (rrp_instance, iface_no, 0); > +} > + > static void passive_mcast_flush_send ( > struct totemrrp_instance *instance, > const void *msg, > @@ -943,8 +1027,6 @@ static void passive_token_recv ( > unsigned int token_seq) > { > struct passive_instance *passive_instance = (struct passive_instance > *)rrp_instance->rrp_algo_instance; > - unsigned int max; > - unsigned int i; > > passive_instance->totemrrp_context = context; // this should be in > totemrrp_instance ? TODO > > @@ -959,40 +1041,7 @@ static void passive_token_recv ( > > } > > - /* > - * Monitor for failures > - * TODO doesn't handle wrap-around of the token > - */ > - passive_instance->token_recv_count[iface_no] += 1; > - max = 0; > - for (i = 0; i < rrp_instance->interface_count; i++) { > - if (max < passive_instance->token_recv_count[i]) { > - max = passive_instance->token_recv_count[i]; > - } > - } > - > - for (i = 0; i < rrp_instance->interface_count; i++) { > - if ((passive_instance->faulty[i] == 0) && > - (max - passive_instance->token_recv_count[i] > > - > rrp_instance->totem_config->rrp_problem_count_threshold)) { > - passive_instance->faulty[i] = 1; > - poll_timer_add (rrp_instance->poll_handle, > - > rrp_instance->totem_config->rrp_autorecovery_check_timeout, > - rrp_instance->deliver_fn_context[i], > - timer_function_test_ring_timeout, > - > &rrp_instance->timer_active_test_ring_timeout[i]); > - > - sprintf (rrp_instance->status[i], > - "Marking seqid %d ringid %u interface %s > FAULTY", > - token_seq, > - i, > - totemnet_iface_print > (rrp_instance->net_handles[i])); > - log_printf ( > - rrp_instance->totemrrp_log_level_error, > - "%s", > - rrp_instance->status[i]); > - } > - } > + passive_monitor (rrp_instance, iface_no, 1); > } > > static void passive_token_send ( _______________________________________________ Openais mailing list [email protected] https://lists.linux-foundation.org/mailman/listinfo/openais
