I've tested the new patch from ppa:mfo/lp1947099v2 and I can confirm it
resolves the problem:
- Without the patch:
https://pastebin.ubuntu.com/p/RksNcBGSzn/
It took 396,940865−220,447147 = 176,493718 seconds in the IP-Config section.
Total boot time:
ubuntu@gpu48-ubuntu18:~$ sudo systemd-analyze time
Startup finished in 4min 1.355s (firmware) + 2min 24.433s (loader) + 6min
8.464s (kernel) + 41.466s (userspace) = 13min 15.719s
graphical.target reached after 41.068s in userspace
- With the patch:
https://pastebin.ubuntu.com/p/46nVYCYyDZ/
It took 246,556749−212,019368 = 34,537381 seconds in the IP-Config
section. Total boot time:
ubuntu@gpu48-ubuntu18:~$ sudo systemd-analyze time
Startup finished in 4min 1.246s (firmware) + 2min 24.170s (loader) + 3min
42.915s (kernel) + 39.010s (userspace) = 10min 47.343s
graphical.target reached after 38.634s in userspace
ubuntu@gpu48-ubuntu18:~$ sudo apt-cache policy klibc-utils
klibc-utils:
Installed: 2.0.4-9ubuntu2.18.04.1
Candidate: 2.0.4-9ubuntu2.18.04.1
Version table:
*** 2.0.4-9ubuntu2.18.04.1 500
500 http://ppa.launchpad.net/mfo/lp1947099v2/ubuntu bionic/main amd64
Packages
100 /var/lib/dpkg/status
2.0.4-9ubuntu2.1 500
500 http://me-dubai-1-ad-1.clouds.archive.ubuntu.com/ubuntu
bionic-updates/main amd64 Packages
500 http://security.ubuntu.com/ubuntu bionic-security/main amd64
Packages
2.0.4-9ubuntu2 500
500 http://me-dubai-1-ad-1.clouds.archive.ubuntu.com/ubuntu bionic/main
amd64 Packages
--
You received this bug notification because you are a member of STS
Sponsors, which is subscribed to the bug report.
https://bugs.launchpad.net/bugs/1947099
Title:
ipconfig does not honour user-requested timeouts in some cases
Status in klibc package in Ubuntu:
New
Status in klibc source package in Bionic:
Incomplete
Bug description:
[Impact]
In some cases, ipconfig can take a longer time than the user-specified
timeouts, causing unexpected delays.
[Test Plan]
Any situation where ipconfig encounters an error sending the DHCP packet, it
will automatically set a delay of 10 seconds, which could be longer than the
user-specified timeout. It can be reproduced by creating a dummy interface and
attempting to run ipconfig on it with a timeout value of less than 10:
# ip link add eth1 type dummy
# date; /usr/lib/klibc/bin/ipconfig -t 2 eth1; date
Thu Nov 18 04:46:13 EST 2021
IP-Config: eth1 hardware address ae:e0:f5:9d:7e:00 mtu 1500 DHCP RARP
IP-Config: no response after 2 secs - giving up
Thu Nov 18 04:46:23 EST 2021
^ Notice above, ipconfig thinks that it waited 2 seconds, but the
timestamps show an actual delay of 10 seconds.
[Where problems could occur]
Please see reproduction steps above. We are seeing this in production too
(see comment #2).
[Other Info]
A patch to fix the issue is being proposed here. It is a safe fix - it only
checks before going into sleep that the timeout never exceeds the
user-requested value.
[Original Description]
In some cases, ipconfig can take longer than the user-specified
timeouts, causing unexpected delays.
in main.c, in function loop(), the process can go into
process_timeout_event() (or process_receive_event() ) and if it
encounters an error situation, will set an attempt to "try again
later" at time equal now + 10 seconds by setting
s->expire = now + 10;
This can happen at any time during the main event loop, which can end
up extending the user-specified timeout if "now + 10" is greater than
"start_time + user-specified-timeout".
I believe a patch like the following is needed to avoid this problem:
--- a/usr/kinit/ipconfig/main.c
+++ b/usr/kinit/ipconfig/main.c
@@ -437,6 +437,13 @@ static int loop(void)
if (timeout > s->expire - now.tv_sec)
timeout = s->expire - now.tv_sec;
+
+ /* Compensate for already-lost time */
+ gettimeofday(, NULL);
+ if (now.tv_sec + timeout > start + loop_timeout) {
+ timeout = loop_timeout - (now.tv_sec - start);
+ printf("Lowered timeout to match user request
= (%d s) \n", timeout);
+ }
}
I believe the current behaviour is buggy. This is confirmed when the
following line is executed:
if (loop_timeout >= 0 &&
now.tv_sec - start >= loop_timeout) {
printf("IP-Config: no response after %d "
"secs - giving up\n", loop_timeout);
rc = -1;
goto bail;
}
'loop_timeout' is the user-specified time-out. With a value of 2, in
case of error, this line prints:
IP-Config: no response after 2 secs -