The review for the oslo.versionedobjects change is here: https://review.openstack.org/#/c/355981/
** Changed in: nova Status: New => Fix Released ** Project changed: nova => oslo.versionedobjects -- You received this bug notification because you are a member of Yahoo! Engineering Team, which is subscribed to OpenStack Compute (nova). https://bugs.launchpad.net/bugs/1613488 Title: changed fields of versionedobjects not tracked properly when down- versioning object Status in oslo.versionedobjects: Fix Released Bug description: Sorry for the complicated write-up below, but the issue is complicated. I'm running into a problem between Mitaka and Kilo, but I *think* it'll also hit Mitaka/Liberty. The problem scenario is when we have older and newer services talking to each other. The problem occurs when nova-conductor writes to an object field that is removed in obj_make_compatible(). In particular, I'm hitting this with 'parent_addr' in the PciDevice class since it gets written in PciDevice._from_db_object(). In oslo_versionedobjects/base.py the remotable() function has the following line: self._changed_fields = set(updates.get('obj_what_changed', [])) This blindly sets the local self._changed_fields to be whatever the remote end sent as updates['obj_what_changed']. This is a problem because the far end can include fields that don't actually exist in the older object version. On the far end (which may be newer) in nova.conductor.manager.ConductorManager.object_action(), we will call the following (where 'objinst' is the current version of the object): updates['obj_what_changed'] = objinst.obj_what_changed() Since this is called against the newer object code, it can specify fields that do not exist in the older version of the object if nova- conductor has written those fields. The only workaround I've been able to come up with for this is to modify oslo_versionedobjects.base.remotable() to only include a field in self._changed_fields if it's in self.fields. This requires updating the older code prior to an upgrade, however. I think there's another related issue. In VersionedObject.obj_to_primitive() we set the changes in the primitive like this: if self.obj_what_changed(): obj[self._obj_primitive_key('changes')] = list( self.obj_what_changed()) Since we call self.obj_what_changed() on the newer version of the object, I think we will include changes to fields that were removed by obj_make_compatible_from_manifest(). It seems to me that in obj_to_primitive() we should not allow fields to be included in obj[self._obj_primitive_key('changes')] unless they're also listed in obj[self._obj_primitive_key('data')]. To manage notifications about this bug go to: https://bugs.launchpad.net/oslo.versionedobjects/+bug/1613488/+subscriptions -- Mailing list: https://launchpad.net/~yahoo-eng-team Post to : yahoo-eng-team@lists.launchpad.net Unsubscribe : https://launchpad.net/~yahoo-eng-team More help : https://help.launchpad.net/ListHelp