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;