[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