[ovs-dev] [PATCH] ovn-northd: Add appctl support.

Alex Wang alexw at nicira.com
Thu May 21 22:20:48 UTC 2015


This commit adds appctl support to ovn-northd and the 'exit' command.
The 'exit' command can be used in autotest for stopping the ovn-northd.

Signed-off-by: Alex Wang <alexw at nicira.com>
---
 ovn/northd/ovn-northd.c |   35 +++++++++++++++++++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)

diff --git a/ovn/northd/ovn-northd.c b/ovn/northd/ovn-northd.c
index cfad6be..2676b0d 100644
--- a/ovn/northd/ovn-northd.c
+++ b/ovn/northd/ovn-northd.c
@@ -32,12 +32,15 @@
 #include "poll-loop.h"
 #include "stream.h"
 #include "stream-ssl.h"
+#include "unixctl.h"
 #include "util.h"
 #include "uuid.h"
 #include "openvswitch/vlog.h"
 
 VLOG_DEFINE_THIS_MODULE(ovn_northd);
 
+static unixctl_cb_func ovn_northd_exit;
+
 struct northd_context {
     struct ovsdb_idl *ovnnb_idl;
     struct ovsdb_idl *ovnsb_idl;
@@ -767,6 +770,9 @@ main(int argc, char *argv[])
     };
     bool ovnnb_changes_pending = false;
     bool ovn_changes_pending = false;
+    struct unixctl_server *unixctl;
+    int retval;
+    bool exiting;
 
     fatal_ignore_sigpipe();
     set_program_name(argv[0]);
@@ -774,7 +780,15 @@ main(int argc, char *argv[])
     vlog_set_levels(&VLM_reconnect, VLF_ANY_DESTINATION, VLL_WARN);
     parse_options(argc, argv);
 
-    daemonize();
+    daemonize_start();
+
+    retval = unixctl_server_create(NULL, &unixctl);
+    if (retval) {
+        exit(EXIT_FAILURE);
+    }
+    unixctl_command_register("exit", "", 0, 0, ovn_northd_exit, &exiting);
+
+    daemonize_complete();
 
     nbrec_init();
     sbrec_init();
@@ -820,9 +834,11 @@ main(int argc, char *argv[])
 
     ovnnb_seqno = ovsdb_idl_get_seqno(ovnnb_idl);
     ovn_seqno = ovsdb_idl_get_seqno(ovnsb_idl);
-    for (;;) {
+    exiting = false;
+    while (!exiting) {
         ovsdb_idl_run(ovnnb_idl);
         ovsdb_idl_run(ovnsb_idl);
+        unixctl_server_run(unixctl);
 
         if (!ovsdb_idl_is_alive(ovnnb_idl)) {
             int retval = ovsdb_idl_get_last_error(ovnnb_idl);
@@ -935,12 +951,27 @@ main(int argc, char *argv[])
             if (ctx.ovnsb_txn) {
                 ovsdb_idl_txn_wait(ctx.ovnsb_txn);
             }
+            unixctl_server_wait(unixctl);
+            if (exiting) {
+                poll_immediate_wake();
+            }
             poll_block();
         }
     }
 
+    unixctl_server_destroy(unixctl);
     ovsdb_idl_destroy(ovnsb_idl);
     ovsdb_idl_destroy(ovnnb_idl);
 
     exit(res);
 }
+
+static void
+ovn_northd_exit(struct unixctl_conn *conn, int argc OVS_UNUSED,
+                const char *argv[] OVS_UNUSED, void *exiting_)
+{
+    bool *exiting = exiting_;
+    *exiting = true;
+
+    unixctl_command_reply(conn, NULL);
+}
-- 
1.7.9.5




More information about the dev mailing list