)]}'
{"nova/tests/virt/libvirt/test_libvirt.py":[{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"32b01a18e27ee8ad1aad4acbdcc63b882dc2c70c","unresolved":false,"context_lines":[{"line_number":6274,"context_line":"            return True"},{"line_number":6275,"context_line":""},{"line_number":6276,"context_line":"        def fake_execute(cmd, *args, **kwargs):"},{"line_number":6277,"context_line":"            if cmd \u003d\u003d \u0027touch\u0027:"},{"line_number":6278,"context_line":"                if not self.disk_writable:"},{"line_number":6279,"context_line":"                    self.disk_writable \u003d True"},{"line_number":6280,"context_line":"                    raise processutils.ProcessExecutionError()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FXg8%3D","line":6277,"updated":"2013-09-05 16:08:52.000000000","message":"doenst this need updating?","commit_id":"319fa9a673b79571baf996541639b1877f16fa62"},{"author":{"_account_id":7808,"name":"Xavier Queralt","email":"xqueralt@gmail.com","username":"xqueralt"},"change_message_id":"0099370f5b4dbaf6478bec63c09942382c697832","unresolved":false,"context_lines":[{"line_number":6274,"context_line":"            return True"},{"line_number":6275,"context_line":""},{"line_number":6276,"context_line":"        def fake_execute(cmd, *args, **kwargs):"},{"line_number":6277,"context_line":"            if cmd \u003d\u003d \u0027touch\u0027:"},{"line_number":6278,"context_line":"                if not self.disk_writable:"},{"line_number":6279,"context_line":"                    self.disk_writable \u003d True"},{"line_number":6280,"context_line":"                    raise processutils.ProcessExecutionError()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FXfI%3D","line":6277,"in_reply_to":"AAAASn%2F%2FXg8%3D","updated":"2013-09-05 16:31:21.000000000","message":"Done in the next patch set","commit_id":"319fa9a673b79571baf996541639b1877f16fa62"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"42230ae2b486541ef5a13b3b933bf9f084285249","unresolved":false,"context_lines":[{"line_number":6520,"context_line":"                return {\u0027state\u0027: power_state.SHUTDOWN}"},{"line_number":6521,"context_line":""},{"line_number":6522,"context_line":"        self.flags(use_cow_images\u003dTrue)"},{"line_number":6523,"context_line":"        self.stubs.Set(os, \u0027utime\u0027, fake_utime)"},{"line_number":6524,"context_line":"        self.stubs.Set(libvirt_driver.disk, \u0027extend\u0027, fake_extend)"},{"line_number":6525,"context_line":"        self.stubs.Set(libvirt_driver.disk, \u0027can_resize_image\u0027,"},{"line_number":6526,"context_line":"                       fake_can_resize_image)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2FFvQ%3D","line":6523,"updated":"2013-10-04 15:50:12.000000000","message":"can you also stub out sleep, I am guessing this will make the unit test take too long otherwise?","commit_id":"84e033e2b442106c931b84a927a34a2c6b6d3600"},{"author":{"_account_id":7808,"name":"Xavier Queralt","email":"xqueralt@gmail.com","username":"xqueralt"},"change_message_id":"9c9f50ab9e4f833cf672d010012a1f2a99d06e17","unresolved":false,"context_lines":[{"line_number":6520,"context_line":"                return {\u0027state\u0027: power_state.SHUTDOWN}"},{"line_number":6521,"context_line":""},{"line_number":6522,"context_line":"        self.flags(use_cow_images\u003dTrue)"},{"line_number":6523,"context_line":"        self.stubs.Set(os, \u0027utime\u0027, fake_utime)"},{"line_number":6524,"context_line":"        self.stubs.Set(libvirt_driver.disk, \u0027extend\u0027, fake_extend)"},{"line_number":6525,"context_line":"        self.stubs.Set(libvirt_driver.disk, \u0027can_resize_image\u0027,"},{"line_number":6526,"context_line":"                       fake_can_resize_image)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2F6PU%3D","line":6523,"in_reply_to":"AAAAS3%2F%2FFvQ%3D","updated":"2013-10-08 07:42:46.000000000","message":"Done","commit_id":"84e033e2b442106c931b84a927a34a2c6b6d3600"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"c89995571c117cce929c950460500feedc560688","unresolved":false,"context_lines":[{"line_number":3887,"context_line":""},{"line_number":3888,"context_line":"    def _wait_for_file_available(self, path):"},{"line_number":3889,"context_line":"        try:"},{"line_number":3890,"context_line":"            utils.execute(\u0027touch\u0027, path)"},{"line_number":3891,"context_line":"            raise loopingcall.LoopingCallDone()"},{"line_number":3892,"context_line":"        except processutils.ProcessExecutionError:"},{"line_number":3893,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAASn%2F%2Fugo%3D","line":3890,"updated":"2013-08-30 11:33:25.000000000","message":"why is the sub process needed here? Also if os.path.exists() doesn\u0027t suffice, did you mean to use the --no-create option to touch?","commit_id":"b2323d232d88e1103ff8b8b2e0bbde3823ba0985"},{"author":{"_account_id":7808,"name":"Xavier Queralt","email":"xqueralt@gmail.com","username":"xqueralt"},"change_message_id":"a297e1abb5e84d1df2fdf693b10b5133bafd47d5","unresolved":false,"context_lines":[{"line_number":3887,"context_line":""},{"line_number":3888,"context_line":"    def _wait_for_file_available(self, path):"},{"line_number":3889,"context_line":"        try:"},{"line_number":3890,"context_line":"            utils.execute(\u0027touch\u0027, path)"},{"line_number":3891,"context_line":"            raise loopingcall.LoopingCallDone()"},{"line_number":3892,"context_line":"        except processutils.ProcessExecutionError:"},{"line_number":3893,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAASn%2F%2FXkQ%3D","line":3890,"in_reply_to":"AAAASn%2F%2FadM%3D","updated":"2013-09-05 15:58:16.000000000","message":"My fault for not giving more details.\n\nPython is not who caches the file/directory attributes but the shared filesystem mounted in the destination node. To update them we can either wait a few seconds (it is updated in an interval between 5-60 seconds) or force it ourselves by updating the some of those attributes on the client side (e.g. the modification time). When this happens, the NFS client has to go back to the server and refresh the real attributes for the involved directory or file.\n\nIn the new patch I\u0027ve changed the touch call for an os.utime which does exactly the same without the need to call an external command.","commit_id":"b2323d232d88e1103ff8b8b2e0bbde3823ba0985"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"485f97f34833f343e6431eb85cc56caafc35eb69","unresolved":false,"context_lines":[{"line_number":3887,"context_line":""},{"line_number":3888,"context_line":"    def _wait_for_file_available(self, path):"},{"line_number":3889,"context_line":"        try:"},{"line_number":3890,"context_line":"            utils.execute(\u0027touch\u0027, path)"},{"line_number":3891,"context_line":"            raise loopingcall.LoopingCallDone()"},{"line_number":3892,"context_line":"        except processutils.ProcessExecutionError:"},{"line_number":3893,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAASn%2F%2FadM%3D","line":3890,"in_reply_to":"AAAASn%2F%2FctE%3D","updated":"2013-09-05 00:31:03.000000000","message":"Sorry for being daft, but where would the os module cache stuff that touch(1) would not?","commit_id":"b2323d232d88e1103ff8b8b2e0bbde3823ba0985"},{"author":{"_account_id":7808,"name":"Xavier Queralt","email":"xqueralt@gmail.com","username":"xqueralt"},"change_message_id":"eb3d8691de9f5cf4f556a2dfb21c96531bf4d67b","unresolved":false,"context_lines":[{"line_number":3887,"context_line":""},{"line_number":3888,"context_line":"    def _wait_for_file_available(self, path):"},{"line_number":3889,"context_line":"        try:"},{"line_number":3890,"context_line":"            utils.execute(\u0027touch\u0027, path)"},{"line_number":3891,"context_line":"            raise loopingcall.LoopingCallDone()"},{"line_number":3892,"context_line":"        except processutils.ProcessExecutionError:"},{"line_number":3893,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAASn%2F%2FctE%3D","line":3890,"in_reply_to":"AAAASn%2F%2Fugo%3D","updated":"2013-09-04 17:28:37.000000000","message":"Any of the operations in os module (exists, access, stat, ...) won\u0027t work here because they will get the cached attributes. I\u0027ve updated this in the next patch with the --no-create option.","commit_id":"b2323d232d88e1103ff8b8b2e0bbde3823ba0985"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"c89995571c117cce929c950460500feedc560688","unresolved":false,"context_lines":[{"line_number":3905,"context_line":"            # the client can\u0027t see the new files created in the server."},{"line_number":3906,"context_line":"            timer \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":3907,"context_line":"                self._wait_for_file_available, info[\u0027path\u0027])"},{"line_number":3908,"context_line":"            timer.start(interval\u003d2.0).wait()"},{"line_number":3909,"context_line":""},{"line_number":3910,"context_line":"            fname \u003d os.path.basename(info[\u0027path\u0027])"},{"line_number":3911,"context_line":"            if fname \u003d\u003d \u0027disk\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAASn%2F%2Fugk%3D","line":3908,"updated":"2013-08-30 11:33:25.000000000","message":"We need some max bound to abort and raise with","commit_id":"b2323d232d88e1103ff8b8b2e0bbde3823ba0985"},{"author":{"_account_id":7808,"name":"Xavier Queralt","email":"xqueralt@gmail.com","username":"xqueralt"},"change_message_id":"eb3d8691de9f5cf4f556a2dfb21c96531bf4d67b","unresolved":false,"context_lines":[{"line_number":3905,"context_line":"            # the client can\u0027t see the new files created in the server."},{"line_number":3906,"context_line":"            timer \u003d loopingcall.FixedIntervalLoopingCall("},{"line_number":3907,"context_line":"                self._wait_for_file_available, info[\u0027path\u0027])"},{"line_number":3908,"context_line":"            timer.start(interval\u003d2.0).wait()"},{"line_number":3909,"context_line":""},{"line_number":3910,"context_line":"            fname \u003d os.path.basename(info[\u0027path\u0027])"},{"line_number":3911,"context_line":"            if fname \u003d\u003d \u0027disk\u0027:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAASn%2F%2Fcs4%3D","line":3908,"in_reply_to":"AAAASn%2F%2Fugk%3D","updated":"2013-09-04 17:28:37.000000000","message":"Added in the next patch, 90 seconds should be enough.","commit_id":"b2323d232d88e1103ff8b8b2e0bbde3823ba0985"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"32b01a18e27ee8ad1aad4acbdcc63b882dc2c70c","unresolved":false,"context_lines":[{"line_number":4410,"context_line":"    def _wait_for_disk_writable(self, path, interval\u003d2, timeout\u003d90):"},{"line_number":4411,"context_line":"        while timeout \u003e 0:"},{"line_number":4412,"context_line":"            try:"},{"line_number":4413,"context_line":"                os.utime(path, None)"},{"line_number":4414,"context_line":"            except OSError:"},{"line_number":4415,"context_line":"                LOG.debug(_(\"Waiting for %s to be available.\"), path)"},{"line_number":4416,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FXhQ%3D","line":4413,"updated":"2013-09-05 16:08:52.000000000","message":"OK so by doing an update of the timestamp, this should invalidate the cache, rather than just passively waiting for an os.path.exists() ?","commit_id":"319fa9a673b79571baf996541639b1877f16fa62"},{"author":{"_account_id":7808,"name":"Xavier Queralt","email":"xqueralt@gmail.com","username":"xqueralt"},"change_message_id":"0099370f5b4dbaf6478bec63c09942382c697832","unresolved":false,"context_lines":[{"line_number":4410,"context_line":"    def _wait_for_disk_writable(self, path, interval\u003d2, timeout\u003d90):"},{"line_number":4411,"context_line":"        while timeout \u003e 0:"},{"line_number":4412,"context_line":"            try:"},{"line_number":4413,"context_line":"                os.utime(path, None)"},{"line_number":4414,"context_line":"            except OSError:"},{"line_number":4415,"context_line":"                LOG.debug(_(\"Waiting for %s to be available.\"), path)"},{"line_number":4416,"context_line":"            else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FXZU%3D","line":4413,"in_reply_to":"AAAASn%2F%2FXhQ%3D","updated":"2013-09-05 16:31:21.000000000","message":"Right, but it gets even worse when on the source node we rename one directory from \"uuid\" to \"uuid_resized\" and create a new one called \"uuid\" for the resized instance. Even thought os.exists will tell us that the directory \"uuid\" is there, what it is really seeing is the old one, before we moved it, until the cache is updated. That\u0027s why we\u0027ve to invalidate it instead of waiting.","commit_id":"319fa9a673b79571baf996541639b1877f16fa62"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"32b01a18e27ee8ad1aad4acbdcc63b882dc2c70c","unresolved":false,"context_lines":[{"line_number":4411,"context_line":"        while timeout \u003e 0:"},{"line_number":4412,"context_line":"            try:"},{"line_number":4413,"context_line":"                os.utime(path, None)"},{"line_number":4414,"context_line":"            except OSError:"},{"line_number":4415,"context_line":"                LOG.debug(_(\"Waiting for %s to be available.\"), path)"},{"line_number":4416,"context_line":"            else:"},{"line_number":4417,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FXhI%3D","line":4414,"updated":"2013-09-05 16:08:52.000000000","message":"except EnvironmentError: is safer I think","commit_id":"319fa9a673b79571baf996541639b1877f16fa62"},{"author":{"_account_id":7808,"name":"Xavier Queralt","email":"xqueralt@gmail.com","username":"xqueralt"},"change_message_id":"0099370f5b4dbaf6478bec63c09942382c697832","unresolved":false,"context_lines":[{"line_number":4411,"context_line":"        while timeout \u003e 0:"},{"line_number":4412,"context_line":"            try:"},{"line_number":4413,"context_line":"                os.utime(path, None)"},{"line_number":4414,"context_line":"            except OSError:"},{"line_number":4415,"context_line":"                LOG.debug(_(\"Waiting for %s to be available.\"), path)"},{"line_number":4416,"context_line":"            else:"},{"line_number":4417,"context_line":"                break"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2FXZQ%3D","line":4414,"in_reply_to":"AAAASn%2F%2FXhI%3D","updated":"2013-09-05 16:31:21.000000000","message":"I didn\u0027t know about this one, it looks safer indeed.","commit_id":"319fa9a673b79571baf996541639b1877f16fa62"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"da845bfebc7dc8d66aec9c219d8dd10c41832e89","unresolved":false,"context_lines":[{"line_number":4402,"context_line":"            LOG.info(_(\"Instance running successfully.\"), instance\u003dinstance)"},{"line_number":4403,"context_line":"            raise loopingcall.LoopingCallDone()"},{"line_number":4404,"context_line":""},{"line_number":4405,"context_line":"    def _wait_for_shared_path(self, path, interval\u003d2, timeout\u003d90):"},{"line_number":4406,"context_line":"        while timeout \u003e 0:"},{"line_number":4407,"context_line":"            try:"},{"line_number":4408,"context_line":"                os.utime(path, None)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2Fs58%3D","line":4405,"updated":"2013-09-20 23:47:09.000000000","message":"I think I\u0027d like to see this timeout configurable with a flag.","commit_id":"3f0faea21760018deddd8b441e8bfedd7eb1c3ba"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"5f9c779f3c7a3eb0b875bc132366ef56e12f5385","unresolved":false,"context_lines":[{"line_number":4402,"context_line":"            LOG.info(_(\"Instance running successfully.\"), instance\u003dinstance)"},{"line_number":4403,"context_line":"            raise loopingcall.LoopingCallDone()"},{"line_number":4404,"context_line":""},{"line_number":4405,"context_line":"    def _wait_for_shared_path(self, path, interval\u003d2, timeout\u003d90):"},{"line_number":4406,"context_line":"        while timeout \u003e 0:"},{"line_number":4407,"context_line":"            try:"},{"line_number":4408,"context_line":"                os.utime(path, None)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FU8Y%3D","line":4405,"updated":"2013-09-06 09:34:52.000000000","message":"Why not used\nopenstack.common.loopingcall.FixedIntervalLoopingCall\nfor wait?","commit_id":"3f0faea21760018deddd8b441e8bfedd7eb1c3ba"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"f2bcad04c9366a607ab93016de0d573c2de80232","unresolved":false,"context_lines":[{"line_number":4402,"context_line":"            LOG.info(_(\"Instance running successfully.\"), instance\u003dinstance)"},{"line_number":4403,"context_line":"            raise loopingcall.LoopingCallDone()"},{"line_number":4404,"context_line":""},{"line_number":4405,"context_line":"    def _wait_for_shared_path(self, path, interval\u003d2, timeout\u003d90):"},{"line_number":4406,"context_line":"        while timeout \u003e 0:"},{"line_number":4407,"context_line":"            try:"},{"line_number":4408,"context_line":"                os.utime(path, None)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAS3%2F%2FrnA%3D","line":4405,"in_reply_to":"AAAAS3%2F%2Fs58%3D","updated":"2013-09-22 07:41:19.000000000","message":"for those case not NFS backend or no share storage case, it doesn\u0027t make sense to be forced to waiting 90 seconds IMHO.","commit_id":"3f0faea21760018deddd8b441e8bfedd7eb1c3ba"},{"author":{"_account_id":7808,"name":"Xavier Queralt","email":"xqueralt@gmail.com","username":"xqueralt"},"change_message_id":"5cdc5c862e71f1ab1745d3df54c68f6acc0e488c","unresolved":false,"context_lines":[{"line_number":4402,"context_line":"            LOG.info(_(\"Instance running successfully.\"), instance\u003dinstance)"},{"line_number":4403,"context_line":"            raise loopingcall.LoopingCallDone()"},{"line_number":4404,"context_line":""},{"line_number":4405,"context_line":"    def _wait_for_shared_path(self, path, interval\u003d2, timeout\u003d90):"},{"line_number":4406,"context_line":"        while timeout \u003e 0:"},{"line_number":4407,"context_line":"            try:"},{"line_number":4408,"context_line":"                os.utime(path, None)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FU5E%3D","line":4405,"in_reply_to":"AAAASn%2F%2FU8Y%3D","updated":"2013-09-06 09:48:51.000000000","message":"Because you can\u0027t set an upper limit with it and I don\u0027t want to complicate this by scheduling a green thread in the future a  for handling the timeout.","commit_id":"3f0faea21760018deddd8b441e8bfedd7eb1c3ba"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"42230ae2b486541ef5a13b3b933bf9f084285249","unresolved":false,"context_lines":[{"line_number":4495,"context_line":"            except EnvironmentError:"},{"line_number":4496,"context_line":"                LOG.debug(_(\"Waiting for %s to be available.\"), path)"},{"line_number":4497,"context_line":"            else:"},{"line_number":4498,"context_line":"                break"},{"line_number":4499,"context_line":""},{"line_number":4500,"context_line":"            time.sleep(interval)"},{"line_number":4501,"context_line":"            timeout \u003d timeout - interval"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAS3%2F%2FFv8%3D","line":4498,"updated":"2013-10-04 15:50:12.000000000","message":"I find return easier to read, but this is cool too","commit_id":"84e033e2b442106c931b84a927a34a2c6b6d3600"},{"author":{"_account_id":7808,"name":"Xavier Queralt","email":"xqueralt@gmail.com","username":"xqueralt"},"change_message_id":"9c9f50ab9e4f833cf672d010012a1f2a99d06e17","unresolved":false,"context_lines":[{"line_number":4495,"context_line":"            except EnvironmentError:"},{"line_number":4496,"context_line":"                LOG.debug(_(\"Waiting for %s to be available.\"), path)"},{"line_number":4497,"context_line":"            else:"},{"line_number":4498,"context_line":"                break"},{"line_number":4499,"context_line":""},{"line_number":4500,"context_line":"            time.sleep(interval)"},{"line_number":4501,"context_line":"            timeout \u003d timeout - interval"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2F6MA%3D","line":4498,"in_reply_to":"AAAAS3%2F%2FFv8%3D","updated":"2013-10-08 07:42:46.000000000","message":"I\u0027ve added a return statement just after the os.utime, you\u0027re right on that it is more readable, thanks.","commit_id":"84e033e2b442106c931b84a927a34a2c6b6d3600"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"e3aea4f70c02f4a2ef46aef6f5280308fc7668b0","unresolved":false,"context_lines":[{"line_number":4507,"context_line":"            try:"},{"line_number":4508,"context_line":"                os.utime(path, None)"},{"line_number":4509,"context_line":"                return"},{"line_number":4510,"context_line":"            except EnvironmentError:"},{"line_number":4511,"context_line":"                LOG.debug(_(\"Waiting for %s to be available.\"), path)"},{"line_number":4512,"context_line":"                time.sleep(interval)"},{"line_number":4513,"context_line":"                timeout \u003d timeout - interval"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2F6B0%3D","line":4510,"updated":"2013-10-08 08:16:45.000000000","message":"Since you changed from os.system() to a direct call, you\u0027ve more flexibility in error reporting and handling of permissions issues\n\n    except EnvironmentError as e:\n        if e.errno \u003d errno.ENOENT:\n            LOG.debug(....)\n            time.sleep()\n        else:\n            LOG.error(\".... %d\", e.errno)\n            break","commit_id":"534c772e02399eb88e14ddd60ef2dc83aea07292"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"837e4dac2575ecdec093f4a7c440496a4c09f11f","unresolved":false,"context_lines":[{"line_number":4510,"context_line":"            except EnvironmentError as e:"},{"line_number":4511,"context_line":"                LOG.debug(_(\"Error while checking %(path)s availability: \""},{"line_number":4512,"context_line":"                            \"%(error)s\"), {\"path\": path, \"error\": e})"},{"line_number":4513,"context_line":"                if e.errno not in (errno.ENOENT, errno.EACCES):"},{"line_number":4514,"context_line":"                    raise"},{"line_number":4515,"context_line":""},{"line_number":4516,"context_line":"                time.sleep(interval)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATH%2F%2FqhQ%3D","line":4513,"updated":"2013-10-11 14:51:26.000000000","message":"So we want to wait if there is an EACCES permissions error?","commit_id":"d96e824f6930088073a4a1462b08f0a220595f93"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"996dfbdb16048c3e75da26c71d85e08538959b3e","unresolved":false,"context_lines":[{"line_number":4514,"context_line":"                    raise"},{"line_number":4515,"context_line":""},{"line_number":4516,"context_line":"                time.sleep(interval)"},{"line_number":4517,"context_line":"                timeout \u003d timeout - interval"},{"line_number":4518,"context_line":""},{"line_number":4519,"context_line":"        raise exception.DiskNotFound(location\u003dpath)"},{"line_number":4520,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATX%2F%2F9gI%3D","line":4517,"updated":"2013-10-23 16:20:38.000000000","message":"I don\u0027t really like this idea of doing a looping wait on NFS. Even though this makes it \"reliable\" it is pretty awful user experience to have a 60 second delay doing nothing, given all the effort we put in to make migration fast in the first place.\n\nCan\u0027t we try todo something to avoid triggering this pathalogical NFS behaviour in the first place. ie don\u0027t create + rename directories, use the correct name right away","commit_id":"d96e824f6930088073a4a1462b08f0a220595f93"}]}
