[Bug 1904730] Re: neutron-agent-sriov fails to create port
Billy Olsen
1904730 at bugs.launchpad.net
Thu Sep 23 23:50:55 UTC 2021
For bionic, the provided test case needs some tweaks as the neutron
version on bionic does not have the provided functions. Instead, I've
written a quick test script that will exercise the pyroute2 code path to
exercise the errors. Still requires enabling vfs as James did.
Simple script is:
#!/usr/bin/python3
import pyroute2
ip = pyroute2.IPRoute()
devname = 'enp3s0f0'
link_idx = ip.link_lookup(ifname=devname)[0]
link = ip.link('get', index=link_idx, ext_mask=1)[0]
num_vfs = link.get_attr('IFLA_NUM_VF')
print(num_vfs)
Running test on bionic without this fix to prove its enough to show the error:
$ dpkg -l | grep python3-pyroute2
ii python3-pyroute2 0.4.21-0.1ubuntu2 all Python3 Netlink library
$ sudo ./lp1904730-test.py
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/pyroute2/netlink/__init__.py", line 1232, in _ft_decode_generic
self.decode_nlas(offset)
File "/usr/lib/python3/dist-packages/pyroute2/netlink/__init__.py", line 1357, in decode_nlas
offset)
struct.error: unpack_from requires a buffer of at least 4 bytes
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "./lp1904730-test.py", line 7, in <module>
link = ip.link('get', index=link_idx, ext_mask=1)[0]
File "/usr/lib/python3/dist-packages/pyroute2/iproute.py", line 1310, in link
msg_flags=msg_flags)
File "/usr/lib/python3/dist-packages/pyroute2/netlink/nlsocket.py", line 804, in nlm_request
return do_try()
File "/usr/lib/python3/dist-packages/pyroute2/netlink/nlsocket.py", line 783, in do_try
callback=callback)
File "/usr/lib/python3/dist-packages/pyroute2/netlink/nlsocket.py", line 648, in get
raise msg['header']['error']
File "/usr/lib/python3/dist-packages/pyroute2/netlink/nlsocket.py", line 171, in parse
msg.decode()
File "/usr/lib/python3/dist-packages/pyroute2/netlink/__init__.py", line 941, in decode
self._ft_decode(self, offset)
File "/usr/lib/python3/dist-packages/pyroute2/netlink/__init__.py", line 1235, in _ft_decode_generic
raise NetlinkNLADecodeError(e)
pyroute2.netlink.exceptions.NetlinkNLADecodeError: unpack_from requires a buffer of at least 4 bytes
Running with the proposed patch:
$ dpkg -l | grep python3-pyroute2
ii python3-pyroute2 0.4.21-0.1ubuntu2.1 all Python3 Netlink library
$ sudo ./lp1904730-test.py
63
** Tags removed: verification-needed
** Tags added: verification-done verification-done-bionic
** Tags removed: verification-needed-bionic
--
You received this bug notification because you are a member of Ubuntu
OpenStack, which is subscribed to Ubuntu Cloud Archive.
https://bugs.launchpad.net/bugs/1904730
Title:
neutron-agent-sriov fails to create port
Status in Ubuntu Cloud Archive:
Fix Released
Status in Ubuntu Cloud Archive queens series:
Triaged
Status in Ubuntu Cloud Archive stein series:
Triaged
Status in Ubuntu Cloud Archive train series:
Triaged
Status in Ubuntu Cloud Archive ussuri series:
Fix Committed
Status in Ubuntu Cloud Archive wallaby series:
Fix Committed
Status in Ubuntu Cloud Archive xena series:
Fix Released
Status in pyroute2 package in Ubuntu:
Fix Released
Status in pyroute2 source package in Bionic:
Fix Committed
Status in pyroute2 source package in Focal:
Fix Released
Status in pyroute2 source package in Hirsute:
Fix Released
Status in pyroute2 source package in Impish:
Fix Released
Bug description:
[Impact]
Netlink calls to the kernel can return more than 16k bytes (they can
return 32k on newer kernels). The pyroute2 library has a default
buffer size of 16k and fails to read the data when kernel response
data overflows this.
One example of where users encounter this is booting OpenStack
instances with SRIOV when there are more than 32 VFs, as seen in the
original problem description (included below).
[Test Case]
Use an SRIOV capable card and enable more than 32 VFs on a modern
kernel. Attempt to launch an instance using OpenStack as follows:
1. Create example network:
$ juju switch openstack
$ source ~/deploy/novarc
$ openstack network create \
--provider-physical-network sriovfabric \
--provider-segment 300 \
--provider-network-type vlan \
test-sriov
$ openstack subnet create --network test-sriov \
--no-dhcp \
--gateway none \
--subnet-range 192.168.1.0/24 test-sriov
2. Create ports over virtual function:
$ juju switch openstack
$ source ~/deploy/novarc
$ openstack port create \
--network test-sriov \
--vnic-type direct \
sriov-vf1
$ openstack server create \
--image bionic-kvm \
--flavor m1.small \
--network ext-net-300 \
--port sriov-vf1 \
--key-name ubuntu-keypair \
--availability-zone nova:cmp4az1cz20300kvs.mgt.pst.stg.tlc.example.com \
sriov-vf1
3. The instance stalls in build state (virsh list shows paused VM) and
drops to ERROR
[Where problems could occur]
Problems may occur in existing customers already using openstack to
schedule SRIOV instances and may show up as failure to build
instances. Additional problems could include the increased memory
usage of the nova processes which occurs by increasing the default
buffer size. For tightly spec'd systems with small memory allocated to
the host, this could further eat into any margin available and push
memory usage over the edge.
To manage notifications about this bug go to:
https://bugs.launchpad.net/cloud-archive/+bug/1904730/+subscriptions
More information about the Ubuntu-openstack-bugs
mailing list