Browse Source

Dont use dict.get() to know certain key is in dict

In CommonAgentLoop class, there is logic to detect tap device is changed
locally or not by comparing timestamp with previous.
Sometimes timestamp value could be None depending on the timing (see bug/1781129)

But current _get_devices_locally_modified logic can not detect local
change from None to something because _get_devices_locally_modified
function don't always compare if previous timestamp value was None.

In order not to miss updated device always, better not to use dict.get() to
know previous iteration have timestamp or not.

Change-Id: Ib0361ad5c281f88558e8e048cfec588b9f9b1de4
Closes-Bug: #1781129
changes/48/581648/4
Yuki Nishiwaki 4 years ago
parent
commit
b803195a99
  1. 2
      neutron/plugins/ml2/drivers/agent/_common_agent.py
  2. 17
      neutron/tests/unit/plugins/ml2/drivers/agent/test__common_agent.py

2
neutron/plugins/ml2/drivers/agent/_common_agent.py

@ -366,7 +366,7 @@ class CommonAgentLoop(service.Service):
returned because this means it is new.
"""
return {device for device, timestamp in timestamps.items()
if previous_timestamps.get(device) and
if device in previous_timestamps and
timestamp != previous_timestamps.get(device)}
def scan_devices(self, previous, sync):

17
neutron/tests/unit/plugins/ml2/drivers/agent/test__common_agent.py

@ -233,6 +233,23 @@ class TestCommonAgentLoop(base.BaseTestCase):
self._test_scan_devices(previous, updated, fake_current, expected,
sync=False)
def test_scan_devices_timestamp_triggers_updated_None_to_something(self):
previous = {'current': set([1, 2]),
'updated': set(),
'added': set(),
'removed': set(),
'timestamps': {2: None}}
fake_current = set([1, 2])
updated = set()
expected = {'current': set([1, 2]),
'updated': set([2]),
'added': set(),
'removed': set(),
'timestamps': {2: 1000}}
self._test_scan_devices(previous, updated, fake_current, expected,
sync=False, fake_ts_current={2: 1000})
def test_scan_devices_timestamp_triggers_updated(self):
previous = {'current': set([1, 2]),
'updated': set(),

Loading…
Cancel
Save