summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Stapp <mjs@voltanet.io>2019-09-27 12:15:34 -0400
committerMark Stapp <mjs@voltanet.io>2019-09-27 12:15:34 -0400
commit2fc69f03d2f49fcf34948e82e865cd302ae08da0 (patch)
tree8a7d4cd5dc7c4aee567e627593d10fe0fe3f2b39
parent5300176ff82a6ba88e84bbf0eac25a883505b585 (diff)
zebra: during shutdown processing, drop dplane results
Don't process dataplane results in zebra during shutdown (after sigint has been seen). The dplane continues to run in order to clean up, but zebra main just drops results. Signed-off-by: Mark Stapp <mjs@voltanet.io>
-rw-r--r--zebra/main.c3
-rw-r--r--zebra/zebra_rib.c16
-rw-r--r--zebra/zebra_router.h2
3 files changed, 21 insertions, 0 deletions
diff --git a/zebra/main.c b/zebra/main.c
index 99607c0d78..f0225ac5e6 100644
--- a/zebra/main.c
+++ b/zebra/main.c
@@ -142,6 +142,9 @@ static void sigint(void)
zlog_notice("Terminating on signal");
+ atomic_store_explicit(&zrouter.in_shutdown, true,
+ memory_order_relaxed);
+
frr_early_fini();
zebra_dplane_pre_finish();
diff --git a/zebra/zebra_rib.c b/zebra/zebra_rib.c
index 98e66cd017..fef54d5828 100644
--- a/zebra/zebra_rib.c
+++ b/zebra/zebra_rib.c
@@ -3204,6 +3204,7 @@ static int rib_process_dplane_results(struct thread *thread)
{
struct zebra_dplane_ctx *ctx;
struct dplane_ctx_q ctxlist;
+ bool shut_p = false;
/* Dequeue a list of completed updates with one lock/unlock cycle */
@@ -3223,6 +3224,21 @@ static int rib_process_dplane_results(struct thread *thread)
if (ctx == NULL)
break;
+ /* If zebra is shutting down, avoid processing results,
+ * just drain the results queue.
+ */
+ shut_p = atomic_load_explicit(&zrouter.in_shutdown,
+ memory_order_relaxed);
+ if (shut_p) {
+ while (ctx) {
+ dplane_ctx_fini(&ctx);
+
+ ctx = dplane_ctx_dequeue(&ctxlist);
+ }
+
+ continue;
+ }
+
while (ctx) {
switch (dplane_ctx_get_op(ctx)) {
case DPLANE_OP_ROUTE_INSTALL:
diff --git a/zebra/zebra_router.h b/zebra/zebra_router.h
index e50f8a1186..25a7adac11 100644
--- a/zebra/zebra_router.h
+++ b/zebra/zebra_router.h
@@ -74,6 +74,8 @@ struct zebra_mlag_info {
};
struct zebra_router {
+ atomic_bool in_shutdown;
+
/* Thread master */
struct thread_master *master;