On Wed, Oct 17, 2018 at 02:37:48PM +0200, Claudio Jeker wrote:
> I noticed that the throttling for peers which was added some time ago is
> incomplete. The following diff solved these issues.
>
> In rde_update_queue_runner() only process peers which are currently not
> throttled. Additionally only run the runners if not too many imsg are
> pending in the RDE. Both these changes should help imporve responsiveness.
> In the SE only set the throttled flag if the imsg sending was successful.
>
> Does work fine on my systems with little or no effect on convergance time.
> Please test on your systems and look for preformance changes.
Updated version after recent commit.
--
:wq Claudio
Index: rde.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/rde.c,v
retrieving revision 1.437
diff -u -p -r1.437 rde.c
--- rde.c 18 Oct 2018 12:19:09 -0000 1.437
+++ rde.c 19 Oct 2018 15:49:43 -0000
@@ -334,15 +334,16 @@ rde_main(int debug, int verbose)
mctx = LIST_NEXT(mctx, entry);
}
- rde_update_queue_runner();
- for (aid = AID_INET6; aid < AID_MAX; aid++)
- rde_update6_queue_runner(aid);
+ if (ibuf_se && ibuf_se->w.queued < SESS_MSG_HIGH_MARK) {
+ rde_update_queue_runner();
+ for (aid = AID_INET6; aid < AID_MAX; aid++)
+ rde_update6_queue_runner(aid);
+ }
if (rde_dump_pending() &&
ibuf_se_ctl && ibuf_se_ctl->w.queued <= 10)
rde_dump_runner();
- if (softreconfig) {
+ if (softreconfig)
rde_reload_runner();
- }
}
/* do not clean up on shutdown on production, it takes ages. */
@@ -2664,6 +2665,8 @@ rde_update_queue_runner(void)
continue;
if (peer->state != PEER_UP)
continue;
+ if (peer->throttled)
+ continue;
eor = 0;
/* first withdraws */
wpos = 2; /* reserve space for the length field */
@@ -2730,6 +2733,8 @@ rde_update6_queue_runner(u_int8_t aid)
continue;
if (peer->state != PEER_UP)
continue;
+ if (peer->throttled)
+ continue;
len = sizeof(queue_buf) - MSGSIZE_HEADER;
b = up_dump_mp_unreach(queue_buf, &len, peer, aid);
@@ -2753,6 +2758,8 @@ rde_update6_queue_runner(u_int8_t aid)
if (peer->conf.id == 0)
continue;
if (peer->state != PEER_UP)
+ continue;
+ if (peer->throttled)
continue;
len = sizeof(queue_buf) - MSGSIZE_HEADER;
r = up_dump_mp_reach(queue_buf, &len, peer, aid);
Index: session.c
===================================================================
RCS file: /cvs/src/usr.sbin/bgpd/session.c,v
retrieving revision 1.369
diff -u -p -r1.369 session.c
--- session.c 29 Sep 2018 07:58:06 -0000 1.369
+++ session.c 17 Oct 2018 12:18:51 -0000
@@ -1382,7 +1382,8 @@ session_sendmsg(struct bgp_msg *msg, str
if (!p->throttled && p->wbuf.queued > SESS_MSG_HIGH_MARK) {
if (imsg_rde(IMSG_XOFF, p->conf.id, NULL, 0) == -1)
log_peer_warn(&p->conf, "imsg_compose XOFF");
- p->throttled = 1;
+ else
+ p->throttled = 1;
}
free(msg);
@@ -1773,7 +1774,8 @@ session_dispatch_msg(struct pollfd *pfd,
if (p->throttled && p->wbuf.queued < SESS_MSG_LOW_MARK) {
if (imsg_rde(IMSG_XON, p->conf.id, NULL, 0) == -1)
log_peer_warn(&p->conf, "imsg_compose XON");
- p->throttled = 0;
+ else
+ p->throttled = 0;
}
if (!(pfd->revents & POLLIN))
return (1);