)]}'
{"nova/objects/resource_provider.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1ba989083d6a33f3007fd84e7404d8154cdd24d5","unresolved":false,"context_lines":[{"line_number":1183,"context_line":"    def _save(context, id, updates):"},{"line_number":1184,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1185,"context_line":"            id\u003did).first()"},{"line_number":1186,"context_line":"        db_rc.update(updates)"},{"line_number":1187,"context_line":"        db_rc.save(context.session)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_374b6b2d","line":1186,"updated":"2016-11-23 05:56:13.000000000","message":"we can check if the \u0027name\u0027 isn\u0027t changed, just return directly.","commit_id":"674b4981ffce391d54fc20869f2bb3896bce72ae"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b7ba4d6e98517a90163511eacfc2faf3f226cf21","unresolved":false,"context_lines":[{"line_number":1183,"context_line":"    def _save(context, id, updates):"},{"line_number":1184,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1185,"context_line":"            id\u003did).first()"},{"line_number":1186,"context_line":"        db_rc.update(updates)"},{"line_number":1187,"context_line":"        db_rc.save(context.session)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_a4ce6cb5","line":1186,"in_reply_to":"5a74a57a_0078b08e","updated":"2016-11-29 17:13:10.000000000","message":"Two threads are not going to be modifying the same object\u0027s name at the same time are they?","commit_id":"674b4981ffce391d54fc20869f2bb3896bce72ae"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"eb4534a40e1e15a6c5f3f906f8880260a1c64ec7","unresolved":false,"context_lines":[{"line_number":1183,"context_line":"    def _save(context, id, updates):"},{"line_number":1184,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1185,"context_line":"            id\u003did).first()"},{"line_number":1186,"context_line":"        db_rc.update(updates)"},{"line_number":1187,"context_line":"        db_rc.save(context.session)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_0078b08e","line":1186,"in_reply_to":"5a74a57a_08c5533b","updated":"2016-11-24 05:13:21.000000000","message":"emm....there may have a race, another call changes the name before this line 1184 and after line 1167?","commit_id":"674b4981ffce391d54fc20869f2bb3896bce72ae"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f914d7f2b029ccfdf5ff390ef35fdecb56d819c6","unresolved":false,"context_lines":[{"line_number":1183,"context_line":"    def _save(context, id, updates):"},{"line_number":1184,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1185,"context_line":"            id\u003did).first()"},{"line_number":1186,"context_line":"        db_rc.update(updates)"},{"line_number":1187,"context_line":"        db_rc.save(context.session)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_08c5533b","line":1186,"in_reply_to":"5a74a57a_374b6b2d","updated":"2016-11-23 15:36:31.000000000","message":"This is done already on L1167 right? We won\u0027t get here if \u0027name\u0027 is not dirtied.","commit_id":"674b4981ffce391d54fc20869f2bb3896bce72ae"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8f817355403d17d42b7cb78dacc2f7e1b8ae0199","unresolved":false,"context_lines":[{"line_number":1183,"context_line":"    def _save(context, id, updates):"},{"line_number":1184,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1185,"context_line":"            id\u003did).first()"},{"line_number":1186,"context_line":"        db_rc.update(updates)"},{"line_number":1187,"context_line":"        db_rc.save(context.session)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_8c67c4e9","line":1186,"in_reply_to":"5a74a57a_a4ce6cb5","updated":"2016-11-30 02:14:16.000000000","message":"ah, yea, I see now. This is rare case. it isn\u0027t worth to waste time on it.","commit_id":"674b4981ffce391d54fc20869f2bb3896bce72ae"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"1ba989083d6a33f3007fd84e7404d8154cdd24d5","unresolved":false,"context_lines":[{"line_number":1184,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1185,"context_line":"            id\u003did).first()"},{"line_number":1186,"context_line":"        db_rc.update(updates)"},{"line_number":1187,"context_line":"        db_rc.save(context.session)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":""},{"line_number":1190,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_f740130a","line":1187,"updated":"2016-11-23 05:56:13.000000000","message":"We may have the case the resource class deleted before this line","commit_id":"674b4981ffce391d54fc20869f2bb3896bce72ae"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"8f817355403d17d42b7cb78dacc2f7e1b8ae0199","unresolved":false,"context_lines":[{"line_number":1184,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1185,"context_line":"            id\u003did).first()"},{"line_number":1186,"context_line":"        db_rc.update(updates)"},{"line_number":1187,"context_line":"        db_rc.save(context.session)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":""},{"line_number":1190,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_8ce6e414","line":1187,"in_reply_to":"5a74a57a_84689089","updated":"2016-11-30 02:14:16.000000000","message":"ok, yea, we have some of objects have same problem. And few of objects use the way of update_and_match.\n\nbut yes, it is rare case for admin user concurrent update resource class.","commit_id":"674b4981ffce391d54fc20869f2bb3896bce72ae"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"b7ba4d6e98517a90163511eacfc2faf3f226cf21","unresolved":false,"context_lines":[{"line_number":1184,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1185,"context_line":"            id\u003did).first()"},{"line_number":1186,"context_line":"        db_rc.update(updates)"},{"line_number":1187,"context_line":"        db_rc.save(context.session)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":""},{"line_number":1190,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_84689089","line":1187,"in_reply_to":"5a74a57a_91c0947e","updated":"2016-11-29 17:13:10.000000000","message":"@alex_xu: this is no different than any other object currently in Nova. If we want to add try/except blocks that look for StaleDataError on each deleting transaction and ignore it, that would be a pretty massive undertaking...","commit_id":"674b4981ffce391d54fc20869f2bb3896bce72ae"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"eb4534a40e1e15a6c5f3f906f8880260a1c64ec7","unresolved":false,"context_lines":[{"line_number":1184,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1185,"context_line":"            id\u003did).first()"},{"line_number":1186,"context_line":"        db_rc.update(updates)"},{"line_number":1187,"context_line":"        db_rc.save(context.session)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":""},{"line_number":1190,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_91c0947e","line":1187,"in_reply_to":"5a74a57a_a8ec5fc8","updated":"2016-11-24 05:13:21.000000000","message":"Emm....the transaction won\u0027t works, except the transaction level is \u0027Serializable\u0027. But I guess won\u0027t set to that level?\n\nSo I did a test. Add a sleep loop before this line, make it to reach the line 1187 slowly.\n\nThen I emit a delete request. When the first request reach the line 1187, there will be a exception raised.\n\n2016-11-24 13:22:38.421 TRACE nova.api.openstack StaleDataError: UPDATE statement on table \u0027resource_classes\u0027 expected to update 1 row(s); 0 were matched","commit_id":"674b4981ffce391d54fc20869f2bb3896bce72ae"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f914d7f2b029ccfdf5ff390ef35fdecb56d819c6","unresolved":false,"context_lines":[{"line_number":1184,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1185,"context_line":"            id\u003did).first()"},{"line_number":1186,"context_line":"        db_rc.update(updates)"},{"line_number":1187,"context_line":"        db_rc.save(context.session)"},{"line_number":1188,"context_line":""},{"line_number":1189,"context_line":""},{"line_number":1190,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":1,"id":"5a74a57a_a8ec5fc8","line":1187,"in_reply_to":"5a74a57a_f740130a","updated":"2016-11-23 15:36:31.000000000","message":"We won\u0027t, because we\u0027re inside a transaction. If L1184 succeeded, then this one will, even if the row is deleted outside our scope by something else.","commit_id":"674b4981ffce391d54fc20869f2bb3896bce72ae"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"754440fd9254688fa0777075dc1346cc64467b1c","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027save\u0027,"},{"line_number":1251,"context_line":"                                              reason\u003d\u0027ID attribute not found\u0027)"},{"line_number":1252,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":1253,"context_line":"        if updates and updates.keys() !\u003d [\u0027name\u0027]:"},{"line_number":1254,"context_line":"            raise exception.ObjectActionError("},{"line_number":1255,"context_line":"                action\u003d\u0027save\u0027,"},{"line_number":1256,"context_line":"                reason\u003d\u0027Immutable fields changed\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_b6b5947f","line":1253,"updated":"2016-11-30 14:42:55.000000000","message":"Do we want a short circuit here, like:\n\n    if not updates:\n        return","commit_id":"be6d2d58241f2ed87e61c1a7aad4cc41546f13b8"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"754440fd9254688fa0777075dc1346cc64467b1c","unresolved":false,"context_lines":[{"line_number":1256,"context_line":"                reason\u003d\u0027Immutable fields changed\u0027)"},{"line_number":1257,"context_line":"        # Never update any standard resource class, since the standard resource"},{"line_number":1258,"context_line":"        # classes don\u0027t even exist in the database table anyway."},{"line_number":1259,"context_line":"        _ensure_rc_cache(self._context)"},{"line_number":1260,"context_line":"        standards \u003d _RC_CACHE.get_standards()"},{"line_number":1261,"context_line":"        if self.id in (rc[\u0027id\u0027] for rc in standards):"},{"line_number":1262,"context_line":"            raise exception.ResourceClassCannotUpdateStandard("},{"line_number":1263,"context_line":"                    resource_class\u003dself.name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_b643d46b","line":1260,"range":{"start_line":1259,"start_character":0,"end_line":1260,"end_character":45},"updated":"2016-11-30 14:42:55.000000000","message":"Nit: This way of accessing _RC_CACHE is starting to seem odd somehow. Maybe _get_rc_cache is more straight forward than the separate ensure call, duno. Just thinking out loud.","commit_id":"be6d2d58241f2ed87e61c1a7aad4cc41546f13b8"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"754440fd9254688fa0777075dc1346cc64467b1c","unresolved":false,"context_lines":[{"line_number":1262,"context_line":"            raise exception.ResourceClassCannotUpdateStandard("},{"line_number":1263,"context_line":"                    resource_class\u003dself.name)"},{"line_number":1264,"context_line":"        self._save(self._context, self.id, updates)"},{"line_number":1265,"context_line":"        _RC_CACHE.clear()"},{"line_number":1266,"context_line":""},{"line_number":1267,"context_line":"    @staticmethod"},{"line_number":1268,"context_line":"    @db_api.api_context_manager.writer"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a74a57a_f6a2ac99","line":1265,"updated":"2016-11-30 14:42:55.000000000","message":"This should be fine once we fix the dependent patch.","commit_id":"be6d2d58241f2ed87e61c1a7aad4cc41546f13b8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0a24e6bdd986e02ac844e1a6d403b35fa215e4de","unresolved":false,"context_lines":[{"line_number":1249,"context_line":"        if \u0027id\u0027 not in self:"},{"line_number":1250,"context_line":"            raise exception.ObjectActionError(action\u003d\u0027save\u0027,"},{"line_number":1251,"context_line":"                                              reason\u003d\u0027ID attribute not found\u0027)"},{"line_number":1252,"context_line":"        updates \u003d self.obj_get_changes()"},{"line_number":1253,"context_line":"        if \u0027id\u0027 in updates:"},{"line_number":1254,"context_line":"            raise exception.ObjectActionError("},{"line_number":1255,"context_line":"                action\u003d\u0027save\u0027,"},{"line_number":1256,"context_line":"                reason\u003d\u0027Immutable fields changed\u0027)"},{"line_number":1257,"context_line":"        # Never update any standard resource class, since the standard resource"},{"line_number":1258,"context_line":"        # classes don\u0027t even exist in the database table anyway."},{"line_number":1259,"context_line":"        _ensure_rc_cache(self._context)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_8120649d","line":1256,"range":{"start_line":1252,"start_character":8,"end_line":1256,"end_character":50},"updated":"2016-12-01 17:43:18.000000000","message":"Doesn\u0027t read_only\u003dTrue on the id field make this redundant? \n\n\u003e\u003e\u003e from nova.objects import resource_provider as rp\n\u003e\u003e\u003e rc \u003d rp.ResourceClass(id\u003d1, name\u003d\u0027CUSTOM_JAYBIRD\u0027)\n\u003e\u003e\u003e str(rc)\n\"ResourceClass(id\u003d1,name\u003d\u0027CUSTOM_JAYBIRD\u0027)\"\n\u003e\u003e\u003e rc.id \u003d 2\nTraceback (most recent call last):\n  File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n  File \"/home/user/git/nova/.tox/py27/local/lib/python2.7/site-packages/oslo_versionedobjects/base.py\", line 77, in setter\n    raise exception.ReadOnlyFieldError(field\u003dname)\noslo_versionedobjects.exception.ReadOnlyFieldError: Cannot modify readonly field id\n\u003e\u003e\u003e","commit_id":"0d93d43d623a3cf701b860c4f87db4cfa75587ac"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0a24e6bdd986e02ac844e1a6d403b35fa215e4de","unresolved":false,"context_lines":[{"line_number":1270,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1271,"context_line":"            id\u003did).first()"},{"line_number":1272,"context_line":"        db_rc.update(updates)"},{"line_number":1273,"context_line":"        db_rc.save(context.session)"},{"line_number":1274,"context_line":""},{"line_number":1275,"context_line":""},{"line_number":1276,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_e1f678d6","line":1273,"updated":"2016-12-01 17:43:18.000000000","message":"This can fail with a duplicate exception because of the unique constraint on the name column in the resource_classes table. Do you want to raise up something specific for that or is the REST API layer going to handle the DBDuplicateEntry failure? We should probably have a unit test case for duplicates.","commit_id":"0d93d43d623a3cf701b860c4f87db4cfa75587ac"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9dc5cbf60dfaf84377b00c8d8865f6fc7e69d4e0","unresolved":false,"context_lines":[{"line_number":1270,"context_line":"        db_rc \u003d context.session.query(models.ResourceClass).filter_by("},{"line_number":1271,"context_line":"            id\u003did).first()"},{"line_number":1272,"context_line":"        db_rc.update(updates)"},{"line_number":1273,"context_line":"        db_rc.save(context.session)"},{"line_number":1274,"context_line":""},{"line_number":1275,"context_line":""},{"line_number":1276,"context_line":"@base.NovaObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a71b18c_d2b0688e","line":1273,"in_reply_to":"3a71b18c_e1f678d6","updated":"2016-12-01 19:01:14.000000000","message":"Should probably handle the DBDuplicateEntry and raise up ResourceClassExists as it looks like that\u0027s what the REST API code using the object expects in cases like this.","commit_id":"0d93d43d623a3cf701b860c4f87db4cfa75587ac"}]}
