Some types noted below, otherwise:

Acked-by: Jarno Rajahalme <ja...@ovn.org>

> On Apr 26, 2017, at 3:38 PM, Andy Zhou <az...@ovn.org> wrote:
> 
> 'appctl exit' stops the running vswitchd daemon, without releasing
> the datapath resources (such as bridges and ports) that vswitchd
> has created.  This is expected when vswitchd is to be relaunched, to
> reduce the perturbation of exiting traffic and connections.
> 
> However, when vswitchd is intended to be shutdown permanently, it
> is desirable not to leak datapath resources.  In theory, this can be
> achieved by removing the corresponding configurations from
> OVSDB before shutting down vswitchd. However it is not always
> possible in practice. Sometimes it is convenient and robust for
> vswitchd to release all datapath resources that it has configured.
> Add 'appctl exit --cleanup' option for this use case.
> 
> Signed-off-by: Andy Zhou <az...@ovn.org>
> 
> ---
> v1->v2:
>       remove 'appctl quit', Change to 'appctl exit --cleanup'
>       Add more details to the commit message.
> ---
> NEWS                       |  1 +
> ofproto/ofproto-dpif.c     | 11 +++++++----
> ofproto/ofproto-provider.h |  2 +-
> ofproto/ofproto.c          |  2 +-
> vswitchd/bridge.c          |  4 ++--
> vswitchd/bridge.h          |  4 +++-
> vswitchd/ovs-vswitchd.8.in |  7 +++++--
> vswitchd/ovs-vswitchd.c    | 23 ++++++++++++++++-------
> 8 files changed, 36 insertions(+), 18 deletions(-)
> 
> diff --git a/NEWS b/NEWS
> index ea97d84a2dea..ee50c6660468 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -26,6 +26,7 @@ Post-v2.7.0
>      * Bundles now support hashing by just nw_src or nw_dst.
>      * The "learn" action now supports a "limit" option (see ovs-ofctl(8)).
>      * The port status bit OFPPS_LIVE now reflects link aliveness.
> +   - Add --cleanup option to command 'ovs-appctl exit' (see ovs-vswitchd(8)).
> 
> v2.7.0 - 21 Feb 2017
> ---------------------
> diff --git a/ofproto/ofproto-dpif.c b/ofproto/ofproto-dpif.c
> index c73c2738c91c..bd2eaa60d36b 100644
> --- a/ofproto/ofproto-dpif.c
> +++ b/ofproto/ofproto-dpif.c
> @@ -645,7 +645,7 @@ dealloc(struct ofproto *ofproto_)
> }
> 
> static void
> -close_dpif_backer(struct dpif_backer *backer)
> +close_dpif_backer(struct dpif_backer *backer, bool del)
> {
>     ovs_assert(backer->refcount > 0);
> 
> @@ -661,6 +661,9 @@ close_dpif_backer(struct dpif_backer *backer)
>     shash_find_and_delete(&all_dpif_backers, backer->type);
>     free(backer->type);
>     free(backer->dp_version_string);
> +    if (del) {
> +        dpif_delete(backer->dpif);
> +    }
>     dpif_close(backer->dpif);
>     free(backer);
> }
> @@ -772,7 +775,7 @@ open_dpif_backer(const char *type, struct dpif_backer 
> **backerp)
>     if (error) {
>         VLOG_ERR("failed to listen on datapath of type %s: %s",
>                  type, ovs_strerror(error));
> -        close_dpif_backer(backer);
> +        close_dpif_backer(backer, false);
>         return error;
>     }
> 
> @@ -1452,7 +1455,7 @@ add_internal_flows(struct ofproto_dpif *ofproto)
> }
> 
> static void
> -destruct(struct ofproto *ofproto_)
> +destruct(struct ofproto *ofproto_, bool del)
> {
>     struct ofproto_dpif *ofproto = ofproto_dpif_cast(ofproto_);
>     struct ofproto_async_msg *am;
> @@ -1505,7 +1508,7 @@ destruct(struct ofproto *ofproto_)
> 
>     seq_destroy(ofproto->ams_seq);
> 
> -    close_dpif_backer(ofproto->backer);
> +    close_dpif_backer(ofproto->backer, del);
> }
> 
> static int
> diff --git a/ofproto/ofproto-provider.h b/ofproto/ofproto-provider.h
> index b7b12cdfd5f4..ef993d0afc4d 100644
> --- a/ofproto/ofproto-provider.h
> +++ b/ofproto/ofproto-provider.h
> @@ -828,7 +828,7 @@ struct ofproto_class {
>      */
>     struct ofproto *(*alloc)(void);
>     int (*construct)(struct ofproto *ofproto);
> -    void (*destruct)(struct ofproto *ofproto);
> +    void (*destruct)(struct ofproto *ofproto, bool del);
>     void (*dealloc)(struct ofproto *ofproto);
> 
>     /* Performs any periodic activity required by 'ofproto'.  It should:
> diff --git a/ofproto/ofproto.c b/ofproto/ofproto.c
> index ca0f3e49bd67..7bc7b7f99d0d 100644
> --- a/ofproto/ofproto.c
> +++ b/ofproto/ofproto.c
> @@ -1651,7 +1651,7 @@ ofproto_destroy(struct ofproto *p, bool del)
>         free(usage);
>     }
> 
> -    p->ofproto_class->destruct(p);
> +    p->ofproto_class->destruct(p, del);
> 
>     /* We should not postpone this because it involves deleting a listening
>      * socket which we may want to reopen soon. 'connmgr' may be used by other
> diff --git a/vswitchd/bridge.c b/vswitchd/bridge.c
> index ebb6249416fa..e741f34f19ec 100644
> --- a/vswitchd/bridge.c
> +++ b/vswitchd/bridge.c
> @@ -496,14 +496,14 @@ bridge_init(const char *remote)
> }
> 
> void
> -bridge_exit(void)
> +bridge_exit(bool delete_datpath)

->”delete_datapath”

> {
>     struct bridge *br, *next_br;
> 
>     if_notifier_destroy(ifnotifier);
>     seq_destroy(ifaces_changed);
>     HMAP_FOR_EACH_SAFE (br, next_br, node, &all_bridges) {
> -        bridge_destroy(br, false);
> +        bridge_destroy(br, delete_datpath);

here too.

>     }
>     ovsdb_idl_destroy(idl);
> }
> diff --git a/vswitchd/bridge.h b/vswitchd/bridge.h
> index 3783a21e3b4c..7835611568cf 100644
> --- a/vswitchd/bridge.h
> +++ b/vswitchd/bridge.h
> @@ -16,10 +16,12 @@
> #ifndef VSWITCHD_BRIDGE_H
> #define VSWITCHD_BRIDGE_H 1
> 
> +#include <stdbool.h>
> +
> struct simap;
> 
> void bridge_init(const char *remote);
> -void bridge_exit(void);
> +void bridge_exit(bool delete_datpath);

ditto.

> 
> void bridge_run(void);
> void bridge_wait(void);
> diff --git a/vswitchd/ovs-vswitchd.8.in b/vswitchd/ovs-vswitchd.8.in
> index 8496aa68af97..9fb1f774a474 100644
> --- a/vswitchd/ovs-vswitchd.8.in
> +++ b/vswitchd/ovs-vswitchd.8.in
> @@ -109,8 +109,11 @@ configuration.
> described below.  The command descriptions assume an understanding of
> how to configure Open vSwitch.
> .SS "GENERAL COMMANDS"
> -.IP "\fBexit\fR"
> -Causes \fBovs\-vswitchd\fR to gracefully terminate.
> +.IP "\fBexit\fR \fI--cleanup\fR"
> +Causes \fBovs\-vswitchd\fR to gracefully terminate. If \fI--cleanup\fR
> +is specified, release datapath resources configured by \fBovs\-vswitchd\fR.
> +Otherwise, datapath resources remains as is.

->”Otherwise, datapath flows and other resources remain undeleted.”

> +.
> .IP "\fBqos/show-types\fR \fIinterface\fR"
> Queries the interface for a list of Quality of Service types that are
> configurable via Open vSwitch for the given \fIinterface\fR.
> diff --git a/vswitchd/ovs-vswitchd.c b/vswitchd/ovs-vswitchd.c
> index bed3fb5c374d..7de6d89abbea 100644
> --- a/vswitchd/ovs-vswitchd.c
> +++ b/vswitchd/ovs-vswitchd.c
> @@ -60,13 +60,19 @@ static unixctl_cb_func ovs_vswitchd_exit;
> static char *parse_options(int argc, char *argv[], char **unixctl_path);
> OVS_NO_RETURN static void usage(void);
> 
> +struct ovs_vswitchd_exit_args {
> +    bool *exiting;
> +    bool *cleanup;
> +};
> +
> int
> main(int argc, char *argv[])
> {
>     char *unixctl_path = NULL;
>     struct unixctl_server *unixctl;
>     char *remote;
> -    bool exiting;
> +    bool exiting, cleanup;
> +    struct ovs_vswitchd_exit_args exit_args = {&exiting, &cleanup};
>     int retval;
> 
>     set_program_name(argv[0]);
> @@ -92,12 +98,14 @@ main(int argc, char *argv[])
>     if (retval) {
>         exit(EXIT_FAILURE);
>     }
> -    unixctl_command_register("exit", "", 0, 0, ovs_vswitchd_exit, &exiting);
> +    unixctl_command_register("exit", "[--cleanup]", 0, 1,
> +                             ovs_vswitchd_exit, &exit_args);
> 
>     bridge_init(remote);
>     free(remote);
> 
>     exiting = false;
> +    cleanup = false;
>     while (!exiting) {
>         memory_run();
>         if (memory_should_report()) {
> @@ -124,7 +132,7 @@ main(int argc, char *argv[])
>             exiting = true;
>         }
>     }
> -    bridge_exit();
> +    bridge_exit(cleanup);
>     unixctl_server_destroy(unixctl);
>     service_stop();
> 
> @@ -265,10 +273,11 @@ usage(void)
> }
> 
> static void
> -ovs_vswitchd_exit(struct unixctl_conn *conn, int argc OVS_UNUSED,
> -                  const char *argv[] OVS_UNUSED, void *exiting_)
> +ovs_vswitchd_exit(struct unixctl_conn *conn, int argc,
> +                  const char *argv[], void *exit_args_)
> {
> -    bool *exiting = exiting_;
> -    *exiting = true;
> +    struct ovs_vswitchd_exit_args *exit_args = exit_args_;
> +    *exit_args->exiting = true;
> +    *exit_args->cleanup = argc == 2 && !strcmp(argv[1], "--cleanup");
>     unixctl_command_reply(conn, NULL);
> }
> -- 
> 1.8.3.1
> 
> _______________________________________________
> dev mailing list
> d...@openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev

_______________________________________________
dev mailing list
d...@openvswitch.org
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to