)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08773f3bac215bbf2a43a3aadc98f9de3c5553f1","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Prevent a race condition for the deletion of a file when there"},{"line_number":10,"context_line":"is more than one process trying to erase the file."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I58e07b9e630c063f894cbbb138612a39e912acd5"},{"line_number":13,"context_line":"Closes-bug: #1266580"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"AAAAUX%2F%2FpgM%3D","line":11,"updated":"2014-02-11 19:02:41.000000000","message":"Would be good to call out the specific exceptions you\u0027re adding now like you have listed in the dependent patch\u0027s commit.","commit_id":"a6a6bf50a4e16a816e297d0136617b5e515c7596"}],"nova/tests/virt/vmwareapi/test_driver_api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"25d878f2c8036061ffc01a491fe99e21330526e0","unresolved":false,"context_lines":[{"line_number":427,"context_line":"                                   \u0027node\u0027: self.instance_node})"},{"line_number":428,"context_line":"        self._check_vm_info(info, power_state.RUNNING)"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    def test_spawn_with_delete_exception(self):"},{"line_number":431,"context_line":"        self.wait_task \u003d self.conn._session._wait_for_task"},{"line_number":432,"context_line":"        self.call_method \u003d self.conn._session._call_method"},{"line_number":433,"context_line":"        self.task_ref \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BK6Q%3D","line":430,"updated":"2014-01-29 13:51:25.000000000","message":"This tests the exception case, but in a single thread.  Is there a relatively easy/straight-forward way to test the flow that two threads are trying to delete the file but the first process has a lock on the file so the second has to wait for it?","commit_id":"726ee4d0490b2e1edcccd4e92601ff96fa3d7ca3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d68c9170d191eed0c9312060b26dbf59c0dcc58f","unresolved":false,"context_lines":[{"line_number":427,"context_line":"                                   \u0027node\u0027: self.instance_node})"},{"line_number":428,"context_line":"        self._check_vm_info(info, power_state.RUNNING)"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    def test_spawn_with_delete_exception(self):"},{"line_number":431,"context_line":"        self.wait_task \u003d self.conn._session._wait_for_task"},{"line_number":432,"context_line":"        self.call_method \u003d self.conn._session._call_method"},{"line_number":433,"context_line":"        self.task_ref \u003d None"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BKvs%3D","line":430,"in_reply_to":"AAAAUH%2F%2BK6Q%3D","updated":"2014-01-29 14:23:43.000000000","message":"If you remove the sync block then you can ignore this comment.","commit_id":"726ee4d0490b2e1edcccd4e92601ff96fa3d7ca3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b0b9394b7757701c1201e9b6f225da52c0cf44c3","unresolved":false,"context_lines":[{"line_number":446,"context_line":"                self.task_ref \u003d task_ref"},{"line_number":447,"context_line":"            return task_ref"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        self.stubs.Set(self.conn._session, \"_call_method\", fake_call_method)"},{"line_number":450,"context_line":"        self.stubs.Set(self.conn._session, \"_wait_for_task\","},{"line_number":451,"context_line":"                       fake_wait_for_task)"},{"line_number":452,"context_line":"        self._create_vm()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BKoU%3D","line":449,"updated":"2014-01-29 14:43:33.000000000","message":"Can you use mock with side_effect to call your fake methods?","commit_id":"906920a3c207ea2fff04f27f52bfc5cdb094c18e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"9261547f806f5e4d26e04206f0371872a23d35f3","unresolved":false,"context_lines":[{"line_number":446,"context_line":"                self.task_ref \u003d task_ref"},{"line_number":447,"context_line":"            return task_ref"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        self.stubs.Set(self.conn._session, \"_call_method\", fake_call_method)"},{"line_number":450,"context_line":"        self.stubs.Set(self.conn._session, \"_wait_for_task\","},{"line_number":451,"context_line":"                       fake_wait_for_task)"},{"line_number":452,"context_line":"        self._create_vm()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BKak%3D","line":449,"in_reply_to":"AAAAUH%2F%2BKoU%3D","updated":"2014-01-29 15:21:44.000000000","message":"Agree. Please.","commit_id":"906920a3c207ea2fff04f27f52bfc5cdb094c18e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"794a5ae87a2d298878c2568b57507e208825cc38","unresolved":false,"context_lines":[{"line_number":446,"context_line":"                self.task_ref \u003d task_ref"},{"line_number":447,"context_line":"            return task_ref"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        self.stubs.Set(self.conn._session, \"_call_method\", fake_call_method)"},{"line_number":450,"context_line":"        self.stubs.Set(self.conn._session, \"_wait_for_task\","},{"line_number":451,"context_line":"                       fake_wait_for_task)"},{"line_number":452,"context_line":"        self._create_vm()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BKnQ%3D","line":449,"in_reply_to":"AAAAUH%2F%2BKoU%3D","updated":"2014-01-29 15:31:39.000000000","message":"Done","commit_id":"906920a3c207ea2fff04f27f52bfc5cdb094c18e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"e17fc048ea134e7e2a3a3448275c948377ea5ce8","unresolved":false,"context_lines":[{"line_number":465,"context_line":""},{"line_number":466,"context_line":"        with ("},{"line_number":467,"context_line":"            mock.patch.object(self.conn._session, \u0027_call_method\u0027,"},{"line_number":468,"context_line":"                              fake_call_method)"},{"line_number":469,"context_line":"        ):"},{"line_number":470,"context_line":"            self._create_vm()"},{"line_number":471,"context_line":"            info \u003d self.conn.get_info({\u0027uuid\u0027: self.uuid,"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F90Jw%3D","line":468,"updated":"2014-02-03 17:38:58.000000000","message":"The decorator method of patching would make this a lot less ugly, FWIW :)","commit_id":"663c003b068cf0937a3cf1db63c5edd59ab7e8e4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08773f3bac215bbf2a43a3aadc98f9de3c5553f1","unresolved":false,"context_lines":[{"line_number":449,"context_line":"        self._check_vm_info(info, power_state.RUNNING)"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"    def _spawn_with_delete_exception(self, fault):"},{"line_number":452,"context_line":"        self.call_method \u003d self.conn._session._call_method"},{"line_number":453,"context_line":"        self.task_ref \u003d None"},{"line_number":454,"context_line":"        self.exception_raised \u003d False"},{"line_number":455,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2FpfI%3D","line":452,"updated":"2014-02-11 19:02:41.000000000","message":"Re-use your _set_move_exception_vars from the dependent patch.","commit_id":"a6a6bf50a4e16a816e297d0136617b5e515c7596"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08773f3bac215bbf2a43a3aadc98f9de3c5553f1","unresolved":false,"context_lines":[{"line_number":479,"context_line":"        self._spawn_with_delete_exception(vmwareapi_fake.FileFault())"},{"line_number":480,"context_line":""},{"line_number":481,"context_line":"    def test_spawn_with_delete_exception_general(self):"},{"line_number":482,"context_line":"        self.call_method \u003d self.conn._session._call_method"},{"line_number":483,"context_line":"        self.task_ref \u003d None"},{"line_number":484,"context_line":"        self.exception_raised \u003d False"},{"line_number":485,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Fpek%3D","line":482,"updated":"2014-02-11 19:02:41.000000000","message":"re-use _set_move_exception_vars","commit_id":"a6a6bf50a4e16a816e297d0136617b5e515c7596"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08773f3bac215bbf2a43a3aadc98f9de3c5553f1","unresolved":false,"context_lines":[{"line_number":495,"context_line":"            mock.patch.object(self.conn._session, \u0027_call_method\u0027,"},{"line_number":496,"context_line":"                              fake_call_method)"},{"line_number":497,"context_line":"        ):"},{"line_number":498,"context_line":"            self.assertRaises(exception.NovaException,"},{"line_number":499,"context_line":"                              self._create_vm)"},{"line_number":500,"context_line":"            self.assertTrue(self.exception_raised)"},{"line_number":501,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Fpeo%3D","line":498,"updated":"2014-02-11 19:02:41.000000000","message":"Should be VMwareDriverException rather than NovaException right?","commit_id":"a6a6bf50a4e16a816e297d0136617b5e515c7596"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"caa7449b08291166994665d87a5093b3718c7120","unresolved":false,"context_lines":[{"line_number":479,"context_line":"        def fake_call_method(module, method, *args, **kwargs):"},{"line_number":480,"context_line":"            task_ref \u003d self.call_method(module, method, *args, **kwargs)"},{"line_number":481,"context_line":"            if method \u003d\u003d \"DeleteDatastoreFile_Task\":"},{"line_number":482,"context_line":"                self.exception_raised \u003d True"},{"line_number":483,"context_line":"                task_mdo \u003d vmwareapi_fake.create_task(method, \"error\","},{"line_number":484,"context_line":"                        error_fault\u003dfault)"},{"line_number":485,"context_line":"                return task_mdo.obj"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FIEs%3D","line":482,"updated":"2014-02-16 20:33:56.000000000","message":"Should be using self.move_exception right?  Since that\u0027s defined in _set_exception_vars and if you don\u0027t hit this block then the assertion on line 496 would result in an UnboundLocalError.","commit_id":"dacc040cdf5646b494a9b01452164b8039d85ba7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"caa7449b08291166994665d87a5093b3718c7120","unresolved":false,"context_lines":[{"line_number":507,"context_line":"    def test_spawn_with_delete_exception_file_locked(self):"},{"line_number":508,"context_line":"        self._spawn_with_delete_exception(vmwareapi_fake.FileLocked())"},{"line_number":509,"context_line":""},{"line_number":510,"context_line":"    def test_spawn_with_delete_exception_general(self):"},{"line_number":511,"context_line":"        self._set_exception_vars()"},{"line_number":512,"context_line":""},{"line_number":513,"context_line":"        def fake_call_method(module, method, *args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FIEg%3D","line":510,"updated":"2014-02-16 20:33:56.000000000","message":"Can the general case be handled in _spawn_with_delete_exception if fault\u003dNone?  95% of the code between those two tests are the same so it seems you should be able to handle the general case in the private method by handling if fault \u003d\u003d None.","commit_id":"dacc040cdf5646b494a9b01452164b8039d85ba7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"caa7449b08291166994665d87a5093b3718c7120","unresolved":false,"context_lines":[{"line_number":513,"context_line":"        def fake_call_method(module, method, *args, **kwargs):"},{"line_number":514,"context_line":"            task_ref \u003d self.call_method(module, method, *args, **kwargs)"},{"line_number":515,"context_line":"            if method \u003d\u003d \"DeleteDatastoreFile_Task\":"},{"line_number":516,"context_line":"                self.exception_raised \u003d True"},{"line_number":517,"context_line":"                task_mdo \u003d vmwareapi_fake.create_task(method, \"error\")"},{"line_number":518,"context_line":"                return task_mdo.obj"},{"line_number":519,"context_line":"            return task_ref"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FIEo%3D","line":516,"updated":"2014-02-16 20:33:56.000000000","message":"same comment here","commit_id":"dacc040cdf5646b494a9b01452164b8039d85ba7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"caa7449b08291166994665d87a5093b3718c7120","unresolved":false,"context_lines":[{"line_number":602,"context_line":"        self.assertRaises(exception.InstanceUnacceptable,"},{"line_number":603,"context_line":"                          self._create_vm)"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":"    def _set_exception_vars(self):"},{"line_number":606,"context_line":"        self.wait_task \u003d self.conn._session._wait_for_task"},{"line_number":607,"context_line":"        self.call_method \u003d self.conn._session._call_method"},{"line_number":608,"context_line":"        self.task_ref \u003d None"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FIEU%3D","line":605,"updated":"2014-02-16 20:33:56.000000000","message":"Should this be called in the setUp instead of in each individual test that needs it?","commit_id":"dacc040cdf5646b494a9b01452164b8039d85ba7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0233dcaefefc9825e38606bf44cff2120ae75392","unresolved":false,"context_lines":[{"line_number":485,"context_line":"        def fake_call_method(module, method, *args, **kwargs):"},{"line_number":486,"context_line":"            task_ref \u003d self.call_method(module, method, *args, **kwargs)"},{"line_number":487,"context_line":"            if method \u003d\u003d \"DeleteDatastoreFile_Task\":"},{"line_number":488,"context_line":"                self.exception_raised \u003d True"},{"line_number":489,"context_line":"                task_mdo \u003d vmwareapi_fake.create_task(method, \"error\","},{"line_number":490,"context_line":"                        error_fault\u003dfault)"},{"line_number":491,"context_line":"                return task_mdo.obj"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2B%2Fy4%3D","line":488,"updated":"2014-02-17 18:44:58.000000000","message":"Shouldn\u0027t this be initialized outside of the stub to avoid an UnboundLocalError if the assertion fails?\n\nWhy not just use self.exception?","commit_id":"cc6841bf3b14a499b8e719f7ae4d7b053d6c455f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"92104af0a5119067b0f601043c798cccc01897e8","unresolved":false,"context_lines":[{"line_number":485,"context_line":"        def fake_call_method(module, method, *args, **kwargs):"},{"line_number":486,"context_line":"            task_ref \u003d self.call_method(module, method, *args, **kwargs)"},{"line_number":487,"context_line":"            if method \u003d\u003d \"DeleteDatastoreFile_Task\":"},{"line_number":488,"context_line":"                self.exception_raised \u003d True"},{"line_number":489,"context_line":"                task_mdo \u003d vmwareapi_fake.create_task(method, \"error\","},{"line_number":490,"context_line":"                        error_fault\u003dfault)"},{"line_number":491,"context_line":"                return task_mdo.obj"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2B7FI%3D","line":488,"in_reply_to":"AAAAUX%2F%2B%2Fy4%3D","updated":"2014-02-18 07:18:05.000000000","message":"my bad - missed with the last update","commit_id":"cc6841bf3b14a499b8e719f7ae4d7b053d6c455f"}],"nova/virt/vmwareapi/error_util.py":[{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"40ab45bcd58cbefc9cf2ebaa7b099b3c7dc428fe","unresolved":false,"context_lines":[{"line_number":162,"context_line":"FILE_LOCKED \u003d \u0027FileLocked\u0027"},{"line_number":163,"context_line":"FILE_NOT_FOUND \u003d \u0027FileNotFound\u0027"},{"line_number":164,"context_line":"INVALID_PROPERTY \u003d \u0027InvalidProperty\u0027"},{"line_number":165,"context_line":"NOT_AUTHENTICATED \u003d \u0027NotAuthenticated\u0027"},{"line_number":166,"context_line":"# Populate the fault registry with the exceptions that have"},{"line_number":167,"context_line":"# special treatment."},{"line_number":168,"context_line":"_fault_classes_registry \u003d {"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUX%2F%2Fr2w%3D","line":165,"updated":"2014-02-11 14:23:56.000000000","message":"Constants normally go near the top, where you had them before.  But that\u0027s not absolutely required by PEP8, and I see the value in putting them right before they\u0027re used in the dict, so ok.","commit_id":"47a608a8da0a8c0b3e66216a8657a2eb17347ba0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08773f3bac215bbf2a43a3aadc98f9de3c5553f1","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    code \u003d 409"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"class CannotDeleteFileException(VMwareDriverException):"},{"line_number":132,"context_line":"    msg_fmt \u003d _(\"Cannot delete file.\")"},{"line_number":133,"context_line":"    code \u003d 403"},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2FpeU%3D","line":131,"updated":"2014-02-11 19:02:41.000000000","message":"where is this tested?","commit_id":"a6a6bf50a4e16a816e297d0136617b5e515c7596"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08773f3bac215bbf2a43a3aadc98f9de3c5553f1","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    msg_fmt \u003d _(\"File fault.\")"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"class FileLockedException(VMwareDriverException):"},{"line_number":146,"context_line":"    msg_fmt \u003d _(\"File locked.\")"},{"line_number":147,"context_line":"    code \u003d 403"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2FpeY%3D","line":145,"updated":"2014-02-11 19:02:41.000000000","message":"where is this tested?","commit_id":"a6a6bf50a4e16a816e297d0136617b5e515c7596"},{"author":{"_account_id":9172,"name":"Radoslav Gerganov","email":"rgerganov@vmware.com","username":"rgerganov"},"change_message_id":"aaf4637d25e2176c52802aeb6465aff1dbe30ef1","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    code \u003d 409"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"class FileFaultException(VMwareDriverException):"},{"line_number":151,"context_line":"    msg_fmt \u003d _(\"File fault.\")"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FI%2Bk%3D","line":150,"updated":"2014-02-16 09:21:05.000000000","message":"why no code for this one?","commit_id":"dacc040cdf5646b494a9b01452164b8039d85ba7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0233dcaefefc9825e38606bf44cff2120ae75392","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    code \u003d 409"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"class FileFaultException(VMwareDriverException):"},{"line_number":151,"context_line":"    msg_fmt \u003d _(\"File fault.\")"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2B%2Fxo%3D","line":150,"updated":"2014-02-17 18:44:58.000000000","message":"Why no code for this one (Radoslav asked this before but didn\u0027t get a reply).","commit_id":"cc6841bf3b14a499b8e719f7ae4d7b053d6c455f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"92104af0a5119067b0f601043c798cccc01897e8","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    code \u003d 409"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":""},{"line_number":150,"context_line":"class FileFaultException(VMwareDriverException):"},{"line_number":151,"context_line":"    msg_fmt \u003d _(\"File fault.\")"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2B7C0%3D","line":150,"in_reply_to":"AAAAUX%2F%2B%2Fxo%3D","updated":"2014-02-18 07:18:05.000000000","message":"I answered on the last patch set. The default is 500. https://github.com/openstack/nova/blob/master/nova/exception.py#L103. Maybe 409 is better here","commit_id":"cc6841bf3b14a499b8e719f7ae4d7b053d6c455f"}],"nova/virt/vmwareapi/fake.py":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2f9152a9c78ad20a9c6397446bd174497e2e8ab3","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        self.__name__ \u003d \u0027FileAlreadyExists\u0027"},{"line_number":277,"context_line":""},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"class FileNotFound(DataObject):"},{"line_number":280,"context_line":"    \"\"\"File not found class.\"\"\""},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9gmc%3D","line":279,"updated":"2014-02-06 12:31:08.000000000","message":"Nit: rather than proliferating these, I\u0027d personally be inclined to create them dynamically in the test that uses them. For convenience you might create a parallel get_fault_class() in fake which simply returns a correctly named subclass of DataObject. No need for a cache in this case.","commit_id":"1c12ad5eb8bac799a7888960a090e2f6e2ad83d0"}],"nova/virt/vmwareapi/vmops.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"25d878f2c8036061ffc01a491fe99e21330526e0","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        @utils.synchronized(datastore_path)"},{"line_number":165,"context_line":"        def _sync_delete_datastore_file():"},{"line_number":166,"context_line":"            file_delete_task \u003d self._session._call_method("},{"line_number":167,"context_line":"                    self._session._get_vim(),"},{"line_number":168,"context_line":"                    \"DeleteDatastoreFile_Task\","},{"line_number":169,"context_line":"                    vim.get_service_content().fileManager,"},{"line_number":170,"context_line":"                    name\u003ddatastore_path,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BLHQ%3D","line":167,"updated":"2014-01-29 13:51:25.000000000","message":"Can\u0027t you just pass in the vim variable on this line?","commit_id":"726ee4d0490b2e1edcccd4e92601ff96fa3d7ca3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e370a49c87504a4da9391fda46592599a570009f","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        @utils.synchronized(datastore_path)"},{"line_number":165,"context_line":"        def _sync_delete_datastore_file():"},{"line_number":166,"context_line":"            file_delete_task \u003d self._session._call_method("},{"line_number":167,"context_line":"                    self._session._get_vim(),"},{"line_number":168,"context_line":"                    \"DeleteDatastoreFile_Task\","},{"line_number":169,"context_line":"                    vim.get_service_content().fileManager,"},{"line_number":170,"context_line":"                    name\u003ddatastore_path,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BK3w%3D","line":167,"in_reply_to":"AAAAUH%2F%2BLHQ%3D","updated":"2014-01-29 14:06:30.000000000","message":"Done","commit_id":"726ee4d0490b2e1edcccd4e92601ff96fa3d7ca3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"25d878f2c8036061ffc01a491fe99e21330526e0","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            try:"},{"line_number":173,"context_line":"                self._session._wait_for_task(instance[\u0027uuid\u0027],"},{"line_number":174,"context_line":"                                             file_delete_task)"},{"line_number":175,"context_line":"            except Exception as e:"},{"line_number":176,"context_line":"                # TODO(garyk): ensure that _wait_for_task raises an exception"},{"line_number":177,"context_line":"                # that can be specifically treated here."},{"line_number":178,"context_line":"                LOG.warning(_(\"Unable to delete %(ds). Exception: %(ex)s\"),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BLHI%3D","line":175,"updated":"2014-01-29 13:51:25.000000000","message":"Is this exception just to handle the case that thread A has the lock and deletes the file while thread B is waiting on the lock, and when thread B gets into the mutex the file is gone so deleting the file raises an exception?\n\nIs there a way to check if the file exists when you get into the block?  That would seem to be cleaner in case there is some more specific failure here (which is what your TODO seems to be for).","commit_id":"726ee4d0490b2e1edcccd4e92601ff96fa3d7ca3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d68c9170d191eed0c9312060b26dbf59c0dcc58f","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            try:"},{"line_number":173,"context_line":"                self._session._wait_for_task(instance[\u0027uuid\u0027],"},{"line_number":174,"context_line":"                                             file_delete_task)"},{"line_number":175,"context_line":"            except Exception as e:"},{"line_number":176,"context_line":"                # TODO(garyk): ensure that _wait_for_task raises an exception"},{"line_number":177,"context_line":"                # that can be specifically treated here."},{"line_number":178,"context_line":"                LOG.warning(_(\"Unable to delete %(ds). Exception: %(ex)s\"),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BKvw%3D","line":175,"in_reply_to":"AAAAUH%2F%2BK1M%3D","updated":"2014-01-29 14:23:43.000000000","message":"OK, so after discussing this with Gary in IRC there is a way to check if the file exists but this can still fail in case 2 noted above when there are multiple compute nodes booting the same image, so the sync block is really only useful in the single-node case AND if there was a file existence check tied to it.\n\nSo if you\u0027re not going to add a file existence check, you might as well remove the sync block since you\u0027ll get an exception either way if thread A deletes the file and then thread B tries to delete it but it\u0027s already gone.\n\nAs for the exception being more specific, the plan is to cover that as part of blueprint vmware-api where the vim fault exceptions will have specific status codes (like db faults) to be able to handle them in a more specific way.","commit_id":"726ee4d0490b2e1edcccd4e92601ff96fa3d7ca3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"e370a49c87504a4da9391fda46592599a570009f","unresolved":false,"context_lines":[{"line_number":172,"context_line":"            try:"},{"line_number":173,"context_line":"                self._session._wait_for_task(instance[\u0027uuid\u0027],"},{"line_number":174,"context_line":"                                             file_delete_task)"},{"line_number":175,"context_line":"            except Exception as e:"},{"line_number":176,"context_line":"                # TODO(garyk): ensure that _wait_for_task raises an exception"},{"line_number":177,"context_line":"                # that can be specifically treated here."},{"line_number":178,"context_line":"                LOG.warning(_(\"Unable to delete %(ds). Exception: %(ex)s\"),"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2BK1M%3D","line":175,"in_reply_to":"AAAAUH%2F%2BLHI%3D","updated":"2014-01-29 14:06:30.000000000","message":"There are two cases here:\n1. the nova-compute has multiple threads running and we want to ensure that the image deletion will be blocked by the one thread\n2. If there is more than one nova compute. In the case when the image is not cached and say more than one nova compute will try and cache the image. in this case the Exception will occur.\n\nMaybe it is best that I remove the sync as the excsption will occur in any case.\n\nRegarding the exption. At the moment the VC exception is not elevated to the nova compute. This is not a minor task and I would prefer to do it outside of this patch.","commit_id":"726ee4d0490b2e1edcccd4e92601ff96fa3d7ca3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"209690c2071f26c52488d2dccba0da9f9e6e19f7","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        LOG.debug(_(\"Extended root virtual disk\"))"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def _delete_datastore_file(self, instance, datastore_path, dc_ref):"},{"line_number":160,"context_line":"        LOG.debug(_(\"Deleting the datastore file %s\") % datastore_path,"},{"line_number":161,"context_line":"                  instance\u003dinstance)"},{"line_number":162,"context_line":"        vim \u003d self._session._get_vim()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BKog%3D","line":159,"updated":"2014-01-29 14:42:42.000000000","message":"Maybe we want a comment in the code about why we don\u0027t synchronize this method?","commit_id":"906920a3c207ea2fff04f27f52bfc5cdb094c18e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"794a5ae87a2d298878c2568b57507e208825cc38","unresolved":false,"context_lines":[{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        LOG.debug(_(\"Extended root virtual disk\"))"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"    def _delete_datastore_file(self, instance, datastore_path, dc_ref):"},{"line_number":160,"context_line":"        LOG.debug(_(\"Deleting the datastore file %s\") % datastore_path,"},{"line_number":161,"context_line":"                  instance\u003dinstance)"},{"line_number":162,"context_line":"        vim \u003d self._session._get_vim()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BKnU%3D","line":159,"in_reply_to":"AAAAUH%2F%2BKog%3D","updated":"2014-01-29 15:31:39.000000000","message":"Done","commit_id":"906920a3c207ea2fff04f27f52bfc5cdb094c18e"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"9261547f806f5e4d26e04206f0371872a23d35f3","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        try:"},{"line_number":170,"context_line":"            self._session._wait_for_task(instance[\u0027uuid\u0027],"},{"line_number":171,"context_line":"                                         file_delete_task)"},{"line_number":172,"context_line":"        except Exception as e:"},{"line_number":173,"context_line":"            # TODO(garyk): ensure that _wait_for_task raises an exception"},{"line_number":174,"context_line":"            # that can be specifically treated here."},{"line_number":175,"context_line":"            LOG.warning(_(\"Unable to delete %(ds). Exception: %(ex)s\"),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BKa8%3D","line":172,"updated":"2014-01-29 15:21:44.000000000","message":"Is there really no better exception that you can catch here?","commit_id":"906920a3c207ea2fff04f27f52bfc5cdb094c18e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"b5aa314266a43fda221c48c06179602bbabb695e","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        try:"},{"line_number":170,"context_line":"            self._session._wait_for_task(instance[\u0027uuid\u0027],"},{"line_number":171,"context_line":"                                         file_delete_task)"},{"line_number":172,"context_line":"        except Exception as e:"},{"line_number":173,"context_line":"            # TODO(garyk): ensure that _wait_for_task raises an exception"},{"line_number":174,"context_line":"            # that can be specifically treated here."},{"line_number":175,"context_line":"            LOG.warning(_(\"Unable to delete %(ds). Exception: %(ex)s\"),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BKW0%3D","line":172,"in_reply_to":"AAAAUH%2F%2BKa8%3D","updated":"2014-01-29 15:31:54.000000000","message":"Dan, discussed some here:\n\nhttps://review.openstack.org/#/c/69622/2/nova/virt/vmwareapi/vmops.py\n\nBasically they plan to make the exceptions more specific with blueprint vmware-api.","commit_id":"906920a3c207ea2fff04f27f52bfc5cdb094c18e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"794a5ae87a2d298878c2568b57507e208825cc38","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        try:"},{"line_number":170,"context_line":"            self._session._wait_for_task(instance[\u0027uuid\u0027],"},{"line_number":171,"context_line":"                                         file_delete_task)"},{"line_number":172,"context_line":"        except Exception as e:"},{"line_number":173,"context_line":"            # TODO(garyk): ensure that _wait_for_task raises an exception"},{"line_number":174,"context_line":"            # that can be specifically treated here."},{"line_number":175,"context_line":"            LOG.warning(_(\"Unable to delete %(ds). Exception: %(ex)s\"),"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAUH%2F%2BKW8%3D","line":172,"in_reply_to":"AAAAUH%2F%2BKa8%3D","updated":"2014-01-29 15:31:39.000000000","message":"Sadly not. e are planning on updating the driver to raise exceptions that can be specifically treated. I just do not think that it is in the scope of this patch and will be working on it soon.","commit_id":"906920a3c207ea2fff04f27f52bfc5cdb094c18e"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"4252e0840ce6172a466fde9fdff2d36a37e52c8b","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            # to delete the file. Currently the only way of detecting that"},{"line_number":175,"context_line":"            # the deletion fails is to catch the general exception."},{"line_number":176,"context_line":"            # TODO(garyk): ensure that _wait_for_task raises an exception"},{"line_number":177,"context_line":"            # that can be specifically treated here."},{"line_number":178,"context_line":"            LOG.warning(_(\"Unable to delete %(ds). Exception: %(ex)s\"),"},{"line_number":179,"context_line":"                        {\u0027ds\u0027: datastore_path, \u0027ex\u0027: e})"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F%2BCBQ%3D","line":177,"updated":"2014-01-30 20:19:16.000000000","message":"Would really like to see this narrowed to less than Exception","commit_id":"474ef783a8ebfc35c55747d6492e3ecf5585a168"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"a8c9680020daab26b676814af77cce2cc77d1f77","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            # to delete the file. Currently the only way of detecting that"},{"line_number":175,"context_line":"            # the deletion fails is to catch the general exception."},{"line_number":176,"context_line":"            # TODO(garyk): ensure that _wait_for_task raises an exception"},{"line_number":177,"context_line":"            # that can be specifically treated here."},{"line_number":178,"context_line":"            LOG.warning(_(\"Unable to delete %(ds). Exception: %(ex)s\"),"},{"line_number":179,"context_line":"                        {\u0027ds\u0027: datastore_path, \u0027ex\u0027: e})"},{"line_number":180,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAUH%2F940U%3D","line":177,"in_reply_to":"AAAAUH%2F%2BCBQ%3D","updated":"2014-02-02 10:15:31.000000000","message":"I have rebased this on a patch that provides the actual exceptions","commit_id":"474ef783a8ebfc35c55747d6492e3ecf5585a168"},{"author":{"_account_id":5652,"name":"David Ripton","email":"dripton@redhat.com","username":"dripton"},"change_message_id":"7aa863a7eec6c6f316f9d74c86a587ecd2944999","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            # There may be more than one process or thread that tries"},{"line_number":176,"context_line":"            # to delete the file."},{"line_number":177,"context_line":"            LOG.warning(_(\"Unable to delete %(ds). Exception: %(ex)s\"),"},{"line_number":178,"context_line":"                        {\u0027ds\u0027: datastore_path, \u0027ex\u0027: e})"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        LOG.debug(_(\"Deleted the datastore file\"), instance\u003dinstance)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F9klU%3D","line":178,"updated":"2014-02-05 23:28:17.000000000","message":"I think the first three should log the warning, but FileNotFound is not a problem.  You wanted it gone and it\u0027s gone.","commit_id":"8ef5e00b676ae1b0e65692e85ab09b2011355d12"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2a39282c2c41251934c5f1e46e843bcbab5607da","unresolved":false,"context_lines":[{"line_number":175,"context_line":"            # There may be more than one process or thread that tries"},{"line_number":176,"context_line":"            # to delete the file."},{"line_number":177,"context_line":"            LOG.warning(_(\"Unable to delete %(ds). Exception: %(ex)s\"),"},{"line_number":178,"context_line":"                        {\u0027ds\u0027: datastore_path, \u0027ex\u0027: e})"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        LOG.debug(_(\"Deleted the datastore file\"), instance\u003dinstance)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUH%2F9ib0%3D","line":178,"in_reply_to":"AAAAUH%2F9klU%3D","updated":"2014-02-06 07:39:09.000000000","message":"Done","commit_id":"8ef5e00b676ae1b0e65692e85ab09b2011355d12"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"2f9152a9c78ad20a9c6397446bd174497e2e8ab3","unresolved":false,"context_lines":[{"line_number":170,"context_line":"                                         file_delete_task)"},{"line_number":171,"context_line":"        except (error_util.get_fault_class(\u0027CannotDeleteFile\u0027),"},{"line_number":172,"context_line":"                error_util.get_fault_class(\u0027FileFault\u0027),"},{"line_number":173,"context_line":"                error_util.get_fault_class(\u0027FileLocked\u0027)) as e:"},{"line_number":174,"context_line":"            # There may be more than one process or thread that tries"},{"line_number":175,"context_line":"            # to delete the file."},{"line_number":176,"context_line":"            LOG.warning(_(\"Unable to delete %(ds). Exception: %(ex)s\"),"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUH%2F9gsA%3D","line":173,"updated":"2014-02-06 12:31:08.000000000","message":"FileLocked should probably retry. This is much better than before, though.","commit_id":"1c12ad5eb8bac799a7888960a090e2f6e2ad83d0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08773f3bac215bbf2a43a3aadc98f9de3c5553f1","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        try:"},{"line_number":169,"context_line":"            self._session._wait_for_task(instance[\u0027uuid\u0027],"},{"line_number":170,"context_line":"                                         file_delete_task)"},{"line_number":171,"context_line":"        except (error_util.get_fault_class(error_util.CANNOT_DELETE_FILE),"},{"line_number":172,"context_line":"                error_util.get_fault_class(error_util.FILE_FAULT),"},{"line_number":173,"context_line":"                error_util.get_fault_class(error_util.FILE_LOCKED)) as e:"},{"line_number":174,"context_line":"            # There may be more than one process or thread that tries"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Fpgo%3D","line":171,"updated":"2014-02-11 19:02:41.000000000","message":"Catch the specific Exception classes, not the mapping calls.","commit_id":"a6a6bf50a4e16a816e297d0136617b5e515c7596"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"08773f3bac215bbf2a43a3aadc98f9de3c5553f1","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            LOG.warning(_(\"Unable to delete %(ds)s. Exception: %(ex)s\"),"},{"line_number":177,"context_line":"                        {\u0027ds\u0027: datastore_path, \u0027ex\u0027: e})"},{"line_number":178,"context_line":"        except error_util.get_fault_class(error_util.FILE_NOT_FOUND):"},{"line_number":179,"context_line":"            LOG.debug(_(\"File not found\"))"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        LOG.debug(_(\"Deleted the datastore file\"), instance\u003dinstance)"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Fpg0%3D","line":179,"updated":"2014-02-11 19:02:41.000000000","message":"Log the path.","commit_id":"a6a6bf50a4e16a816e297d0136617b5e515c7596"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"caa7449b08291166994665d87a5093b3718c7120","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                error_util.FileLockedException) as e:"},{"line_number":174,"context_line":"            # There may be more than one process or thread that tries"},{"line_number":175,"context_line":"            # to delete the file."},{"line_number":176,"context_line":"            LOG.warning(_(\"Unable to delete %(ds)s. Exception: %(ex)s\"),"},{"line_number":177,"context_line":"                        {\u0027ds\u0027: datastore_path, \u0027ex\u0027: e})"},{"line_number":178,"context_line":"        except error_util.FileNotFoundException:"},{"line_number":179,"context_line":"            LOG.debug(_(\"File not found: %s\"), datastore_path)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FIDg%3D","line":176,"updated":"2014-02-16 20:33:56.000000000","message":"If this is going to show up in the logs as a warning, is there something the operator should try or do to resolve this?  Otherwise it seems like it should be info/debug level or somehow less severe.  Seems like it\u0027s a known issue and if the operator should ignore it, then we shouldn\u0027t log it as a warning.","commit_id":"dacc040cdf5646b494a9b01452164b8039d85ba7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"caa7449b08291166994665d87a5093b3718c7120","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            LOG.warning(_(\"Unable to delete %(ds)s. Exception: %(ex)s\"),"},{"line_number":177,"context_line":"                        {\u0027ds\u0027: datastore_path, \u0027ex\u0027: e})"},{"line_number":178,"context_line":"        except error_util.FileNotFoundException:"},{"line_number":179,"context_line":"            LOG.debug(_(\"File not found: %s\"), datastore_path)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        LOG.debug(_(\"Deleted the datastore file\"), instance\u003dinstance)"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAUX%2F%2FIDI%3D","line":179,"updated":"2014-02-16 20:33:56.000000000","message":"Not found because another process already deleted it?  If above conditions are not warnings or get a more detailed explanation of why the operator can safely ignore them, then I\u0027d say you can lump this in with the above checks and explain in the log message that we\u0027re basically ignoring this based on the assumption that another external process already deleted the file and we\u0027re moving on.","commit_id":"dacc040cdf5646b494a9b01452164b8039d85ba7"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0233dcaefefc9825e38606bf44cff2120ae75392","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                error_util.FileNotFoundException) as e:"},{"line_number":175,"context_line":"            # There may be more than one process or thread that tries"},{"line_number":176,"context_line":"            # to delete the file."},{"line_number":177,"context_line":"            LOG.debug(_(\"Unable to delete %(ds)s. Exception: %(ex)s\"),"},{"line_number":178,"context_line":"                      {\u0027ds\u0027: datastore_path, \u0027ex\u0027: e})"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        LOG.debug(_(\"Deleted the datastore file\"), instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2B%2Fww%3D","line":177,"updated":"2014-02-17 18:44:58.000000000","message":"I think you should add something to the log message that basically says what the comment above it is saying, just so anyone that does see this in the logs isn\u0027t wondering if it\u0027s an unhandled error case.","commit_id":"cc6841bf3b14a499b8e719f7ae4d7b053d6c455f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"92104af0a5119067b0f601043c798cccc01897e8","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                error_util.FileNotFoundException) as e:"},{"line_number":175,"context_line":"            # There may be more than one process or thread that tries"},{"line_number":176,"context_line":"            # to delete the file."},{"line_number":177,"context_line":"            LOG.debug(_(\"Unable to delete %(ds)s. Exception: %(ex)s\"),"},{"line_number":178,"context_line":"                      {\u0027ds\u0027: datastore_path, \u0027ex\u0027: e})"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        LOG.debug(_(\"Deleted the datastore file\"), instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":26,"id":"AAAAUX%2F%2B7CM%3D","line":177,"in_reply_to":"AAAAUX%2F%2B%2Fww%3D","updated":"2014-02-18 07:18:05.000000000","message":"Done","commit_id":"cc6841bf3b14a499b8e719f7ae4d7b053d6c455f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"89ea796cd46cdaa0b54819c56991cae80b0b3d08","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                error_util.FileFaultException,"},{"line_number":173,"context_line":"                error_util.FileLockedException,"},{"line_number":174,"context_line":"                error_util.FileNotFoundException) as e:"},{"line_number":175,"context_line":"            # There may be more than one process or thread that tries"},{"line_number":176,"context_line":"            # to delete the file."},{"line_number":177,"context_line":"            LOG.debug(_(\"Unable to delete %(ds)s. There may be more than \""},{"line_number":178,"context_line":"                        \"one process or thread that tries to delete the file. \""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2Byig%3D","line":175,"updated":"2014-02-19 02:21:09.000000000","message":"nit: the comment is probably not necessary anymore since the log message says the same thing now.","commit_id":"716b426eccd6f84a9c4499031ace950916215ac7"},{"author":{"_account_id":5511,"name":"Nikola Dipanov","email":"ndipanov@redhat.com","username":"ndipanov"},"change_message_id":"42e20e02507624a8617d50ec358b049760e07a62","unresolved":false,"context_lines":[{"line_number":172,"context_line":"                error_util.FileFaultException,"},{"line_number":173,"context_line":"                error_util.FileLockedException,"},{"line_number":174,"context_line":"                error_util.FileNotFoundException) as e:"},{"line_number":175,"context_line":"            # There may be more than one process or thread that tries"},{"line_number":176,"context_line":"            # to delete the file."},{"line_number":177,"context_line":"            LOG.debug(_(\"Unable to delete %(ds)s. There may be more than \""},{"line_number":178,"context_line":"                        \"one process or thread that tries to delete the file. \""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2BkI0%3D","line":175,"in_reply_to":"AAAAUX%2F%2Byig%3D","updated":"2014-02-20 14:03:21.000000000","message":"Yes please remove this - it\u0027s cruft! Can be in a separate commit of course!","commit_id":"716b426eccd6f84a9c4499031ace950916215ac7"}]}
