Improve DHCP agent's debug messages
When new port is created dhcp agent checks if IP addresses which are
assigned to that port aren't already associated with different ports
which are in agent's cache.
When it finds such duplicate IPs, resync of the network is scheduled.
The problem is that debug message which informs about such duplicate
IPs isn't very "verbose".
With this patch it will log new and cached port ids as well as ip
addresses on both of those ports. That should make easier to understand
why such duplicates are in the cache.
This patch also adds logging when methods like
_{network|subnet|port}_{create|update|delete} are called and with what
arguments exactly. This should help investigation what exactly happens
with some specific port in the dhcp agent.
Related-bug: #1828423
Change-Id: I964a3d843aeedef424a4466932bf702ea1b4320e
(cherry picked from commit 9c2029c2c8
)
This commit is contained in:
parent
d44d85b810
commit
04a7a44ade
|
@ -26,6 +26,7 @@ from neutron_lib import exceptions
|
|||
from neutron_lib import rpc as n_rpc
|
||||
from oslo_concurrency import lockutils
|
||||
from oslo_config import cfg
|
||||
from oslo_log import helpers as log_helpers
|
||||
from oslo_log import log as logging
|
||||
import oslo_messaging
|
||||
from oslo_service import loopingcall
|
||||
|
@ -414,6 +415,7 @@ class DhcpAgent(manager.Manager):
|
|||
self._queue.add(update)
|
||||
|
||||
@_wait_if_syncing
|
||||
@log_helpers.log_method_call
|
||||
def _network_create(self, payload):
|
||||
network_id = payload['network']['id']
|
||||
self.enable_dhcp_helper(network_id)
|
||||
|
@ -428,6 +430,7 @@ class DhcpAgent(manager.Manager):
|
|||
self._queue.add(update)
|
||||
|
||||
@_wait_if_syncing
|
||||
@log_helpers.log_method_call
|
||||
def _network_update(self, payload):
|
||||
network_id = payload['network']['id']
|
||||
if payload['network']['admin_state_up']:
|
||||
|
@ -445,6 +448,7 @@ class DhcpAgent(manager.Manager):
|
|||
self._queue.add(update)
|
||||
|
||||
@_wait_if_syncing
|
||||
@log_helpers.log_method_call
|
||||
def _network_delete(self, payload):
|
||||
network_id = payload['network_id']
|
||||
self.disable_dhcp_helper(network_id)
|
||||
|
@ -459,6 +463,7 @@ class DhcpAgent(manager.Manager):
|
|||
self._queue.add(update)
|
||||
|
||||
@_wait_if_syncing
|
||||
@log_helpers.log_method_call
|
||||
def _subnet_update(self, payload):
|
||||
network_id = payload['subnet']['network_id']
|
||||
self.refresh_dhcp_helper(network_id)
|
||||
|
@ -497,6 +502,7 @@ class DhcpAgent(manager.Manager):
|
|||
self._queue.add(update)
|
||||
|
||||
@_wait_if_syncing
|
||||
@log_helpers.log_method_call
|
||||
def _subnet_delete(self, payload):
|
||||
network_id = self._get_network_lock_id(payload)
|
||||
if not network_id:
|
||||
|
@ -544,6 +550,7 @@ class DhcpAgent(manager.Manager):
|
|||
self._queue.add(update)
|
||||
|
||||
@_wait_if_syncing
|
||||
@log_helpers.log_method_call
|
||||
def _port_update(self, updated_port):
|
||||
if self.cache.is_port_message_stale(updated_port):
|
||||
LOG.debug("Discarding stale port update: %s", updated_port)
|
||||
|
@ -555,7 +562,8 @@ class DhcpAgent(manager.Manager):
|
|||
self.reload_allocations(updated_port, network, prio=True)
|
||||
|
||||
def reload_allocations(self, port, network, prio=False):
|
||||
LOG.info("Trigger reload_allocations for port %s", port)
|
||||
LOG.info("Trigger reload_allocations for port %s on network %s",
|
||||
port, network)
|
||||
driver_action = 'reload_allocations'
|
||||
if self._is_port_on_this_agent(port):
|
||||
orig = self.cache.get_port_by_id(port['id'])
|
||||
|
@ -602,6 +610,7 @@ class DhcpAgent(manager.Manager):
|
|||
self._queue.add(update)
|
||||
|
||||
@_wait_if_syncing
|
||||
@log_helpers.log_method_call
|
||||
def _port_create(self, created_port):
|
||||
network = self.cache.get_network_by_id(created_port.network_id)
|
||||
if not network:
|
||||
|
@ -616,9 +625,18 @@ class DhcpAgent(manager.Manager):
|
|||
if (new_ips.intersection(cached_ips) and
|
||||
(created_port['id'] != port_cached['id'] or
|
||||
created_port['mac_address'] != port_cached['mac_address'])):
|
||||
self.schedule_resync("Duplicate IP addresses found, "
|
||||
"DHCP cache is out of sync",
|
||||
created_port.network_id)
|
||||
resync_reason = (
|
||||
"Duplicate IP addresses found, "
|
||||
"Port in cache: {cache_port_id}, "
|
||||
"Created port: {port_id}, "
|
||||
"IPs in cache: {cached_ips}, "
|
||||
"new IPs: {new_ips}."
|
||||
"DHCP cache is out of sync").format(
|
||||
cache_port_id=port_cached['id'],
|
||||
port_id=created_port['id'],
|
||||
cached_ips=cached_ips,
|
||||
new_ips=new_ips)
|
||||
self.schedule_resync(resync_reason, created_port.network_id)
|
||||
return
|
||||
self.reload_allocations(created_port, network, prio=True)
|
||||
|
||||
|
@ -635,6 +653,7 @@ class DhcpAgent(manager.Manager):
|
|||
self._queue.add(update)
|
||||
|
||||
@_wait_if_syncing
|
||||
@log_helpers.log_method_call
|
||||
def _port_delete(self, payload):
|
||||
network_id = self._get_network_lock_id(payload)
|
||||
if not network_id:
|
||||
|
|
Loading…
Reference in New Issue