)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"27179f1d9dc8046869c574174adeb0d89d1262d4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c2fa42b2_c7b8ac08","updated":"2022-05-09 21:00:26.000000000","message":"@Eric: response inline.","commit_id":"69416b1ef1682f652d9deff3055b87280fdcccab"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"a200ae13b432b87cc7f1f716a45af40c09edc86f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"cb318c2a_d48e89f9","updated":"2022-04-29 14:57:50.000000000","message":"Think this makes sense.","commit_id":"69416b1ef1682f652d9deff3055b87280fdcccab"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"40f4b35aa704d69e8db98a9dc617755d1cc9a1bf","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"771f4383_1efb9cc2","updated":"2022-04-27 22:03:26.000000000","message":"recheck tempest-slow-py3 couldn\u0027t set up devstack","commit_id":"69416b1ef1682f652d9deff3055b87280fdcccab"},{"author":{"_account_id":20813,"name":"Sofia Enriquez","email":"lsofia.enriquez@gmail.com","username":"enriquetaso"},"change_message_id":"f35d202c44b7d4bb80375323a86cdeae5b061b58","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"68f64a84_4aa1829a","updated":"2022-05-12 14:16:39.000000000","message":"Thank you for working on this. Maybe I misunderstood concepts here but, should this code use hasattr instead?","commit_id":"33de368847485cd12384dda087fc979c6d8e8d73"},{"author":{"_account_id":28801,"name":"Cisco Cinder CI","email":"cisco-cinder-ci@cisco.com","username":"cisco-cinder-ci"},"change_message_id":"d904c3013412e0fedaa8cdd9d103ec6e57563c2a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1633ea9b_2faf0258","updated":"2022-05-26 04:48:45.000000000","message":"cisco-cinder-ci","commit_id":"33de368847485cd12384dda087fc979c6d8e8d73"},{"author":{"_account_id":28801,"name":"Cisco Cinder CI","email":"cisco-cinder-ci@cisco.com","username":"cisco-cinder-ci"},"change_message_id":"af85e52baf6ebdb627c5c5e9ec61b7e109af9752","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"d67c77bf_94f187ad","updated":"2022-05-26 06:30:28.000000000","message":"cisco-cinder-ci","commit_id":"33de368847485cd12384dda087fc979c6d8e8d73"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"950d87873e63f92876ad4d97cf0eccefdd82434c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"e8d4d6d7_c416d8cd","updated":"2022-05-10 14:14:10.000000000","message":"recheck cinder-plugin-ceph-tempest - 52 failures, mostly tempest.lib.exceptions.IdentityError: Got identity error: Details: Unexpected status code 500","commit_id":"33de368847485cd12384dda087fc979c6d8e8d73"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"386b8cef2322673615bf6a476111c62a53cfb56d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"cd9be3fb_0b3f132e","in_reply_to":"68f64a84_4aa1829a","updated":"2022-05-16 16:56:56.000000000","message":"@Sofia: that\u0027s a really good question.  It has to do with backup being an oslo versioned object.  An ovo implements __dict__(), so we can use \u0027in\u0027 with it (whereas you can\u0027t with a normal object).  The other thing is that ovo\u0027s are created in 2 steps: b \u003d Backup(), and then b.create() (which makes the database connection and populates the fields).  So if something goes wrong during create(), the fields may not be created, which gives you this kind of situation:\n\n  $ .tox/py38/bin/python\n  Python 3.8.10 (default, May  4 2021, 00:00:00) \n  \u003e\u003e\u003e from cinder.objects import backup\n  \u003e\u003e\u003e b \u003d backup.Backup()\n  \u003e\u003e\u003e \u0027id\u0027 in b\n  False\n  \u003e\u003e\u003e hasattr(b, \u0027id\u0027)\n  Traceback (most recent call last):\n    File \"\u003cstdin\u003e\", line 1, in \u003cmodule\u003e\n    File \"/home/brosmait/repos/openstack/cinder/.tox/py38/lib/python3.8/site-packages/oslo_versionedobjects/base.py\", line 67, in getter\n      self.obj_load_attr(name)\n    File \"/home/brosmait/repos/openstack/cinder/cinder/objects/backup.py\", line 145, in obj_load_attr\n      raise exception.ObjectActionError(\n  oslo_versionedobjects.exception.ObjectActionError: Object action obj_load_attr failed because: attribute id not lazy-loadable\n  \u003e\u003e\u003e \n\nSomething like this must have happened at some point, because we have 2 tests around this in cinder/tests/unit/test_backup.py:\n- test_create_when_failed_to_create_backup_object\n- test_create_when_failed_to_new_backup_object","commit_id":"33de368847485cd12384dda087fc979c6d8e8d73"},{"author":{"_account_id":20813,"name":"Sofia Enriquez","email":"lsofia.enriquez@gmail.com","username":"enriquetaso"},"change_message_id":"c74718519d13dc2ad5d4fddf7dd3d4efee8b9334","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"c44ac6ea_fb0e743d","in_reply_to":"cd9be3fb_0b3f132e","updated":"2022-05-16 19:08:05.000000000","message":"Thanks!!","commit_id":"33de368847485cd12384dda087fc979c6d8e8d73"}],"cinder/backup/api.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"97035dcc448e0947c95620b862af67bdf0705f4c","unresolved":true,"context_lines":[{"line_number":357,"context_line":"        except Exception:"},{"line_number":358,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":359,"context_line":"                try:"},{"line_number":360,"context_line":"                    if \u0027id\u0027 in backup:"},{"line_number":361,"context_line":"                        backup.destroy()"},{"line_number":362,"context_line":"                finally:"},{"line_number":363,"context_line":"                    QUOTAS.rollback(context, reservations)"}],"source_content_type":"text/x-python","patch_set":1,"id":"15c3251e_ef3bfa38","line":360,"updated":"2022-05-06 15:30:23.000000000","message":"I\u0027m not sure if this actually works...\n\nIf objects.Backup() on line 346 throws an exception, the \"backup\" variable won\u0027t be created, so this will throw a NameError exception (rather than returning False).","commit_id":"69416b1ef1682f652d9deff3055b87280fdcccab"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"27179f1d9dc8046869c574174adeb0d89d1262d4","unresolved":true,"context_lines":[{"line_number":357,"context_line":"        except Exception:"},{"line_number":358,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":359,"context_line":"                try:"},{"line_number":360,"context_line":"                    if \u0027id\u0027 in backup:"},{"line_number":361,"context_line":"                        backup.destroy()"},{"line_number":362,"context_line":"                finally:"},{"line_number":363,"context_line":"                    QUOTAS.rollback(context, reservations)"}],"source_content_type":"text/x-python","patch_set":1,"id":"a06f5b1c_e28c099b","line":360,"in_reply_to":"15c3251e_ef3bfa38","updated":"2022-05-09 21:00:26.000000000","message":"If line 346 raises, we\u0027re catching Exception at line 347 and then re-raising out of the function, so we won\u0027t reach this line.\n\nBut even better, there\u0027s already a test for this situation:\nhttps://review.opendev.org/c/openstack/cinder/+/839628/1/cinder/tests/unit/backup/test_backup.py#2020","commit_id":"69416b1ef1682f652d9deff3055b87280fdcccab"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"57ec819fe48cd050bfcb20aa7a8d8fb9c20509fb","unresolved":false,"context_lines":[{"line_number":357,"context_line":"        except Exception:"},{"line_number":358,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":359,"context_line":"                try:"},{"line_number":360,"context_line":"                    if \u0027id\u0027 in backup:"},{"line_number":361,"context_line":"                        backup.destroy()"},{"line_number":362,"context_line":"                finally:"},{"line_number":363,"context_line":"                    QUOTAS.rollback(context, reservations)"}],"source_content_type":"text/x-python","patch_set":1,"id":"62496d81_3146a94e","line":360,"in_reply_to":"a06f5b1c_e28c099b","updated":"2022-05-09 21:56:03.000000000","message":"Correct -- I think I was looking at this sideways or something.","commit_id":"69416b1ef1682f652d9deff3055b87280fdcccab"}]}
