[ovs-dev] [PATCH 1/2] cfm: Update cfm status on cfm creation and deletion.

Ethan Jackson ethan at nicira.com
Wed May 7 17:52:22 UTC 2014


Acked-by: Ethan Jackson <ethan at nicira.com>


On Wed, May 7, 2014 at 12:01 AM, Alex Wang <alexw at nicira.com> wrote:
> Commit 88bf179aa3 (bfd/cfm: Check status change before update
> status to database.) used a boolean flag to trigger cfm status
> update.  However, the flag is not set on cfm creation and deletion.
> And this causes stale status in database which may confuse users.
>
> This commit fixes the issue by making cfm module trigger status
> update on creation and deletion.
>
> Bug #1245800
>
> Signed-off-by: Alex Wang <alexw at nicira.com>
> ---
>  lib/cfm.c    |   18 +++++++++--------
>  tests/cfm.at |   62 ++++++++++++++++++++++++++++++++++++++++++++++------------
>  2 files changed, 59 insertions(+), 21 deletions(-)
>
> diff --git a/lib/cfm.c b/lib/cfm.c
> index 1b32625..c271e1e 100644
> --- a/lib/cfm.c
> +++ b/lib/cfm.c
> @@ -328,6 +328,14 @@ cfm_init(void)
>                               1, 2, cfm_unixctl_set_fault, NULL);
>  }
>
> +/* Records the status change and changes the global connectivity seq. */
> +static void
> +cfm_status_changed(struct cfm *cfm) OVS_REQUIRES(mutex)
> +{
> +    seq_change(connectivity_seq_get());
> +    cfm->status_changed = true;
> +}
> +
>  /* Allocates a 'cfm' object called 'name'.  'cfm' should be initialized by
>   * cfm_configure() before use. */
>  struct cfm *
> @@ -349,6 +357,7 @@ cfm_create(const struct netdev *netdev) OVS_EXCLUDED(mutex)
>      ovs_refcount_init(&cfm->ref_cnt);
>
>      ovs_mutex_lock(&mutex);
> +    cfm_status_changed(cfm);
>      cfm_generate_maid(cfm);
>      hmap_insert(all_cfms, &cfm->hmap_node, hash_string(cfm->name, 0));
>      ovs_mutex_unlock(&mutex);
> @@ -370,6 +379,7 @@ cfm_unref(struct cfm *cfm) OVS_EXCLUDED(mutex)
>      }
>
>      ovs_mutex_lock(&mutex);
> +    cfm_status_changed(cfm);
>      hmap_remove(all_cfms, &cfm->hmap_node);
>      ovs_mutex_unlock(&mutex);
>
> @@ -395,14 +405,6 @@ cfm_ref(const struct cfm *cfm_)
>      return cfm;
>  }
>
> -/* Records the status change and changes the global connectivity seq. */
> -static void
> -cfm_status_changed(struct cfm *cfm) OVS_REQUIRES(mutex)
> -{
> -    seq_change(connectivity_seq_get());
> -    cfm->status_changed = true;
> -}
> -
>  /* Should be run periodically to update fault statistics messages. */
>  void
>  cfm_run(struct cfm *cfm) OVS_EXCLUDED(mutex)
> diff --git a/tests/cfm.at b/tests/cfm.at
> index fdca4ac..06cab90 100644
> --- a/tests/cfm.at
> +++ b/tests/cfm.at
> @@ -28,23 +28,54 @@ MPID $2: extended
>  ])
>
>  m4_define([CFM_VSCTL_LIST_IFACE], [
> -AT_CHECK([ovs-vsctl list interface $1 | sed -n '/$2/p'],[0],
> +AT_CHECK([ovs-vsctl list interface $1 | sed -n '/$2 /p'],[0],
>  [dnl
>  $3
>  ])
>  ])
>
>  m4_define([CFM_CHECK_DB], [
> -CFM_VSCTL_LIST_IFACE([$1], [cfm_fault_status], [cfm_fault_status    : [[$2]]])
> -CFM_VSCTL_LIST_IFACE([$1], [cfm_flap_count], [cfm_flap_count      : $3])
> -CFM_VSCTL_LIST_IFACE([$1], [cfm_health], [cfm_health          : [[$4]]])
> -CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_mpids], [cfm_remote_mpids    : [[$5]]])
> -CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_opstate], [cfm_remote_opstate  : $6])
> +CFM_VSCTL_LIST_IFACE([$1], [cfm_fault], [cfm_fault           : $2])
> +CFM_VSCTL_LIST_IFACE([$1], [cfm_fault_status], [cfm_fault_status    : [[$3]]])
> +CFM_VSCTL_LIST_IFACE([$1], [cfm_flap_count], [cfm_flap_count      : $4])
> +CFM_VSCTL_LIST_IFACE([$1], [cfm_health], [cfm_health          : [[$5]]])
> +CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_mpids], [cfm_remote_mpids    : [[$6]]])
> +CFM_VSCTL_LIST_IFACE([$1], [cfm_remote_opstate], [cfm_remote_opstate  : $7])
>  ])
>
> -# This test checks the update of cfm status to OVSDB at startup.
> -# The cfm status should be updated to OVSDB within 3.5 * cfm_interval.
> -AT_SETUP([cfm - check update ovsdb])
> +# These two tests check the update of cfm status at different scenarios.
> +
> +# Test cfm status update at startup and removal.
> +AT_SETUP([cfm - check update ovsdb 1])
> +OVS_VSWITCHD_START([add-port br0 p0 -- set Interface p0 type=gre \
> +                    options:remote_ip=1.2.3.4 -- \
> +                    set Interface p0 other_config:cfm_interval=300 other_config:cfm_extended=true])
> +
> +ovs-appctl time/stop
> +
> +AT_CHECK([ovs-vsctl set Interface p0 cfm_mpid=1])
> +# at beginning, since the first fault check timeout is not reached
> +# cfm_fault should be false.
> +for i in `seq 0 4`; do
> +    ovs-appctl time/warp 100
> +    CFM_CHECK_DB([p0], [false], [], [0], [], [], [up])
> +done
> +
> +# advance clock to pass the fault check timeout and check cfm
> +# status update in OVSDB.
> +for i in `seq 0 14`; do ovs-appctl time/warp 100; done
> +CFM_CHECK_DB([p0], [true], [recv], [1], [], [], [up])
> +
> +# remove the cfm on p0 and status should be all empty.
> +AT_CHECK([ovs-vsctl remove int p0 cfm_mpid 1])
> +for i in `seq 0 4`; do ovs-appctl time/warp 100; done
> +CFM_CHECK_DB([p0], [[[]]], [], [[[]]], [], [], [[[]]])
> +
> +OVS_VSWITCHD_STOP
> +AT_CLEANUP
> +
> +# Test cfm status update in normal case.
> +AT_SETUP([cfm - check update ovsdb 2])
>  #Create 2 bridges connected by patch ports and enable cfm
>  OVS_VSWITCHD_START([add-br br1 -- \
>                      set bridge br1 datapath-type=dummy \
> @@ -61,13 +92,18 @@ ovs-appctl time/stop
>  AT_CHECK([ovs-vsctl set Interface p0 cfm_mpid=1])
>  # check cfm status update in OVSDB.
>  for i in `seq 0 14`; do ovs-appctl time/warp 100; done
> -CFM_CHECK_DB([p0], [recv], [1], [], [], [up])
> +CFM_CHECK_DB([p0], [true], [recv], [1], [], [], [up])
>
> -# turn cfm on p1 off, should increment the cfm_flap_count on p0.
> +# turn cfm on p1 on, cfm status of p0 and p1 should all go up.
>  AT_CHECK([ovs-vsctl set interface p1 cfm_mpid=2])
>  for i in `seq 0 14`; do ovs-appctl time/warp 100; done
> -CFM_CHECK_DB([p0], [], [2], [], [2], [up])
> -CFM_CHECK_DB([p1], [], [0], [], [1], [up])
> +CFM_CHECK_DB([p0], [false], [], [2], [], [2], [up])
> +CFM_CHECK_DB([p1], [false], [], [0], [], [1], [up])
> +
> +# turn cfm on p1 off, cfm status of p0 should go down again.
> +AT_CHECK([ovs-vsctl remove int p1 cfm_mpid 2])
> +for i in `seq 0 14`; do ovs-appctl time/warp 100; done
> +CFM_CHECK_DB([p0], [true], [recv], [3], [], [], [up])
>
>  OVS_VSWITCHD_STOP
>  AT_CLEANUP
> --
> 1.7.9.5
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> http://openvswitch.org/mailman/listinfo/dev



More information about the dev mailing list