diff mbox series

[ovs-dev,v5,13/21] ovn-nbctl: Introduce a poll_timer based wait timeout.

Message ID 20180719135126.19636-14-jkbs@redhat.com
State Accepted
Headers show
Series Daemon mode for ovn-nbctl | expand

Commit Message

Jakub Sitnicki July 19, 2018, 1:51 p.m. UTC
Extend the main loop and the command runner so that the caller can
specify a timeout for poll_block(). This will allow us to break out of
the main loop when waiting on IDL, like in the blocked '--wait=sb/hv
sync' case.

Signed-off-by: Jakub Sitnicki <jkbs@redhat.com>
---
 ovn/utilities/ovn-nbctl.c | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)
diff mbox series

Patch

diff --git a/ovn/utilities/ovn-nbctl.c b/ovn/utilities/ovn-nbctl.c
index c7f03cd21..b84976b26 100644
--- a/ovn/utilities/ovn-nbctl.c
+++ b/ovn/utilities/ovn-nbctl.c
@@ -37,6 +37,7 @@ 
 #include "svec.h"
 #include "table.h"
 #include "timeval.h"
+#include "timer.h"
 #include "util.h"
 #include "openvswitch/vlog.h"
 
@@ -87,13 +88,16 @@  static char * OVS_WARN_UNUSED_RESULT run_prerequisites(struct ctl_command[],
                                                        struct ovsdb_idl *);
 static char * OVS_WARN_UNUSED_RESULT do_nbctl(const char *args,
                                               struct ctl_command *, size_t n,
-                                              struct ovsdb_idl *, bool *retry);
+                                              struct ovsdb_idl *,
+                                              const struct timer *,
+                                              bool *retry);
 static const struct nbrec_dhcp_options *dhcp_options_get(
     struct ctl_context *ctx, const char *id, bool must_exist);
 static char * OVS_WARN_UNUSED_RESULT main_loop(const char *args,
                                                struct ctl_command *commands,
                                                size_t n_commands,
-                                               struct ovsdb_idl *idl);
+                                               struct ovsdb_idl *idl,
+                                               const struct timer *);
 
 int
 main(int argc, char *argv[])
@@ -134,7 +138,7 @@  main(int argc, char *argv[])
         ctl_fatal("%s", error);
     }
 
-    error = main_loop(args, commands, n_commands, idl);
+    error = main_loop(args, commands, n_commands, idl, NULL);
     if (error) {
         ctl_fatal("%s", error);
     }
@@ -155,7 +159,7 @@  main(int argc, char *argv[])
 
 static char *
 main_loop(const char *args, struct ctl_command *commands, size_t n_commands,
-          struct ovsdb_idl *idl)
+          struct ovsdb_idl *idl, const struct timer *wait_timeout)
 {
     unsigned int seqno;
 
@@ -179,7 +183,8 @@  main_loop(const char *args, struct ctl_command *commands, size_t n_commands,
             seqno = ovsdb_idl_get_seqno(idl);
 
             bool retry;
-            char *error = do_nbctl(args, commands, n_commands, idl, &retry);
+            char *error = do_nbctl(args, commands, n_commands, idl,
+                                   wait_timeout, &retry);
             if (error) {
                 return error;
             }
@@ -4161,7 +4166,7 @@  run_prerequisites(struct ctl_command *commands, size_t n_commands,
 
 static char *
 do_nbctl(const char *args, struct ctl_command *commands, size_t n_commands,
-         struct ovsdb_idl *idl, bool *retry)
+         struct ovsdb_idl *idl, const struct timer *wait_timeout, bool *retry)
 {
     struct ovsdb_idl_txn *txn;
     enum ovsdb_idl_txn_status status;
@@ -4288,8 +4293,6 @@  do_nbctl(const char *args, struct ctl_command *commands, size_t n_commands,
         OVS_NOT_REACHED();
     }
 
-    ovsdb_symbol_table_destroy(symtab);
-
     for (c = commands; c < &commands[n_commands]; c++) {
         struct ds *ds = &c->output;
 
@@ -4333,11 +4336,19 @@  do_nbctl(const char *args, struct ctl_command *commands, size_t n_commands,
                 }
             }
             ovsdb_idl_wait(idl);
+            if (wait_timeout) {
+                timer_wait(wait_timeout);
+            }
             poll_block();
+            if (wait_timeout && timer_expired(wait_timeout)) {
+                error = xstrdup("timeout expired");
+                goto out_error;
+            }
         }
     done: ;
     }
 
+    ovsdb_symbol_table_destroy(symtab);
     ovsdb_idl_txn_destroy(txn);
     the_idl_txn = NULL;