Skip to content

Commit 7fc6fe6

Browse files
Fix 1vcpu error with multiqueue and vif_type=tap
Fix for bug #1893263 introduced a regression where 1 vcpu instances would fail to build when paired with multiqueue-enabled images, in the scenario vif_type=tap. Solution is to not pass multiqueue parameter when instances.get_flavor().vcpus = 1. Closes-bug: #1939604 Change-Id: Iaccf2eeeb6e8bb80c658f51ce9ab4e8eb4093a55
1 parent 370830e commit 7fc6fe6

File tree

3 files changed

+43
-17
lines changed

3 files changed

+43
-17
lines changed

nova/tests/unit/virt/libvirt/test_vif.py

Lines changed: 36 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -380,6 +380,10 @@ class LibvirtVifTestCase(test.NoDBTestCase):
380380
uuid='f0000000-0000-0000-0000-000000000001',
381381
project_id=723)
382382

383+
flavor_1vcpu = objects.Flavor(vcpus=1, memory=512, root_gb=1)
384+
385+
flavor_2vcpu = objects.Flavor(vcpus=2, memory=512, root_gb=1)
386+
383387
bandwidth = {
384388
'quota:vif_inbound_peak': '200',
385389
'quota:vif_outbound_peak': '20',
@@ -1048,32 +1052,50 @@ def test_tap_ethernet_vif_driver(self):
10481052
@mock.patch('nova.privsep.linux_net.device_exists', return_value=True)
10491053
@mock.patch('nova.privsep.linux_net.set_device_mtu')
10501054
@mock.patch('nova.privsep.linux_net.create_tap_dev')
1051-
def test_plug_tap_kvm_virtio(self, mock_create_tap_dev, mock_set_mtu,
1052-
mock_device_exists):
1055+
def test_plug_tap_kvm_virtio(
1056+
self, mock_create_tap_dev, mock_set_mtu, mock_device_exists):
10531057

10541058
d1 = vif.LibvirtGenericVIFDriver()
10551059
ins = objects.Instance(
10561060
id=1, uuid='f0000000-0000-0000-0000-000000000001',
1057-
image_ref=uuids.image_ref,
1061+
image_ref=uuids.image_ref, flavor=self.flavor_2vcpu,
10581062
project_id=723, system_metadata={}
10591063
)
10601064
d1.plug(ins, self.vif_tap)
1061-
mock_create_tap_dev.assert_called_once_with('tap-xxx-yyy-zzz', None,
1062-
multiqueue=False)
1065+
mock_create_tap_dev.assert_called_once_with(
1066+
'tap-xxx-yyy-zzz', None, multiqueue=False)
10631067

10641068
mock_create_tap_dev.reset_mock()
10651069

10661070
d2 = vif.LibvirtGenericVIFDriver()
10671071
mq_ins = objects.Instance(
10681072
id=1, uuid='f0000000-0000-0000-0000-000000000001',
1069-
image_ref=uuids.image_ref,
1073+
image_ref=uuids.image_ref, flavor=self.flavor_2vcpu,
10701074
project_id=723, system_metadata={
10711075
'image_hw_vif_multiqueue_enabled': 'True'
10721076
}
10731077
)
10741078
d2.plug(mq_ins, self.vif_tap)
1075-
mock_create_tap_dev.assert_called_once_with('tap-xxx-yyy-zzz', None,
1076-
multiqueue=True)
1079+
mock_create_tap_dev.assert_called_once_with(
1080+
'tap-xxx-yyy-zzz', None, multiqueue=True)
1081+
1082+
@mock.patch('nova.privsep.linux_net.device_exists', return_value=True)
1083+
@mock.patch('nova.privsep.linux_net.set_device_mtu')
1084+
@mock.patch('nova.privsep.linux_net.create_tap_dev')
1085+
def test_plug_tap_mq_ignored_1vcpu(
1086+
self, mock_create_tap_dev, mock_set_mtu, mock_device_exists):
1087+
1088+
d1 = vif.LibvirtGenericVIFDriver()
1089+
mq_ins = objects.Instance(
1090+
id=1, uuid='f0000000-0000-0000-0000-000000000001',
1091+
image_ref=uuids.image_ref, flavor=self.flavor_1vcpu,
1092+
project_id=723, system_metadata={
1093+
'image_hw_vif_multiqueue_enabled': 'True',
1094+
}
1095+
)
1096+
d1.plug(mq_ins, self.vif_tap)
1097+
mock_create_tap_dev.assert_called_once_with(
1098+
'tap-xxx-yyy-zzz', None, multiqueue=False)
10771099

10781100
@mock.patch('nova.privsep.linux_net.device_exists', return_value=True)
10791101
@mock.patch('nova.privsep.linux_net.set_device_mtu')
@@ -1088,15 +1110,14 @@ def test_plug_tap_mq_ignored_virt_type(
10881110
d1 = vif.LibvirtGenericVIFDriver()
10891111
ins = objects.Instance(
10901112
id=1, uuid='f0000000-0000-0000-0000-000000000001',
1091-
image_ref=uuids.image_ref,
1113+
image_ref=uuids.image_ref, flavor=self.flavor_2vcpu,
10921114
project_id=723, system_metadata={
10931115
'image_hw_vif_multiqueue_enabled': 'True'
10941116
}
10951117
)
10961118
d1.plug(ins, self.vif_tap)
1097-
mock_create_tap_dev.assert_called_once_with('tap-xxx-yyy-zzz',
1098-
None,
1099-
multiqueue=False)
1119+
mock_create_tap_dev.assert_called_once_with(
1120+
'tap-xxx-yyy-zzz', None, multiqueue=False)
11001121

11011122
@mock.patch('nova.privsep.linux_net.device_exists', return_value=True)
11021123
@mock.patch('nova.privsep.linux_net.set_device_mtu')
@@ -1107,16 +1128,15 @@ def test_plug_tap_mq_ignored_vif_model(
11071128
d1 = vif.LibvirtGenericVIFDriver()
11081129
ins = objects.Instance(
11091130
id=1, uuid='f0000000-0000-0000-0000-000000000001',
1110-
image_ref=uuids.image_ref,
1131+
image_ref=uuids.image_ref, flavor=self.flavor_2vcpu,
11111132
project_id=723, system_metadata={
11121133
'image_hw_vif_multiqueue_enabled': 'True',
11131134
'image_hw_vif_model': 'e1000',
11141135
}
11151136
)
11161137
d1.plug(ins, self.vif_tap)
1117-
mock_create_tap_dev.assert_called_once_with('tap-xxx-yyy-zzz',
1118-
None,
1119-
multiqueue=False)
1138+
mock_create_tap_dev.assert_called_once_with(
1139+
'tap-xxx-yyy-zzz', None, multiqueue=False)
11201140

11211141
def test_unplug_tap(self):
11221142
d = vif.LibvirtGenericVIFDriver()

nova/virt/libvirt/vif.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -691,7 +691,8 @@ def plug_tap(self, instance, vif):
691691
vif_model = self.get_vif_model(image_meta=image_meta)
692692
# TODO(ganso): explore whether multiqueue works for other vif models
693693
# that go through this code path.
694-
multiqueue = (self._requests_multiqueue(image_meta) and
694+
multiqueue = (instance.get_flavor().vcpus > 1 and
695+
self._requests_multiqueue(image_meta) and
695696
vif_model == network_model.VIF_MODEL_VIRTIO)
696697
nova.privsep.linux_net.create_tap_dev(dev, mac, multiqueue=multiqueue)
697698
network = vif.get('network')
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
fixes:
3+
- |
4+
Addressed an issue that prevented instances with 1 vcpu using multiqueue
5+
feature from being created successfully when their vif_type is TAP.

0 commit comments

Comments
 (0)