vrrp: force sleeps between timer events 13/42313/3
authorMatthew Smith <[email protected]>
Mon, 27 Jan 2025 19:49:07 +0000 (19:49 +0000)
committerBenoit Ganne <[email protected]>
Wed, 12 Feb 2025 13:48:57 +0000 (13:48 +0000)
Adding a virtual MAC to some NICs can take a significant amount of time.
If a lot of VRs enter the master state around the same time, the process
node can stay active for a very long time processing all of the transitions.

Try to force a 10 us sleep between processing events to ensure that the
process node does not prevent API messages and RPCs from being handled for
an extended period.

Type: improvement

Signed-off-by: Matthew Smith <[email protected]>
Change-Id: I400a7d395b4c0fec371f70d359e9d184ae79645e

src/plugins/vrrp/vrrp_periodic.c

index 5f9d7ae..e3a374a 100644 (file)
@@ -187,7 +187,19 @@ vrrp_periodic_process (vlib_main_t * vm,
          timer = pool_elt_at_index (pm->vr_timers, next_timer);
          timeout = timer->expire_time - now;
 
-         vlib_process_wait_for_event_or_clock (vm, timeout);
+         /*
+          * Adding a virtual MAC to some NICs can take a significant amount
+          * of time (~1s). If a lot of VRs enter the master state around the
+          * same time, the process node can stay active for a very long time
+          * processing all of the transitions.
+          *
+          * Try to force a 10us sleep between processing events to ensure
+          * that the process node does not prevent API messages and RPCs
+          * from being handled for an extended period. This prevents
+          * vlib_process_wait_for_event_or_clock() from returning
+          * immediately.
+          */
+         vlib_process_wait_for_event_or_clock (vm, clib_max (timeout, 10e-6));
        }
 
       event_type = vlib_process_get_events (vm, (uword **) & event_data);