]> git.puffer.fish Git - mirror/frr.git/commitdiff
lib: Create a thread for reading in the cli
authorDonald Sharp <sharpd@cumulusnetworks.com>
Tue, 8 May 2018 12:35:06 +0000 (08:35 -0400)
committerDonald Sharp <sharpd@cumulusnetworks.com>
Tue, 19 Jun 2018 12:43:59 +0000 (08:43 -0400)
The read in of cli was happening prior to thread
event handling for non-integrated configs.  This
is interesting for 2 reasons:

1) Read-in of integrated configs was after thread
event loop startup, so we had a difference of behavior

2) Read-in can cause a series of events that cause
us to attempt to communicate with zebra.  The zebra
zapi connection only happens after the thread event
loop has been started.  This can cause data that
is being written down to zebra to be lost and
no real way to notice that this has happened and
to recover gracefully.

Modify the code to create a thread event for read
in of client config.

Signed-off-by: Donald Sharp <sharpd@cumulusnetworks.com>
lib/libfrr.c
lib/libfrr.h

index 4620cb25862ec8812e73c11ce87d7e5be6be5b2d..4f3b8c66d660a4bb9e1164afc20db16f2cc61277 100644 (file)
@@ -721,20 +721,37 @@ static void frr_daemonize(void)
        frr_daemon_wait(fds[0]);
 }
 
-void frr_config_fork(void)
+/*
+ * Why is this a thread?
+ *
+ * The read in of config for integrated config happens *after*
+ * thread execution starts( because it is passed in via a vtysh -b -n )
+ * While if you are not using integrated config we want the ability
+ * to read the config in after thread execution starts, so that
+ * we can match this behavior.
+ */
+static int frr_config_read_in(struct thread *t)
 {
-       hook_call(frr_late_init, master);
-
        if (!vty_read_config(di->config_file, config_default) &&
            di->backup_config_file) {
                zlog_info("Attempting to read backup config file: %s specified",
                          di->backup_config_file);
                vty_read_config(di->backup_config_file, config_default);
        }
+       return 0;
+}
+
+void frr_config_fork(void)
+{
+       hook_call(frr_late_init, master);
 
        /* Don't start execution if we are in dry-run mode */
-       if (di->dryrun)
+       if (di->dryrun) {
+               frr_config_read_in(NULL);
                exit(0);
+       }
+
+       thread_add_event(master, frr_config_read_in, NULL, 0, &di->read_in);
 
        if (di->daemon_mode || di->terminal)
                frr_daemonize();
index bd572cce1b2b1e920b5ec2f43061c2221c06692e..1c744ee1b90319c43d374a96521f537d2ade46c2 100644 (file)
@@ -50,6 +50,8 @@ struct frr_daemon_info {
        bool dryrun;
        bool daemon_mode;
        bool terminal;
+
+       struct thread *read_in;
        const char *config_file;
        const char *backup_config_file;
        const char *pid_file;