On Thu, May 30, 2013 at 1:36 PM, Ben Pfaff <b...@nicira.com> wrote:

> On Thu, May 30, 2013 at 09:19:35AM +0000, Gurucharan Shetty wrote:
> > While upgrading openvswitch, it helps to restore openflow flows before
> > starting packet processing.  Typically we want to restart openvswitch,
> > add the openflow flows and then start packet processing.
> >
> > To do this, we look for the other_config:flow-restore-wait column
> > in the Open_vSwitch table during startup. If set as true, we disable
> > receiving packets from the datapath, expiring or flushing flows and
> > running any periodic ofproto activities. This option does not prevent
> > the addition and deletion of ports. Once this option is set to false,
> > we return to normal processing.
> >
> > An upcoming commit will use this feature in Open vSwitch startup scripts.
> >
> > Bug #16086.
> > Signed-off-by: Gurucharan Shetty <gshe...@nicira.com>
>
> Thanks!  I think that this is close.  Sorry to nitpick, but I still
> have some comments.
>
> > @@ -1025,7 +1041,10 @@ type_run(const char *type)
> >          }
> >      }
> >
> > -    if (timer_expired(&backer->next_expiration)) {
> > +    if (!backer->recv_set_enable) {
> > +        /* A minimum of 1000 ms delay. */
>
> Doesn't think actually cause the main loop to wake up after at most
> 1000 ms, that is, a *maximum* of 1000 ms?  Or perhaps I misunderstand
> the intent.
>
> I was intending to say that don't wake up immediately because of me. I can
wait till 1000 ms.
Previously expire() would setup a MIN(x, 1000). Since I do not have 'x'
now, I set 1000 ms.
I think we both mean the same thing? How would the following sound?
/* Wake up before a max of 1000ms. */


> > +        timer_set_duration(&backer->next_expiration, 1000);
> > +    } else if (timer_expired(&backer->next_expiration)) {
> >          int delay = expire(backer);
> >          timer_set_duration(&backer->next_expiration, delay);
> >      }
>
> Here, in run(), I think that we should always run
> complete_operations(), because this relates to updating the OpenFlow
> flow table.  It looks OK to me to skip the rest:
>
Okay.


> > @@ -1567,6 +1600,12 @@ run(struct ofproto *ofproto_)
> >      struct ofbundle *bundle;
> >      int error;
> >
> > +    /* Do not perform any periodic activity required by 'ofproto' while
> > +     * waiting for flow restore to complete. */
> > +    if (ofproto_get_flow_restore_wait()) {
> > +        return 0;
> > +    }
> > +
> >      if (!clogged) {
> >          complete_operations(ofproto);
> >      }
>
> Similarly, here in wait(), I would suggest we move
> ofproto_get_flow_restore_wait() below the !clogged check:
>
Okay.

> > @@ -1641,6 +1680,10 @@ wait(struct ofproto *ofproto_)
> >      struct ofport_dpif *ofport;
> >      struct ofbundle *bundle;
> >
> > +    if (ofproto_get_flow_restore_wait()) {
> > +        return;
> > +    }
> > +
> >      if (!clogged && !list_is_empty(&ofproto->completions)) {
> >          poll_immediate_wake();
> >      }
>
> > diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> > index 47b13d2..d5df6fa 100644
> > --- a/vswitchd/vswitch.xml
> > +++ b/vswitchd/vswitch.xml
> > @@ -71,6 +71,50 @@
> >          The Citrix XenServer universally unique identifier for the
> physical
> >          host as displayed by <code>xe host-list</code>.
> >        </column>
> > +
> > +      <column name="other_config" key="flow-restore-wait"
> > +              type='{"type": "boolean"}'>
>
> I think we should have <p>...</p> around these paragraphs to make the
> output easier to read:
>
Okay.
I will send a v4.

>
> > +        When <code>ovs-vswitchd</code> starts up, it has an empty flow
> table
> > +        and therefore it handles all arriving packets in its default
> fashion
> > +        according to its configuration, by dropping them or sending
> them to
> > +        an OpenFlow controller or switching them as a standalone switch.
> > +        This behavior is ordinarily desirable.  However, if
> > +        <code>ovs-vswitchd</code> is restarting as part of a
> > +        ``hot-upgrade,'' then this leads to a relatively long period
> during
> > +        which packets are mishandled.
> > +
> > +        This option allows for improvement.  When
> <code>ovs-vswitchd</code>
> > +        starts with this value set as <code>true</code>, it will neither
> > +        flush or expire previously set datapath flows nor will it send
> and
> > +        receive any packets to or from the datapath.  When this value is
> > +        later set to <code>false</code>, <code>ovs-vswitchd</code> will
> > +        start receiving packets from the datapath and re-setup the
> flows.
> > +
> > +        Thus, with this option, the procedure for a hot-upgrade of
> > +        <code>ovs-vswitchd</code> becomes roughly the following:
>
> Thanks,
>
> Ben.
>
_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to