[ovs-dev] [PATCH V3] cfm: Notify connectivity_seq on remote maintenance points change.
Alex Wang
alexw at nicira.com
Tue Mar 18 21:19:03 UTC 2014
Hey Ben,
could you review this patch when you are available? fix a bug in branch-2.1
Thanks,
Alex Wang,
On Tue, Mar 18, 2014 at 2:14 PM, Alex Wang <alexw at nicira.com> wrote:
> Commit f23d157c ("ofproto-dpif: Don't poll ports when nothing changes")
> did not ensure the update of the row of remote maintenance points in ovsdb
> when it changes. This commit makes the update happen by notifying the
> global connectivity_seq.
>
> Bug #1192265
>
> Signed-off-by: Alex Wang <alexw at nicira.com>
>
> ---
> V2 -> V3:
> - to prevent similar bug from happening again, move the check for all
> cfm status variables in one place.
>
> PATCH -> V2:
> - remove the seq_change in cfm_process_heartbeat().
> realize that the returned rmps_array is only updated in
> cfm_run(), the check should be placed there.
> ---
> lib/cfm.c | 22 +++++++++++++---------
> 1 file changed, 13 insertions(+), 9 deletions(-)
>
> diff --git a/lib/cfm.c b/lib/cfm.c
> index 38448ab..325931d 100644
> --- a/lib/cfm.c
> +++ b/lib/cfm.c
> @@ -393,6 +393,10 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex)
> if (timer_expired(&cfm->fault_timer)) {
> long long int interval = cfm_fault_interval(cfm);
> struct remote_mp *rmp, *rmp_next;
> + uint64_t old_flap_count = cfm->flap_count;
> + int old_health = cfm->health;
> + size_t old_rmps_array_len = cfm->rmps_array_len;
> + bool old_rmps_deleted = false;
> bool old_cfm_fault = cfm->fault;
> bool old_rmp_opup = cfm->remote_opup;
> bool demand_override;
> @@ -419,7 +423,6 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex)
> cfm->health = 0;
> } else {
> int exp_ccm_recvd;
> - int old_health = cfm->health;
>
> rmp = CONTAINER_OF(hmap_first(&cfm->remote_mps),
> struct remote_mp, node);
> @@ -434,10 +437,6 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex)
> cfm->health = MIN(cfm->health, 100);
> rmp->num_health_ccm = 0;
> ovs_assert(cfm->health >= 0 && cfm->health <= 100);
> -
> - if (cfm->health != old_health) {
> - seq_change(connectivity_seq_get());
> - }
> }
> cfm->health_interval = 0;
> }
> @@ -457,6 +456,7 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex)
> " %lldms", cfm->name, rmp->mpid,
> time_msec() - rmp->last_rx);
> if (!demand_override) {
> + old_rmps_deleted = true;
> hmap_remove(&cfm->remote_mps, &rmp->node);
> free(rmp);
> }
> @@ -480,10 +480,6 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex)
> cfm->remote_opup = true;
> }
>
> - if (old_rmp_opup != cfm->remote_opup) {
> - seq_change(connectivity_seq_get());
> - }
> -
> if (hmap_is_empty(&cfm->remote_mps)) {
> cfm->fault |= CFM_FAULT_RECV;
> }
> @@ -505,7 +501,15 @@ cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex)
> if (old_cfm_fault == false || cfm->fault == false) {
> cfm->flap_count++;
> }
> + }
>
> + /* These variables represent the cfm session status, it is
> desirable
> + * to update them to database immediately after change. */
> + if (old_health != cfm->health
> + || old_rmp_opup != cfm->remote_opup
> + || (old_rmps_array_len != cfm->rmps_array_len ||
> old_rmps_deleted)
> + || old_cfm_fault != cfm->fault
> + || old_flap_count != cfm->flap_count) {
> seq_change(connectivity_seq_get());
> }
>
> --
> 1.7.9.5
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openvswitch.org/pipermail/ovs-dev/attachments/20140318/56ad60af/attachment-0005.html>
More information about the dev
mailing list