[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