Skip to contentSkip to conversation

tools: hv: hv_set_ifconfig.sh double check before setting ip

PATCH In review Eduardo Otubo 3 participants 4 messages Dec 8, 2017 Hyper-V/Azure core and drivers

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 tools: hv: hv_set_ifconfig.sh double check before setting ip

This patch fixes the behavior of the hv_set_ifconfig script when setting the interface ip. Sometimes the interface has already been configured by network daemon, in this case hv_set_ifconfig causes "RTNETLINK: file exists error"; in order to avoid this error this patch makes sure double checks the interface before trying anything.

---
v2: wrap the interface configuration inside a safe wAY to avoid interaction with network script.

 tools/hv/hv_set_ifconfig.sh | 45 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 43 insertions(+), 2 deletions(-)
tools/hv/hv_set_ifconfig.sh +43 -2
index 7ed9f85ef908..b6429703cc98 100755
@@ -61,5 +61,46 @@ cp $1 /etc/sysconfig/network-scripts/
 
 interface=$(echo $1 | awk -F - '{ print $2 }')
 
-/sbin/ifdown $interface 2>/dev/null
-/sbin/ifup $interface 2>/dev/null
+current_ip=$(ip addr show $interface|sed -En 's/.*inet (addr:)?(([0-9*\.){3}[0-9]*).*/\2/p');
+config_file_ip=$(grep IPADDR /etc/sysconfig/network-scripts/ifcfg-$interface|cut -d"=" -f2);
+
+current_ipv6=$(ip addr show $interface|sed -E 's/^*.inet6\ (.*)\ scope\ global/\1/');
+config_file_ipv6=$(grep IPV6ADDR /etc/sysconfig/network-scripts/ifcfg-eth-$interface|cut -d"=" -f2);
+config_file_ipv6_netmask=$(grep IPV6NETMASK /etc/sysconfig/network-scripts/ifcfg-eth-$interface|cut -d"=" -f2);
+config_file_ipv6=${config_file_ipv6}/${config_file_ipv6_netmask};
+
+configure_interface(){
+    # only set the IP if the network service has not done yet
+    if [[ ${current_ip} != *${config_file_ip}* || ${current_ipv6} != ${config_file_ipv6} ]]; then
+        /sbin/ifdown $interface 2>/dev/null
+        /sbin/ifup $interface 2>/dev/null
+    fi
+}
+
+error_exit(){
+    message=$1
+    logger "KVP daemon: $message"
+    exit 1;
+}
+
+if [ -e /var/run/subsys/network ]; then
+    # network script is already up
+    # it is safe to configure the interface
+    configure_interface;
+else
+    i=0;
+    while [ ! -e /var/run/subsys/network ]; do
+        # network script might be still starting.
+        # let's wait for 3 minutes
+        sleep 1m;
+        ((i++));
+
+        # if network service doens't come up in 3 minutes
+        # perhaps there's no network service at all
+        [[ $i == 3 ]] && break;
+    done
+
+    # at this point it doesn't matter if network service is up or down
+    # we're safe either way
+    configure_interface;
+fi
Signature · 1 line
2.13.6
#1 lore raw
Quoted 4 lines · Eduardo Otubo
 tools/hv/hv_set_ifconfig.sh | 45 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 43 insertions(+), 2 deletions(-)

+ # let's wait for 3 minutes

Was this codepath runtime tested?

Last time this came up, the conclusion was that Windows terminates the "KVP connection" after 60 seconds. After that, the VM must be rebooted because the kernel does not deal with the long-running script. It is also not clear what the kernel is supposed to do: either silently report success and hope the scripts reports success one day, or report error independent from what the script actually returns. New KVP requests would need to be queued either way.

Olaf

#2 lore raw
Quoted 9 lines · Olaf Hering
Quoted 4 lines · Eduardo Otubo
 tools/hv/hv_set_ifconfig.sh | 45 +++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 43 insertions(+), 2 deletions(-)

+ # let's wait for 3 minutes

Was this codepath runtime tested?

Quoted 8 lines

Last time this came up, the conclusion was that Windows terminates the "KVP connection" after 60 seconds. After that, the VM must be rebooted because the kernel does not deal with the long-running script. It is also not clear what the kernel is supposed to do: either silently report success and hope the scripts reports success one day, or report error independent from what the script actually returns. New KVP requests would need to be queued either way.

Now that you mentioned, I guess my tests never touched this part. But I guess we're going to fix this downstream-only setting a rule on systemd to start hypervkvpd only after NetworkManager started. Please drop the reviews on this.

Regards,

#3 lore raw
In reply to Olaf Hering
Quoted 23 lines

-----Original Message-----
From: Olaf Hering [mailto:[email protected]]
Sent: Friday, December 8, 2017 3:34 AM
To: Eduardo Otubo <[email protected]>
Cc: [email protected]; [email protected]; Stephen Hemminger <[email protected]>; Haiyang Zhang <[email protected]>; KY Srinivasan <[email protected]>; [email protected]; [email protected]; [email protected]
Subject: Re: [PATCHv2] tools: hv: hv_set_ifconfig.sh double check before setting ip

Quoted 1 line · Eduardo Otubo
 tools/hv/hv_set_ifconfig.sh | 45

+++++++++++++++++++++++++++++++++++++++++++--

Quoted 3 lines
 1 file changed, 43 insertions(+), 2 deletions(-)

+ # let's wait for 3 minutes

Was this codepath runtime tested?

Quoted 7 lines

Last time this came up, the conclusion was that Windows terminates the "KVP connection" after 60 seconds. After that, the VM must be rebooted because the kernel does not deal with the long-running script. It is also not clear what the kernel is supposed to do: either silently report success and hope the scripts reports success one day, or report error independent from what the script actually returns. New KVP requests would need to be queued either way.

Agreed; 180 seconds is more than what the host is willing to wait.

K. Y

Quoted 3 lines

Olaf