Hiltjo Posthuma([email protected]) on 2017.05.07 14:38:22 +0200:
> On Fri, May 05, 2017 at 04:05:09PM +0200, Maxim Bourmistrov wrote:
> > 
> > > 5 maj 2017 kl. 15:55 skrev Maxim Bourmistrov <[email protected]>:
> > > 
> > > 
> > >> 5 maj 2017 kl. 14:41 skrev Hiltjo Posthuma <[email protected]>:
> > >> 
> > >> On Fri, May 05, 2017 at 12:30:56PM +0200, Maxim Bourmistrov wrote:
> > >>> 
> > >>> Hey,
> > >>> on OpenBSD 6.0-stable I have following configuration for relayd:
> > >>> 
> > >>> ????????????snip?????????????????????
> > >>> interval 10
> > >>> timeout 1200
> > >>> prefork 15
> > >>> log all
> > >>> ??????????????????????????????????????????????????????
> > >>> 
> > >>> Respective login.conf to spawn more relayd procs:
> > >>> 
> > >>> relayd:\
> > >>>       :maxproc-max=31:\
> > >>>       :maxproc-cur=15:\
> > >>>       :openfiles=65536:\
> > >>>       :tc=daemon:
> > >>> 
> > >>> 
> > >>> With config options above moved to a 6.1 creates following:
> > >>> 
> > >>> relayd starts but brings up no more that 3 relay-processes.
> > >>> Also after start up it refuses to do any checks configured (in my 
> > >>> simple test I used check tcp) 
> > >>> 
> > >>> [mxb-test]-[12:21:41]# relayctl sh su
> > >>> Id      Type            Name                            Avlblty Status
> > >>> 1       relay           rabbitmq                                active
> > >>> 1       table           rabbitmqpool:5672                       empty
> > >>> 1       host            10.5.96.8                               unknown
> > >>> 2       table           rabbitmqfallback:5672                   empty
> > >>> 2       host            10.5.96.9                               unknown
> > >>> 
> > >>> 
> > >>> Changing ???prefork??? from 15 to 3 makes it work.
> > >>> 
> > >>> Is this a bug?
> > >>> 
> > >>> Br
> > >>> 
> > >> 
> > >> Hey,
> > >> 
> > >> This is a random guess since you haven't posted the whole config, but I 
> > >> think
> > >> it has bitten me too sometime:
> > >> 
> > >> Do you have the global options such as prefork defined before your
> > >> relays and routes or not?
> > >> 
> > >> The order of the global options matter. If the global options are set 
> > >> after
> > >> the table they are not initialized on the tables and can actually crash 
> > >> relayd.
> > >> This is because the health checking uses a different prefork value and 
> > >> checks
> > >> the "wrong" amount.
> > >> 
> > >> I'm not sure, but I think it is not a bug: it is documented in 
> > >> relayd.conf(5).
> > >> 
> > >> Thinking about it: would it be acceptable if `relayd -n` shows a warning 
> > >> if
> > >> global options are defined in the wrong order? I can write the patch for 
> > >> it
> > >> if it makes sense.
> > >> 
> > >> I hope this helps you in some way,
> > >> 
> > >> -- 
> > >> Kind regards,
> > >> Hiltjo
> > > 
> > 8< snip snip >8
> > 
> 
> Hey,
> 
> Here is a (rough) patch/idea to check if global options are used after
> non-global options such as tables, routes, redirects etc. This makes sure a
> value of `timeout`, `prefork` etc that are set on tables are are not different
> from the health-checking (which could crash relayd at run-time).
> 
> It has bitten a few people and me :)

yes
 
> The patch will show an error in this case when checking the config with
> `relayd -n`.
>
> Please let me know if it makes sense.

well, it does not fix the underlying problem, just makes sure the user
notices.

We should do something, i'm just not sure like this.
 
> Above is the thread from @misc. Below is the (rough) patch:
> 
> 
> diff --git a/usr.sbin/relayd/parse.y b/usr.sbin/relayd/parse.y
> index 57ab789db8f..c768b657d69 100644
> --- a/usr.sbin/relayd/parse.y
> +++ b/usr.sbin/relayd/parse.y
> @@ -375,7 +375,18 @@ sendbuf          : NOTHING               {
>               }
>               ;
>  
> -main         : INTERVAL NUMBER       {
> +main         : /* empty */
> +             {
> +                     if (conf && (conf->sc_rdrcount || conf->sc_tablecount ||
> +                         conf->sc_protocount || conf->sc_relaycount ||
> +                         conf->sc_routercount || conf->sc_routecount)) {
> +                             yyerror("global options used after non-global 
> options");
> +                             YYERROR;
> +                     }
> +             }
> +             main_l;
> +
> +main_l               : INTERVAL NUMBER       {
>                       if ((conf->sc_conf.interval.tv_sec = $2) < 0) {
>                               yyerror("invalid interval: %d", $2);
>                               YYERROR;
> 
> -- 
> Kind regards,
> Hiltjo
> 

Reply via email to