Comment 3 for bug 1995918

Revision history for this message
Hua Zhang (zhhuabj) wrote :

I did some debug, zone_master record was deleted by delete_zone_master, here is its call stack

mysql> select * from zone_masters;
+----------------------------------+---------+---------------------+---------------------+------------+------+----------------------------------+
| id | version | created_at | updated_at | host | port | zone_id |
+----------------------------------+---------+---------------------+---------------------+------------+------+----------------------------------+
| 10a355b8d22d41ae8c35d52ce8db1ae5 | 214 | 2022-11-28 08:21:44 | 2022-11-28 08:22:20 | 10.5.2.242 | 5354 | 30ebe0fdd67647d885f93eb817328c6b |
+----------------------------------+---------+---------------------+---------------------+------------+------+----------------------------------+

# nc 127.0.0.1 4444
> /usr/lib/python3/dist-packages/designate/storage/impl_sqlalchemy/__init__.py(586)delete_zone_master()
-> zone_master = self._find_zone_masters(
(Pdb) where
  /usr/lib/python3/dist-packages/eventlet/greenpool.py(88)_spawn_n_impl()
-> func(*args, **kwargs)
  /usr/lib/python3/dist-packages/futurist/_green.py(71)__call__()
-> self.work.run()
  /usr/lib/python3/dist-packages/futurist/_utils.py(52)run()
-> result = self.fn(*self.args, **self.kwargs)
  /usr/lib/python3/dist-packages/oslo_messaging/rpc/server.py(165)_process_incoming()
-> res = self.dispatcher.dispatch(message)
  /usr/lib/python3/dist-packages/oslo_messaging/rpc/dispatcher.py(276)dispatch()
-> return self._do_dispatch(endpoint, method, ctxt, args)
  /usr/lib/python3/dist-packages/oslo_messaging/rpc/dispatcher.py(196)_do_dispatch()
-> result = func(ctxt, **new_args)
  /usr/lib/python3/dist-packages/designate/rpc.py(238)exception_wrapper()
-> return f(self, *args, **kwargs)
  /usr/lib/python3/dist-packages/designate/central/service.py(151)notification_wrapper()
-> result = f(self, *args, **kwargs)
  /usr/lib/python3/dist-packages/designate/central/service.py(151)notification_wrapper()
-> result = f(self, *args, **kwargs)
  /usr/lib/python3/dist-packages/designate/storage/__init__.py(67)retry_wrapper()
-> **copy.deepcopy(kwargs))
  /usr/lib/python3/dist-packages/designate/storage/__init__.py(105)transaction_wrapper()
-> result = f(self, *args, **kwargs)
  /usr/lib/python3/dist-packages/designate/central/service.py(123)sync_wrapper()
-> return f(self, *args, **kwargs)
  /usr/lib/python3/dist-packages/designate/central/service.py(2380)update_status()
-> zone = self._update_zone_status(context, zone_id, status, serial)
  /usr/lib/python3/dist-packages/designate/central/service.py(2397)_update_zone_status()
-> self.storage.update_zone(context, zone)
  /usr/lib/python3/dist-packages/designate/storage/impl_sqlalchemy/__init__.py(375)update_zone()
-> self.delete_zone_master(context, attr.id)
> /usr/lib/python3/dist-packages/designate/storage/impl_sqlalchemy/__init__.py(586)delete_zone_master()
-> zone_master = self._find_zone_masters(

mysql> select * from zone_masters;
Empty set (0.00 sec)

it seems the return value of self.storage.get_zone(context, zone_id) didn't include zone_master so zone.masters is []

(Pdb) l
373 attr = self._find_zone_masters(
374 context, {'id': i_id}, one=True)
375 self.delete_zone_master(context, attr.id)
376
377 # Update Attributes
378 -> for i in update:
379 self.update_zone_master(context, i)
380
381 # Create Attributes
382 for attr in create:
383 attr.zone_id = zone.id
(Pdb) p have
{'10a355b8-d22d-41ae-8c35-d52ce8db1ae5'}
(Pdb) p keep
set()
(Pdb) p update
[]
(Pdb) p create
[]
(Pdb) p zone.obj_attr_is_set('masters')
True
(Pdb) p i_id
'10a355b8-d22d-41ae-8c35-d52ce8db1ae5'
(Pdb) p zone.masters
OVO Objects
(Pdb) print(list(zone.masters))
[]