On Fri, Oct 19, 2018 at 05:51:20PM +0200, Claudio Jeker wrote:
> 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.
> 

OK denis@

> -- 
> :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);
> 

Reply via email to