Generate version_id upon add_node

The version_id isn't set during add_node() call. This function is called
when introspection starts for both "new" and existing node_info records.
As a result, race conditions can appear in an HA inspector deployment (see
the refered bug).

This patch makes sure a version_id is generated during the add_node() call
so stale record updates can be detected through the version_id mismatch
between the inspector memory and the DB record.

Change-Id: I422473e888e5e49abb3e598fc2cf2f330620bdcd
Closes-Bug: #1719627
This commit is contained in:
dparalen 2017-09-26 16:09:13 +02:00
parent 37b556ab7a
commit 82000e48ec
2 changed files with 12 additions and 1 deletions

View File

@ -686,9 +686,12 @@ def add_node(uuid, state, **attributes):
started_at = timeutils.utcnow() started_at = timeutils.utcnow()
with db.ensure_transaction() as session: with db.ensure_transaction() as session:
_delete_node(uuid) _delete_node(uuid)
db.Node(uuid=uuid, state=state, started_at=started_at).save(session) version_id = uuidutils.generate_uuid()
db.Node(uuid=uuid, state=state, version_id=version_id,
started_at=started_at).save(session)
node_info = NodeInfo(uuid=uuid, state=state, started_at=started_at, node_info = NodeInfo(uuid=uuid, state=state, started_at=started_at,
version_id=version_id,
ironic=attributes.pop('ironic', None)) ironic=attributes.pop('ironic', None))
for (name, value) in attributes.items(): for (name, value) in attributes.items():
if not value: if not value:

View File

@ -0,0 +1,8 @@
---
fixes:
- |
A ``version_id`` is now explicitly generated during the
``node_cache.start_introspection/.add_node`` call to avoid race conditions
such as in case of the `two concurrent introspection calls bug`_.
.. _two concurrent introspection calls bug: https://bugs.launchpad.net/ironic-inspector/+bug/1719627