[Babel-users] [PATCH] Add option to consider sysctl write failures as non-fatal.

Dave Taht dave.taht at gmail.com
Mon Aug 10 17:27:42 UTC 2015


Well, it would be better if babel checked to see if the (sometimes
read-only) sysctl value was already correct, instead of blithely
trying to write it.

On Mon, Aug 10, 2015 at 9:43 AM, Jernej Kos <jernej at kos.mx> wrote:
> Hello!
>
> +1 for this patch. We are also running babeld in a Docker container and
> this requires us to run it as a privileged container due to some Docker
> deficiencies in setting network sysctls inside containers.
>
>
> Jernej
>
> On 10. 08. 2015 18:02, Toke Høiland-Jørgensen wrote:
>> Babeld will exit with a fatal error if it is unable to write sysctls.
>> When running in a container, however, /proc/sys may be mounted
>> read-only, which causes babeld to fail.
>>
>> This adds a switch to consider sysctl failures as non-fatal, in which
>> case a warning will be issues rather than having the daemon fail to
>> start.
>>
>> Signed-off-by: Toke Høiland-Jørgensen <toke at toke.dk>
>> ---
>>  babeld.c         |  8 ++++++--
>>  babeld.h         |  1 +
>>  babeld.man       | 12 ++++++++++++
>>  configuration.c  |  3 +++
>>  kernel_netlink.c |  7 ++++++-
>>  5 files changed, 28 insertions(+), 3 deletions(-)
>>
>> diff --git a/babeld.c b/babeld.c
>> index 943f042..45b14fa 100644
>> --- a/babeld.c
>> +++ b/babeld.c
>> @@ -67,6 +67,7 @@ int default_wired_hello_interval = -1;
>>  int resend_delay = -1;
>>  int random_id = 0;
>>  int do_daemonise = 0;
>> +int sysctl_nonfatal = 0;
>>  const char *logfile = NULL,
>>      *pidfile = "/var/run/babeld.pid",
>>      *state_file = "/var/lib/babel-state";
>> @@ -128,7 +129,7 @@ main(int argc, char **argv)
>>
>>      while(1) {
>>          opt = getopt(argc, argv,
>> -                     "m:p:h:H:i:k:A:srR:uS:d:g:lwz:M:t:T:c:C:DL:I:");
>> +                     "m:p:h:H:i:k:A:srR:uS:d:g:lwz:M:t:T:c:C:DL:I:F");
>>          if(opt < 0)
>>              break;
>>
>> @@ -263,6 +264,9 @@ main(int argc, char **argv)
>>          case 'D':
>>              do_daemonise = 1;
>>              break;
>> +     case 'F':
>> +            sysctl_nonfatal = 1;
>> +            break;
>>          case 'L':
>>              logfile = optarg;
>>              break;
>> @@ -800,7 +804,7 @@ main(int argc, char **argv)
>>              "                "
>>              "[-t table] [-T table] [-c file] [-C statement]\n"
>>              "                "
>> -            "[-d level] [-D] [-L logfile] [-I pidfile]\n"
>> +            "[-d level] [-D] [-F] [-L logfile] [-I pidfile]\n"
>>              "                "
>>              "[id] interface...\n",
>>              argv[0]);
>> diff --git a/babeld.h b/babeld.h
>> index 92ce9b5..c1f26fe 100644
>> --- a/babeld.h
>> +++ b/babeld.h
>> @@ -86,6 +86,7 @@ extern time_t reboot_time;
>>  extern int default_wireless_hello_interval, default_wired_hello_interval;
>>  extern int resend_delay;
>>  extern int random_id;
>> +extern int sysctl_nonfatal;
>>  extern int do_daemonise;
>>  extern const char *logfile, *pidfile, *state_file;
>>  extern int link_detect;
>> diff --git a/babeld.man b/babeld.man
>> index ec600c2..7182f30 100644
>> --- a/babeld.man
>> +++ b/babeld.man
>> @@ -135,6 +135,11 @@ Specify a configuration statement directly on the command line.
>>  .B \-D
>>  Daemonise at startup.
>>  .TP
>> +.B \-F
>> +Don't consider failures writing to sysctl as fatal. Warn of the failures, but
>> +continue running. This is useful when running babeld in a container that mounts
>> +/proc/sys as read-only (as systemd-nspawn does, for instance).
>> +.TP
>>  .BI \-L " logfile"
>>  Specify a file to log random ``how do you do?'' messages to.  This
>>  defaults to standard error if not daemonising, and to
>> @@ -253,6 +258,13 @@ This specifies whether to daemonize at startup, and is equivalent to
>>  the command-line option
>>  .BR \-D .
>>  .TP
>> +.BR sysctl-nonfatal " {" true | false }
>> +This controls whether to consider failures writing to sysctl as fatal. If set,
>> +warn of the failures, but continue running. This is useful when running babeld
>> +in a container that mounts /proc/sys as read-only (as systemd-nspawn does, for
>> +instance). Equivalent to the command line option
>> +.BR \-F .
>> +.TP
>>  .BI state-file " filename"
>>  This specifies the name of the file used for preserving long-term
>>  information between invocations of the
>> diff --git a/configuration.c b/configuration.c
>> index 6a9c09d..571e220 100644
>> --- a/configuration.c
>> +++ b/configuration.c
>> @@ -691,6 +691,7 @@ parse_option(int c, gnc_t gnc, void *closure, char *token)
>>                strcmp(token, "link-detect") == 0 ||
>>                strcmp(token, "random-id") == 0 ||
>>                strcmp(token, "daemonise") == 0 ||
>> +              strcmp(token, "sysctl-nonfatal") == 0 ||
>>                strcmp(token, "ipv6-subtrees") == 0 ||
>>                strcmp(token, "reflect-kernel-metric") == 0) {
>>          int b;
>> @@ -706,6 +707,8 @@ parse_option(int c, gnc_t gnc, void *closure, char *token)
>>              random_id = b;
>>          else if(strcmp(token, "daemonise") == 0)
>>              do_daemonise = b;
>> +        else if(strcmp(token, "sysctl-nonfatal") == 0)
>> +            sysctl_nonfatal = b;
>>          else if(strcmp(token, "ipv6-subtrees") == 0)
>>              has_ipv6_subtrees = b;
>>          else if(strcmp(token, "reflect-kernel-metric") == 0)
>> diff --git a/kernel_netlink.c b/kernel_netlink.c
>> index ab63d33..0154c63 100644
>> --- a/kernel_netlink.c
>> +++ b/kernel_netlink.c
>> @@ -183,8 +183,13 @@ write_proc(char *filename, int value)
>>      n = snprintf(buf, 100, "%d", value);
>>
>>      fd = open(filename, O_WRONLY);
>> -    if(fd < 0)
>> +    if(fd < 0 && sysctl_nonfatal) {
>> +        fprintf(stderr, "Warning: writing sysctl %s failed (non-fatal): %s.\n",
>> +                filename, strerror(errno));
>> +        return 1;
>> +    } else if(fd < 0) {
>>          return -1;
>> +    }
>>
>>      rc = write(fd, buf, n);
>>      if(rc < n) {
>>
>
>
> _______________________________________________
> Babel-users mailing list
> Babel-users at lists.alioth.debian.org
> http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/babel-users



-- 
Dave Täht
worldwide bufferbloat report:
http://www.dslreports.com/speedtest/results/bufferbloat
And:
What will it take to vastly improve wifi for everyone?
https://plus.google.com/u/0/explore/makewififast



More information about the Babel-users mailing list