Is it platform specific
generic
Importance or Severity
High
Description of the bug
SYSTEM_DEFAULTS|swss_zmq is a single knob that enables ZMQ mode on both the northbound route path (fpmsyncd -> orchagent RouteOrch) and the southbound path (orchagent -> syncd). When it is enabled (CONFIG_DB SYSTEM_DEFAULTS|swss_zmq = enabled), fpmsyncd forwards route updates to orchagent over the northbound ZMQ channel (tcp://localhost:8101/8102) instead of via Redis keyspace notifications. This bug is on that northbound route path.
Under a burst of route programming (e.g. config reload, a large route add/withdraw, or simultaneous route churn on multiple ASICs' bgp containers), the orchagent route-ZMQ consumer cannot drain the queue fast enough. The ZMQ send buffer reaches its high-water mark, and fpmsyncd repeatedly fails to send:
ERR bgpN#fpmsyncd: :- sendMsg: zmq send failed, endpoint: tcp://localhost:8101, zmqerrno: 11: Resource temporarily unavailable
fpmsyncd retries for a bounded period and then gives up on the send. Because the ZMQ send is attempted before the route is persisted, the affected update is neither delivered to orchagent nor written to APP_DB, and there is no automatic retry/replay — so the route update can be silently lost until the next full route re-sync.
This is functionally harmful (potential dataplane route loss), not just log noise. The code path is generic (same producer/consumer code on virtual and real hardware); the risk grows with route scale.
Steps to Reproduce
- Bring up a SONiC switch (observed on a multi-ASIC T2 topology; the ZMQ path is platform-generic).
- Enable ZMQ mode: set
CONFIG_DB SYSTEM_DEFAULTS|swss_zmq status=enabled and restart swss (this enables both the northbound route ZMQ and southbound syncd ZMQ; the route producer/consumer path is the one exercised here).
- Generate a large route burst — e.g.
config reload, or add/remove a large batch of routes, or drive route churn on each ASIC's bgp/fpmsyncd simultaneously.
- Watch
fpmsyncd in syslog (/var/log/syslog, bgpN#fpmsyncd).
Actual Behavior and Expected Behavior
Actual: under the burst, fpmsyncd logs sendMsg: zmq send failed ... zmqerrno: 11 (EAGAIN / Resource temporarily unavailable), the send is abandoned, and the affected route update is dropped (not delivered to orchagent, not persisted to APP_DB) with no automatic recovery.
Expected: route updates are reliably delivered and persisted even under burst load; fpmsyncd must not silently drop route updates when the ZMQ channel is temporarily full.
Relevant log output
ERR bgp0#fpmsyncd: :- sendMsg: zmq send failed, endpoint: tcp://localhost:8101, zmqerrno: 11: Resource temporarily unavailable
ERR bgp1#fpmsyncd: :- sendMsg: zmq send failed, endpoint: tcp://localhost:8102, zmqerrno: 11: Resource temporarily unavailable
Output of show version, show techsupport
Observed on a SONiC master-based image (multi-ASIC T2). Full techsupport not captured from the observing run;
reproduces wherever SYSTEM_DEFAULTS|swss_zmq is enabled and a route burst is applied.
Is it platform specific
generic
Importance or Severity
High
Description of the bug
SYSTEM_DEFAULTS|swss_zmqis a single knob that enables ZMQ mode on both the northbound route path (fpmsyncd->orchagentRouteOrch) and the southbound path (orchagent->syncd). When it isenabled(CONFIG_DBSYSTEM_DEFAULTS|swss_zmq=enabled),fpmsyncdforwards route updates toorchagentover the northbound ZMQ channel (tcp://localhost:8101/8102) instead of via Redis keyspace notifications. This bug is on that northbound route path.Under a burst of route programming (e.g.
config reload, a large route add/withdraw, or simultaneous route churn on multiple ASICs'bgpcontainers), theorchagentroute-ZMQ consumer cannot drain the queue fast enough. The ZMQ send buffer reaches its high-water mark, andfpmsyncdrepeatedly fails to send:fpmsyncdretries for a bounded period and then gives up on the send. Because the ZMQ send is attempted before the route is persisted, the affected update is neither delivered to orchagent nor written to APP_DB, and there is no automatic retry/replay — so the route update can be silently lost until the next full route re-sync.This is functionally harmful (potential dataplane route loss), not just log noise. The code path is generic (same producer/consumer code on virtual and real hardware); the risk grows with route scale.
Steps to Reproduce
CONFIG_DBSYSTEM_DEFAULTS|swss_zmqstatus=enabledand restartswss(this enables both the northbound route ZMQ and southbound syncd ZMQ; the route producer/consumer path is the one exercised here).config reload, or add/remove a large batch of routes, or drive route churn on each ASIC'sbgp/fpmsyncdsimultaneously.fpmsyncdin syslog (/var/log/syslog,bgpN#fpmsyncd).Actual Behavior and Expected Behavior
Actual: under the burst,
fpmsyncdlogssendMsg: zmq send failed ... zmqerrno: 11 (EAGAIN / Resource temporarily unavailable), the send is abandoned, and the affected route update is dropped (not delivered to orchagent, not persisted to APP_DB) with no automatic recovery.Expected: route updates are reliably delivered and persisted even under burst load;
fpmsyncdmust not silently drop route updates when the ZMQ channel is temporarily full.Relevant log output
Output of
show version,show techsupport