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.
Signed-off-by: Eduardo Otubo <redacted>
---
tools/hv/hv_set_ifconfig.sh | 29 ++++++++++++++++++-----------
1 file changed, 18 insertions(+), 11 deletions(-)
@@ -46,19 +46,26 @@# is expected to return the configuration that is set via the SET# call.#+interface=$(echo$1|awk-F-'{ print $2 }')+current_ip=$(ipaddrshow$interface|grep"inet ");+config_file_ip=$(grepIPADDR$1|cut-d"="-f2);+current_ipv6=$(ipaddrshow$interface|grep"inet6 ");+config_file_ipv6=$(grepIPV6ADDR$1|cut-d"="-f2);+config_file_ipv6_netmask=$(grepIPV6NETMASK$1|cut-d"="-f2);+config_file_ipv6=${config_file_ipv6}/${config_file_ipv6_netmask};-echo"IPV6INIT=yes">>$1-echo"NM_CONTROLLED=no">>$1-echo"PEERDNS=yes">>$1-echo"ONBOOT=yes">>$1---cp$1/etc/sysconfig/network-scripts/-+# only set the IP if it's not configured yet+if[[$(test"${current_ip#*$config_file_ip}")=="$config_file_ip"\+||$(test"${current_ipv6#*$config_file_ipv6}")=="$current_ipv6"]];then+echo"IPV6INIT=yes">>$1+echo"NM_CONTROLLED=no">>$1+echo"PEERDNS=yes">>$1+echo"ONBOOT=yes">>$1-interface=$(echo$1|awk-F-'{ print $2 }')+cp$1/etc/sysconfig/network-scripts/-/sbin/ifdown$interface2>/dev/null-/sbin/ifup$interface2>/dev/null+/sbin/ifdown$interface2>/dev/null+/sbin/ifup$interface2>/dev/null+fi
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.
Signed-off-by: Eduardo Otubo <redacted>
And if the daemon sets the address after you test it but before
you try to set it in the script, what happens?
This is why I hate changes like this. They don't remove the problem,
they make it smaller. And smaller in a bad way. Smaller makes the
problem even more harder to diagnose when it happens.
There is implicitly no synchonization between network configuration
daemons and things people run by hand like this script.
So, caveat emptor.
I'm not applying this, sorry.
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.
Signed-off-by: Eduardo Otubo <redacted>
And if the daemon sets the address after you test it but before
you try to set it in the script, what happens?
This is why I hate changes like this. They don't remove the problem,
they make it smaller. And smaller in a bad way. Smaller makes the
problem even more harder to diagnose when it happens.
There is implicitly no synchonization between network configuration
daemons and things people run by hand like this script.
So, caveat emptor.
I'm not applying this, sorry.
This is just part of the resolution, actually. For RHEL I also configure hyperv-daemons' systemd config file to be run only after network service is up.
So perhaps my solution should be distro-agnostic and only involve this script as part of it? In this case I'll elaborate a little more then.
Thanks for the comment.
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.
Signed-off-by: Eduardo Otubo <redacted>
And if the daemon sets the address after you test it but before
you try to set it in the script, what happens?
This is why I hate changes like this. They don't remove the problem,
they make it smaller. And smaller in a bad way. Smaller makes the
problem even more harder to diagnose when it happens.
There is implicitly no synchonization between network configuration
daemons and things people run by hand like this script.
So, caveat emptor.
I'm not applying this, sorry.
But also, looking from a different point of view, the current upstream solution does not avoid the problems you mentioned. My fix at least avoids double configuration and RTNETLINK errors. So perhaps you could consider this as "a better version walking towards an ideal fix"?
quoted
This is just part of the resolution, actually. For RHEL I also configure hyperv-daemons' systemd config file to be run only after network service is up.
So perhaps my solution should be distro-agnostic and only involve this script as part of it? In this case I'll elaborate a little more then.
Thanks for the comment.
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.
Signed-off-by: Eduardo Otubo <redacted>
And if the daemon sets the address after you test it but before
you try to set it in the script, what happens?
This is why I hate changes like this. They don't remove the problem,
they make it smaller. And smaller in a bad way. Smaller makes the
problem even more harder to diagnose when it happens.
There is implicitly no synchonization between network configuration
daemons and things people run by hand like this script.
So, caveat emptor.
I'm not applying this, sorry.
But also, looking from a different point of view, the current upstream
solution does not avoid the problems you mentioned. My fix at least
avoids double configuration and RTNETLINK errors. So perhaps you could
consider this as "a better version walking towards an ideal fix"?
I didn't say upstream avoids the problem.
In fact, that's the good thing. It doesn't try to do something it
cannot do without explicit pieces of synchronization infrastructure
between such tools.