)]}'
{"nova/exception.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"98afbf5e2f63f0962a468ef2c18ac668e671d04a","unresolved":false,"context_lines":[{"line_number":2207,"context_line":"    msg_fmt \u003d _(\"Cannot migrate to the host where the server exists.\")"},{"line_number":2208,"context_line":""},{"line_number":2209,"context_line":""},{"line_number":2210,"context_line":"class StaleVolumeMount(InvalidVolume):"},{"line_number":2211,"context_line":"    msg_fmt \u003d _(\"The volume mount at %(mount_path)s is unusable.\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_eb4b7484","line":2211,"range":{"start_line":2210,"start_character":0,"end_line":2211,"end_character":66},"updated":"2017-12-04 14:30:21.000000000","message":"nit: Can you group this with the InvalidVolume exception and subclasses","commit_id":"c23d23eaa7aa493273d137554a8f9112c2affee4"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"5ed627b033b5f043938904aef771c0935fbc4669","unresolved":false,"context_lines":[{"line_number":2207,"context_line":"    msg_fmt \u003d _(\"Cannot migrate to the host where the server exists.\")"},{"line_number":2208,"context_line":""},{"line_number":2209,"context_line":""},{"line_number":2210,"context_line":"class StaleVolumeMount(InvalidVolume):"},{"line_number":2211,"context_line":"    msg_fmt \u003d _(\"The volume mount at %(mount_path)s is unusable.\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"df87a7cf_3419bc84","line":2211,"range":{"start_line":2210,"start_character":0,"end_line":2211,"end_character":66},"in_reply_to":"df87a7cf_eb4b7484","updated":"2017-12-04 16:31:37.000000000","message":"Done","commit_id":"c23d23eaa7aa493273d137554a8f9112c2affee4"}],"nova/tests/unit/virt/libvirt/volume/test_quobyte.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e346cb03be25840b3858e13e91cdc9f390afca63","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        def statMockCall(*args):"},{"line_number":211,"context_line":"            if args[0] \u003d\u003d self.TEST_MNT_POINT:"},{"line_number":212,"context_line":"                stat_result \u003d mock.Mock()"},{"line_number":213,"context_line":"                stat_result.st_size \u003d 0"},{"line_number":214,"context_line":"                return stat_result"},{"line_number":215,"context_line":"            return os.stat(args)"},{"line_number":216,"context_line":"        stat_mock.side_effect \u003d statMockCall"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"5fc1f717_7d004735","line":214,"range":{"start_line":212,"start_character":16,"end_line":214,"end_character":34},"updated":"2019-04-05 14:28:41.000000000","message":"nit: this would also work:\n\n return mock.Mock(st_size\u003d0)","commit_id":"05a73c0f3a9f8edf9024f9870279bc6fb7bba2e7"}],"nova/virt/libvirt/volume/quobyte.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6fcfb55ac85783707b3880617bea4745f21fb6ca","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    raise nova_exception.InvalidVolume(msg)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class QbStaleMountException(nova_exception.InvalidVolume):"},{"line_number":105,"context_line":"    msg_fmt \u003d _(\"Invalid volume: %(reason)s\")"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class LibvirtQuobyteVolumeDriver(fs.LibvirtBaseFileSystemVolumeDriver):"}],"source_content_type":"text/x-python","patch_set":2,"id":"df87a7cf_c9a3204f","line":105,"range":{"start_line":104,"start_character":0,"end_line":105,"end_character":45},"updated":"2017-12-04 10:23:27.000000000","message":"I\u0027m pretty sure these have to be kept in \u0027nova.exception\u0027. Why are we even introducing this though? I\u0027m guessing it\u0027s just to make your tests easier, but you could also check the exception message?","commit_id":"7a1899a2271a5e3c27a87b39c07ac81dc29a233a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"6fcfb55ac85783707b3880617bea4745f21fb6ca","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class QbStaleMountException(nova_exception.InvalidVolume):"},{"line_number":105,"context_line":"    msg_fmt \u003d _(\"Invalid volume: %(reason)s\")"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class LibvirtQuobyteVolumeDriver(fs.LibvirtBaseFileSystemVolumeDriver):"}],"source_content_type":"text/x-python","patch_set":2,"id":"df87a7cf_e9bdc468","line":105,"range":{"start_line":105,"start_character":4,"end_line":105,"end_character":45},"updated":"2017-12-04 10:23:27.000000000","message":"There\u0027s no need to redefine this - you can use the one in the super class","commit_id":"7a1899a2271a5e3c27a87b39c07ac81dc29a233a"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"18c01995dff8cc4091c2c2eff6133f00e17fc996","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    raise nova_exception.InvalidVolume(msg)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class QbStaleMountException(nova_exception.InvalidVolume):"},{"line_number":105,"context_line":"    msg_fmt \u003d _(\"Invalid volume: %(reason)s\")"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class LibvirtQuobyteVolumeDriver(fs.LibvirtBaseFileSystemVolumeDriver):"}],"source_content_type":"text/x-python","patch_set":2,"id":"df87a7cf_1f913a9a","line":105,"range":{"start_line":104,"start_character":0,"end_line":105,"end_character":45},"in_reply_to":"df87a7cf_c9a3204f","updated":"2017-12-04 11:26:52.000000000","message":"I thought about adding it in nova.exception but chose not to as that class seems not to contain driver specific exceptions so far. I\u0027m happy to add it there and possibly add it as a more general exception if that is acceptable.\nI added this not for the tests but to be able to raise an specific exception for the stale mount detection, in order to differentiate that in connect_volume().","commit_id":"7a1899a2271a5e3c27a87b39c07ac81dc29a233a"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"18c01995dff8cc4091c2c2eff6133f00e17fc996","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"class QbStaleMountException(nova_exception.InvalidVolume):"},{"line_number":105,"context_line":"    msg_fmt \u003d _(\"Invalid volume: %(reason)s\")"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"class LibvirtQuobyteVolumeDriver(fs.LibvirtBaseFileSystemVolumeDriver):"}],"source_content_type":"text/x-python","patch_set":2,"id":"df87a7cf_7fd96681","line":105,"range":{"start_line":105,"start_character":4,"end_line":105,"end_character":45},"in_reply_to":"df87a7cf_e9bdc468","updated":"2017-12-04 11:26:52.000000000","message":"ok","commit_id":"7a1899a2271a5e3c27a87b39c07ac81dc29a233a"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"71bd52ba4e5f838c8d80456f2615b2008c943459","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def validate_volume(mount_path):"},{"line_number":76,"context_line":"    \"\"\"Runs a number of tests to be sure this is a (working) Quobyte mount\"\"\""},{"line_number":77,"context_line":"    partitions \u003d psutil.disk_partitions(all\u003dTrue)"},{"line_number":78,"context_line":"    for p in partitions:"},{"line_number":79,"context_line":"        if mount_path !\u003d p.mountpoint:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_6d1bacc9","line":76,"range":{"start_line":76,"start_character":0,"end_line":76,"end_character":77},"updated":"2019-02-12 14:46:38.000000000","message":"We\u0027re now using this function to not only ensure a volume was succesfully mounted but also to check if it was mounted beforehand. That makes sense but I do think this docstring could do with a slight rework to suggest it\u0027s purpose. How about:\n\n  Determine if the volume is a valid Quobyte mount.\n\n  Runs a number...","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e248c9902606c85a2a25f5e6cefa28598f1dd00e","unresolved":false,"context_lines":[{"line_number":73,"context_line":""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"def validate_volume(mount_path):"},{"line_number":76,"context_line":"    \"\"\"Runs a number of tests to be sure this is a (working) Quobyte mount\"\"\""},{"line_number":77,"context_line":"    partitions \u003d psutil.disk_partitions(all\u003dTrue)"},{"line_number":78,"context_line":"    for p in partitions:"},{"line_number":79,"context_line":"        if mount_path !\u003d p.mountpoint:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_41e302d9","line":76,"range":{"start_line":76,"start_character":0,"end_line":76,"end_character":77},"in_reply_to":"9fdfeff1_6d1bacc9","updated":"2019-02-13 10:10:44.000000000","message":"Done","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"71bd52ba4e5f838c8d80456f2615b2008c943459","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    for p in partitions:"},{"line_number":79,"context_line":"        if mount_path !\u003d p.mountpoint:"},{"line_number":80,"context_line":"            continue"},{"line_number":81,"context_line":"        if (p.device.startswith(\"quobyte@\") or"},{"line_number":82,"context_line":"                (p.fstype \u003d\u003d \"fuse.quobyte\")):"},{"line_number":83,"context_line":"            statresult \u003d os.stat(mount_path)"},{"line_number":84,"context_line":"            # Note(kaisers): Quobyte always shows mount points with size 0"},{"line_number":85,"context_line":"            if statresult.st_size \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_2d0cc4a3","line":82,"range":{"start_line":81,"start_character":0,"end_line":82,"end_character":46},"updated":"2019-02-12 14:46:38.000000000","message":"nit: This should be able to fit on one line","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e248c9902606c85a2a25f5e6cefa28598f1dd00e","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    for p in partitions:"},{"line_number":79,"context_line":"        if mount_path !\u003d p.mountpoint:"},{"line_number":80,"context_line":"            continue"},{"line_number":81,"context_line":"        if (p.device.startswith(\"quobyte@\") or"},{"line_number":82,"context_line":"                (p.fstype \u003d\u003d \"fuse.quobyte\")):"},{"line_number":83,"context_line":"            statresult \u003d os.stat(mount_path)"},{"line_number":84,"context_line":"            # Note(kaisers): Quobyte always shows mount points with size 0"},{"line_number":85,"context_line":"            if statresult.st_size \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_6101666a","line":82,"range":{"start_line":81,"start_character":0,"end_line":82,"end_character":46},"in_reply_to":"9fdfeff1_2d0cc4a3","updated":"2019-02-13 10:10:44.000000000","message":"Done","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"71bd52ba4e5f838c8d80456f2615b2008c943459","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            # Note(kaisers): Quobyte always shows mount points with size 0"},{"line_number":85,"context_line":"            if statresult.st_size \u003d\u003d 0:"},{"line_number":86,"context_line":"                # client looks healthy"},{"line_number":87,"context_line":"                return True  # we\u0027re happy here"},{"line_number":88,"context_line":"            else:"},{"line_number":89,"context_line":"                msg \u003d (_(\"The mount %(mount_path)s is not a \""},{"line_number":90,"context_line":"                         \"valid Quobyte volume. Stale mount?\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_adf7548b","line":87,"range":{"start_line":87,"start_character":23,"end_line":87,"end_character":27},"updated":"2019-02-12 14:46:38.000000000","message":"This looks unnecessary. Every other code path raises an exception except this one, right?","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"74f0c13ba35c77cd2fe58847286e98abb34cf098","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            # Note(kaisers): Quobyte always shows mount points with size 0"},{"line_number":85,"context_line":"            if statresult.st_size \u003d\u003d 0:"},{"line_number":86,"context_line":"                # client looks healthy"},{"line_number":87,"context_line":"                return True  # we\u0027re happy here"},{"line_number":88,"context_line":"            else:"},{"line_number":89,"context_line":"                msg \u003d (_(\"The mount %(mount_path)s is not a \""},{"line_number":90,"context_line":"                         \"valid Quobyte volume. Stale mount?\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_8ad25f5b","line":87,"range":{"start_line":87,"start_character":23,"end_line":87,"end_character":27},"in_reply_to":"9fdfeff1_81c7aa12","updated":"2019-02-13 11:00:49.000000000","message":"Hmm, I\u0027m not sure if that\u0027s the right thing to do. Surely you need a try-catch in the function? More notes on line 152","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"f3fe423476c4da592c5cddb9512cbbafa797ea91","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            # Note(kaisers): Quobyte always shows mount points with size 0"},{"line_number":85,"context_line":"            if statresult.st_size \u003d\u003d 0:"},{"line_number":86,"context_line":"                # client looks healthy"},{"line_number":87,"context_line":"                return True  # we\u0027re happy here"},{"line_number":88,"context_line":"            else:"},{"line_number":89,"context_line":"                msg \u003d (_(\"The mount %(mount_path)s is not a \""},{"line_number":90,"context_line":"                         \"valid Quobyte volume. Stale mount?\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_ba24350e","line":87,"range":{"start_line":87,"start_character":23,"end_line":87,"end_character":27},"in_reply_to":"9fdfeff1_8ad25f5b","updated":"2019-02-14 11:49:51.000000000","message":"Done","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e248c9902606c85a2a25f5e6cefa28598f1dd00e","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            # Note(kaisers): Quobyte always shows mount points with size 0"},{"line_number":85,"context_line":"            if statresult.st_size \u003d\u003d 0:"},{"line_number":86,"context_line":"                # client looks healthy"},{"line_number":87,"context_line":"                return True  # we\u0027re happy here"},{"line_number":88,"context_line":"            else:"},{"line_number":89,"context_line":"                msg \u003d (_(\"The mount %(mount_path)s is not a \""},{"line_number":90,"context_line":"                         \"valid Quobyte volume. Stale mount?\")"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_81c7aa12","line":87,"range":{"start_line":87,"start_character":23,"end_line":87,"end_character":27},"in_reply_to":"9fdfeff1_adf7548b","updated":"2019-02-13 10:10:44.000000000","message":"True. I added this when i added using validate_volume() in (dis-)connect_volume() (line 152 below). While (dis-)connect_volume() could use a try/except construct to handle the call i think this version is clearer and more easy to read.\nHaving said this, if you still consider this superfluous i can change to no return val here and try/except in (dis-)connect_volume() if required.","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"71bd52ba4e5f838c8d80456f2615b2008c943459","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            mounted \u003d False"},{"line_number":134,"context_line":"            LOG.info(\u0027Fixing previous mount %s which was not\u0027"},{"line_number":135,"context_line":"                     \u0027 unmounted correctly.\u0027, mount_path)"},{"line_number":136,"context_line":"            umount_volume(mount_path)"},{"line_number":137,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":138,"context_line":"            mounted \u003d False"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_6d496cb5","line":136,"range":{"start_line":136,"start_character":0,"end_line":136,"end_character":37},"updated":"2019-02-12 14:46:38.000000000","message":"What happens if this fails? I note we don\u0027t have a try-except around this in the \u0027disconnect_volume\u0027 class but that\u0027s presumably handled higher up the stack. What about this? Does it bubble up (HTTP 5xx) or is it handled?","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"80db7e131e25c42dfe563510781e855f6c5f5e65","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            mounted \u003d False"},{"line_number":134,"context_line":"            LOG.info(\u0027Fixing previous mount %s which was not\u0027"},{"line_number":135,"context_line":"                     \u0027 unmounted correctly.\u0027, mount_path)"},{"line_number":136,"context_line":"            umount_volume(mount_path)"},{"line_number":137,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":138,"context_line":"            mounted \u003d False"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_ab42a93c","line":136,"range":{"start_line":136,"start_character":0,"end_line":136,"end_character":37},"in_reply_to":"9fdfeff1_246a8c19","updated":"2019-02-14 13:49:50.000000000","message":"Yeah, as noted later, it seems this probably can\u0027t raise an exception since \u0027processutils.ProcessExecutionError\u0027 is already handled inside that function","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e248c9902606c85a2a25f5e6cefa28598f1dd00e","unresolved":false,"context_lines":[{"line_number":133,"context_line":"            mounted \u003d False"},{"line_number":134,"context_line":"            LOG.info(\u0027Fixing previous mount %s which was not\u0027"},{"line_number":135,"context_line":"                     \u0027 unmounted correctly.\u0027, mount_path)"},{"line_number":136,"context_line":"            umount_volume(mount_path)"},{"line_number":137,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":138,"context_line":"            mounted \u003d False"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_246a8c19","line":136,"range":{"start_line":136,"start_character":0,"end_line":136,"end_character":37},"in_reply_to":"9fdfeff1_6d496cb5","updated":"2019-02-13 10:10:44.000000000","message":"mmh. I\u0027m adding this. It\u0027s not part of the CLs bugfix objective but it is correct that this should be handled. I\u0027ll update.","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"74f0c13ba35c77cd2fe58847286e98abb34cf098","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        \"\"\"Disconnect the volume.\"\"\""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        mount_path \u003d self._get_mount_path(connection_info)"},{"line_number":152,"context_line":"        if validate_volume(mount_path):"},{"line_number":153,"context_line":"            umount_volume(mount_path)"},{"line_number":154,"context_line":"        else:"},{"line_number":155,"context_line":"            LOG.info(\"Trying to disconnected unmounted volume at %s\","}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_0ac66f9b","line":152,"range":{"start_line":152,"start_character":0,"end_line":152,"end_character":39},"updated":"2019-02-13 11:00:49.000000000","message":"As noted above, I think all but one code-paths for this raise an exception now, right? If so...","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"f3fe423476c4da592c5cddb9512cbbafa797ea91","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        \"\"\"Disconnect the volume.\"\"\""},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"        mount_path \u003d self._get_mount_path(connection_info)"},{"line_number":152,"context_line":"        if validate_volume(mount_path):"},{"line_number":153,"context_line":"            umount_volume(mount_path)"},{"line_number":154,"context_line":"        else:"},{"line_number":155,"context_line":"            LOG.info(\"Trying to disconnected unmounted volume at %s\","}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_ba3bd535","line":152,"range":{"start_line":152,"start_character":0,"end_line":152,"end_character":39},"in_reply_to":"9fdfeff1_0ac66f9b","updated":"2019-02-14 11:49:51.000000000","message":"Done","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"74f0c13ba35c77cd2fe58847286e98abb34cf098","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        if validate_volume(mount_path):"},{"line_number":153,"context_line":"            umount_volume(mount_path)"},{"line_number":154,"context_line":"        else:"},{"line_number":155,"context_line":"            LOG.info(\"Trying to disconnected unmounted volume at %s\","},{"line_number":156,"context_line":"                     mount_path)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _normalize_export(self, export):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_0a742f67","line":155,"range":{"start_line":155,"start_character":32,"end_line":155,"end_character":44},"updated":"2019-02-13 11:00:49.000000000","message":"note related, but s/disconnected/disconnect/ ?","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"f3fe423476c4da592c5cddb9512cbbafa797ea91","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        if validate_volume(mount_path):"},{"line_number":153,"context_line":"            umount_volume(mount_path)"},{"line_number":154,"context_line":"        else:"},{"line_number":155,"context_line":"            LOG.info(\"Trying to disconnected unmounted volume at %s\","},{"line_number":156,"context_line":"                     mount_path)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _normalize_export(self, export):"}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_5a4669c2","line":155,"range":{"start_line":155,"start_character":32,"end_line":155,"end_character":44},"in_reply_to":"9fdfeff1_0a742f67","updated":"2019-02-14 11:49:51.000000000","message":"Done","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"74f0c13ba35c77cd2fe58847286e98abb34cf098","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        if validate_volume(mount_path):"},{"line_number":153,"context_line":"            umount_volume(mount_path)"},{"line_number":154,"context_line":"        else:"},{"line_number":155,"context_line":"            LOG.info(\"Trying to disconnected unmounted volume at %s\","},{"line_number":156,"context_line":"                     mount_path)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _normalize_export(self, export):"},{"line_number":159,"context_line":"        protocol \u003d SOURCE_PROTOCOL + \"://\""}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_4a56b7d0","line":156,"range":{"start_line":155,"start_character":0,"end_line":156,"end_character":32},"updated":"2019-02-13 11:00:49.000000000","message":"This is essentially dead code now, yeah? If the above didn\u0027t return (True), then an exception is going to be raised, which would be bubbled up through the layers. Do we want a try-catch around the validate_volume above instead? I think we need one, tbh.","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"f3fe423476c4da592c5cddb9512cbbafa797ea91","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        if validate_volume(mount_path):"},{"line_number":153,"context_line":"            umount_volume(mount_path)"},{"line_number":154,"context_line":"        else:"},{"line_number":155,"context_line":"            LOG.info(\"Trying to disconnected unmounted volume at %s\","},{"line_number":156,"context_line":"                     mount_path)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _normalize_export(self, export):"},{"line_number":159,"context_line":"        protocol \u003d SOURCE_PROTOCOL + \"://\""}],"source_content_type":"text/x-python","patch_set":11,"id":"9fdfeff1_7a41eda5","line":156,"range":{"start_line":155,"start_character":0,"end_line":156,"end_character":32},"in_reply_to":"9fdfeff1_4a56b7d0","updated":"2019-02-14 11:49:51.000000000","message":"Done","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3471bbf421fe803a08f9e84d08caea41f47cf792","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    for p in partitions:"},{"line_number":82,"context_line":"        if mount_path !\u003d p.mountpoint:"},{"line_number":83,"context_line":"            continue"},{"line_number":84,"context_line":"        if p.device.startswith(\"quobyte@\") or (p.fstype \u003d\u003d \"fuse.quobyte\"):"},{"line_number":85,"context_line":"            statresult \u003d os.stat(mount_path)"},{"line_number":86,"context_line":"            # Note(kaisers): Quobyte always shows mount points with size 0"},{"line_number":87,"context_line":"            if statresult.st_size \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_80dd44de","line":84,"range":{"start_line":84,"start_character":46,"end_line":84,"end_character":75},"updated":"2019-02-14 13:48:18.000000000","message":"style nit: don\u0027t need brackets here either","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"48546504acb0b41d8431e1ec6d4403a460cee3ee","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    for p in partitions:"},{"line_number":82,"context_line":"        if mount_path !\u003d p.mountpoint:"},{"line_number":83,"context_line":"            continue"},{"line_number":84,"context_line":"        if p.device.startswith(\"quobyte@\") or (p.fstype \u003d\u003d \"fuse.quobyte\"):"},{"line_number":85,"context_line":"            statresult \u003d os.stat(mount_path)"},{"line_number":86,"context_line":"            # Note(kaisers): Quobyte always shows mount points with size 0"},{"line_number":87,"context_line":"            if statresult.st_size \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_eba2f1fb","line":84,"range":{"start_line":84,"start_character":46,"end_line":84,"end_character":75},"in_reply_to":"9fdfeff1_80dd44de","updated":"2019-02-19 11:39:50.000000000","message":"Done","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3471bbf421fe803a08f9e84d08caea41f47cf792","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        except nova_exception.StaleVolumeMount:"},{"line_number":136,"context_line":"            mounted \u003d False"},{"line_number":137,"context_line":"            LOG.info(\u0027Fixing previous mount %s which was not\u0027"},{"line_number":138,"context_line":"                     \u0027 unmounted correctly.\u0027, mount_path)"},{"line_number":139,"context_line":"            try:"},{"line_number":140,"context_line":"                umount_volume(mount_path)"},{"line_number":141,"context_line":"            except Exception as exc:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_00eb9477","line":138,"range":{"start_line":138,"start_character":22,"end_line":138,"end_character":23},"updated":"2019-02-14 13:48:18.000000000","message":"nit: we tend to put these at the end of the previous line rather than the beginning of the next one","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"48546504acb0b41d8431e1ec6d4403a460cee3ee","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        except nova_exception.StaleVolumeMount:"},{"line_number":136,"context_line":"            mounted \u003d False"},{"line_number":137,"context_line":"            LOG.info(\u0027Fixing previous mount %s which was not\u0027"},{"line_number":138,"context_line":"                     \u0027 unmounted correctly.\u0027, mount_path)"},{"line_number":139,"context_line":"            try:"},{"line_number":140,"context_line":"                umount_volume(mount_path)"},{"line_number":141,"context_line":"            except Exception as exc:"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_6bb60141","line":138,"range":{"start_line":138,"start_character":22,"end_line":138,"end_character":23},"in_reply_to":"9fdfeff1_00eb9477","updated":"2019-02-19 11:39:50.000000000","message":"Done","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3471bbf421fe803a08f9e84d08caea41f47cf792","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            try:"},{"line_number":140,"context_line":"                umount_volume(mount_path)"},{"line_number":141,"context_line":"            except Exception as exc:"},{"line_number":142,"context_line":"                LOG.info(\u0027Unmounting previous mount %(mnt)s failed, \u0027"},{"line_number":143,"context_line":"                         \u0027trying to continue with existing mount. \u0027"},{"line_number":144,"context_line":"                         \u0027umount failure reason was %(fail)s\u0027,"},{"line_number":145,"context_line":"                         {\"mnt\": mount_path, \"fail\": exc})"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_a08ac8bb","line":142,"range":{"start_line":142,"start_character":16,"end_line":142,"end_character":24},"updated":"2019-02-14 13:48:18.000000000","message":"I wonder if we should use LOG.exception here? How serious is this? I\u0027m guessing no because we said we\u0027re going to continue (i.e. it may be recoverable) but I\u0027m not certain","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"48546504acb0b41d8431e1ec6d4403a460cee3ee","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            try:"},{"line_number":140,"context_line":"                umount_volume(mount_path)"},{"line_number":141,"context_line":"            except Exception as exc:"},{"line_number":142,"context_line":"                LOG.info(\u0027Unmounting previous mount %(mnt)s failed, \u0027"},{"line_number":143,"context_line":"                         \u0027trying to continue with existing mount. \u0027"},{"line_number":144,"context_line":"                         \u0027umount failure reason was %(fail)s\u0027,"},{"line_number":145,"context_line":"                         {\"mnt\": mount_path, \"fail\": exc})"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_d5d73aee","line":142,"range":{"start_line":142,"start_character":16,"end_line":142,"end_character":24},"in_reply_to":"9fdfeff1_a08ac8bb","updated":"2019-02-19 11:39:50.000000000","message":"if this is not recovered it fails further down during the final validation. Thus i think an exception level is not required here but i\u0027ll upgrade to warning.","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3471bbf421fe803a08f9e84d08caea41f47cf792","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            mounted \u003d False"},{"line_number":137,"context_line":"            LOG.info(\u0027Fixing previous mount %s which was not\u0027"},{"line_number":138,"context_line":"                     \u0027 unmounted correctly.\u0027, mount_path)"},{"line_number":139,"context_line":"            try:"},{"line_number":140,"context_line":"                umount_volume(mount_path)"},{"line_number":141,"context_line":"            except Exception as exc:"},{"line_number":142,"context_line":"                LOG.info(\u0027Unmounting previous mount %(mnt)s failed, \u0027"},{"line_number":143,"context_line":"                         \u0027trying to continue with existing mount. \u0027"},{"line_number":144,"context_line":"                         \u0027umount failure reason was %(fail)s\u0027,"},{"line_number":145,"context_line":"                         {\"mnt\": mount_path, \"fail\": exc})"},{"line_number":146,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":147,"context_line":"            mounted \u003d False"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_8b15653f","line":145,"range":{"start_line":139,"start_character":0,"end_line":145,"end_character":58},"updated":"2019-02-14 13:48:18.000000000","message":"Actually, I was wrong. It looks like this can\u0027t raise an exception because the only possible exception (aside from ValueError or the likes) we can raise is \u0027processutils.ProcessExecutionError\u0027 and we already handle that","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"48546504acb0b41d8431e1ec6d4403a460cee3ee","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            mounted \u003d False"},{"line_number":137,"context_line":"            LOG.info(\u0027Fixing previous mount %s which was not\u0027"},{"line_number":138,"context_line":"                     \u0027 unmounted correctly.\u0027, mount_path)"},{"line_number":139,"context_line":"            try:"},{"line_number":140,"context_line":"                umount_volume(mount_path)"},{"line_number":141,"context_line":"            except Exception as exc:"},{"line_number":142,"context_line":"                LOG.info(\u0027Unmounting previous mount %(mnt)s failed, \u0027"},{"line_number":143,"context_line":"                         \u0027trying to continue with existing mount. \u0027"},{"line_number":144,"context_line":"                         \u0027umount failure reason was %(fail)s\u0027,"},{"line_number":145,"context_line":"                         {\"mnt\": mount_path, \"fail\": exc})"},{"line_number":146,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":147,"context_line":"            mounted \u003d False"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_9576920c","line":145,"range":{"start_line":139,"start_character":0,"end_line":145,"end_character":58},"in_reply_to":"9fdfeff1_8b15653f","updated":"2019-02-19 11:39:50.000000000","message":"ok, afaiu this requires no further change right here.","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8309a25c91badb438dd59af2cbd5bb7f250b1759","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            mounted \u003d False"},{"line_number":137,"context_line":"            LOG.info(\u0027Fixing previous mount %s which was not\u0027"},{"line_number":138,"context_line":"                     \u0027 unmounted correctly.\u0027, mount_path)"},{"line_number":139,"context_line":"            try:"},{"line_number":140,"context_line":"                umount_volume(mount_path)"},{"line_number":141,"context_line":"            except Exception as exc:"},{"line_number":142,"context_line":"                LOG.info(\u0027Unmounting previous mount %(mnt)s failed, \u0027"},{"line_number":143,"context_line":"                         \u0027trying to continue with existing mount. \u0027"},{"line_number":144,"context_line":"                         \u0027umount failure reason was %(fail)s\u0027,"},{"line_number":145,"context_line":"                         {\"mnt\": mount_path, \"fail\": exc})"},{"line_number":146,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":147,"context_line":"            mounted \u003d False"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_763d34dc","line":145,"range":{"start_line":139,"start_character":0,"end_line":145,"end_character":58},"in_reply_to":"9fdfeff1_9576920c","updated":"2019-02-19 14:36:26.000000000","message":"Not quite. I\u0027m suggesting you should drop the try-catch again since it\u0027s not needed after all (there\u0027s no real exception we can raise that this would catch)","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3471bbf421fe803a08f9e84d08caea41f47cf792","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        try:"},{"line_number":155,"context_line":"            validate_volume(mount_path)"},{"line_number":156,"context_line":"        except nova_exception as nex:"},{"line_number":157,"context_line":"            LOG.error(\"Quobyte mount failed on %(mnt)s due to %(msg)s\","},{"line_number":158,"context_line":"                      {\"mnt\": mount_path, \"msg\": nex})"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_6005c013","line":156,"range":{"start_line":156,"start_character":15,"end_line":156,"end_character":29},"updated":"2019-02-14 13:48:18.000000000","message":"This is a module. Did you mean to catch a type of exception? Perhaps InvalidVolume (since StaleVolumeMount seems very unlikely)?","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"48546504acb0b41d8431e1ec6d4403a460cee3ee","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        try:"},{"line_number":155,"context_line":"            validate_volume(mount_path)"},{"line_number":156,"context_line":"        except nova_exception as nex:"},{"line_number":157,"context_line":"            LOG.error(\"Quobyte mount failed on %(mnt)s due to %(msg)s\","},{"line_number":158,"context_line":"                      {\"mnt\": mount_path, \"msg\": nex})"},{"line_number":159,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_550b4a7c","line":156,"range":{"start_line":156,"start_character":15,"end_line":156,"end_character":29},"in_reply_to":"9fdfeff1_6005c013","updated":"2019-02-19 11:39:50.000000000","message":"This is a final catch all and i omitted .NovaException, done.\n\nStarting to fail seeing the wood for the trees...","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3471bbf421fe803a08f9e84d08caea41f47cf792","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        mount_path \u003d self._get_mount_path(connection_info)"},{"line_number":165,"context_line":"        try:"},{"line_number":166,"context_line":"            validate_volume(mount_path)"},{"line_number":167,"context_line":"            umount_volume(mount_path)"},{"line_number":168,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":169,"context_line":"            LOG.info(\"Trying to disconnect unmounted Quobyte volume at %s\","},{"line_number":170,"context_line":"                     mount_path)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_c0210cb6","line":167,"range":{"start_line":167,"start_character":12,"end_line":167,"end_character":37},"updated":"2019-02-14 13:48:18.000000000","message":"As above, it looks like this can\u0027t raise an exception (the processutils.ProcessExecutionError exception is already handled within) so this should probably go within an \u0027else\u0027 block (try-except-else)","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"48546504acb0b41d8431e1ec6d4403a460cee3ee","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        mount_path \u003d self._get_mount_path(connection_info)"},{"line_number":165,"context_line":"        try:"},{"line_number":166,"context_line":"            validate_volume(mount_path)"},{"line_number":167,"context_line":"            umount_volume(mount_path)"},{"line_number":168,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":169,"context_line":"            LOG.info(\"Trying to disconnect unmounted Quobyte volume at %s\","},{"line_number":170,"context_line":"                     mount_path)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9fdfeff1_955f7274","line":167,"range":{"start_line":167,"start_character":12,"end_line":167,"end_character":37},"in_reply_to":"9fdfeff1_c0210cb6","updated":"2019-02-19 11:39:50.000000000","message":"Done","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8309a25c91badb438dd59af2cbd5bb7f250b1759","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            mounted \u003d False"},{"line_number":137,"context_line":"            LOG.info(\u0027Fixing previous mount %s which was not \u0027"},{"line_number":138,"context_line":"                     \u0027unmounted correctly.\u0027, mount_path)"},{"line_number":139,"context_line":"            try:"},{"line_number":140,"context_line":"                umount_volume(mount_path)"},{"line_number":141,"context_line":"            except Exception as exc:"},{"line_number":142,"context_line":"                LOG.warning(\u0027Unmounting previous mount %(mnt)s failed, \u0027"},{"line_number":143,"context_line":"                            \u0027trying to continue with existing mount. \u0027"},{"line_number":144,"context_line":"                            \u0027umount failure reason was %(fail)s\u0027,"},{"line_number":145,"context_line":"                            {\"mnt\": mount_path, \"fail\": exc})"},{"line_number":146,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":147,"context_line":"            mounted \u003d False"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9fdfeff1_361fac71","line":145,"range":{"start_line":139,"start_character":0,"end_line":145,"end_character":61},"updated":"2019-02-19 14:36:26.000000000","message":"Still need to drop the try-catch here [1]\n\n[1] https://review.openstack.org/#/c/522245/13/nova/virt/libvirt/volume/quobyte.py@145","commit_id":"227f3fd55288e799bf926ad9d9aaea78babd20d0"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"b9a7d337c0e111fa0064babbbefdcfdb3b1f16d3","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            mounted \u003d False"},{"line_number":137,"context_line":"            LOG.info(\u0027Fixing previous mount %s which was not \u0027"},{"line_number":138,"context_line":"                     \u0027unmounted correctly.\u0027, mount_path)"},{"line_number":139,"context_line":"            try:"},{"line_number":140,"context_line":"                umount_volume(mount_path)"},{"line_number":141,"context_line":"            except Exception as exc:"},{"line_number":142,"context_line":"                LOG.warning(\u0027Unmounting previous mount %(mnt)s failed, \u0027"},{"line_number":143,"context_line":"                            \u0027trying to continue with existing mount. \u0027"},{"line_number":144,"context_line":"                            \u0027umount failure reason was %(fail)s\u0027,"},{"line_number":145,"context_line":"                            {\"mnt\": mount_path, \"fail\": exc})"},{"line_number":146,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":147,"context_line":"            mounted \u003d False"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9fdfeff1_63cec15c","line":145,"range":{"start_line":139,"start_character":0,"end_line":145,"end_character":61},"in_reply_to":"9fdfeff1_361fac71","updated":"2019-02-20 09:37:31.000000000","message":"Done","commit_id":"227f3fd55288e799bf926ad9d9aaea78babd20d0"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e803eb60b054162dc692e1a63d327d5a4eec0d78","unresolved":false,"context_lines":[{"line_number":136,"context_line":"            mounted \u003d False"},{"line_number":137,"context_line":"            LOG.info(\u0027Fixing previous mount %s which was not \u0027"},{"line_number":138,"context_line":"                     \u0027unmounted correctly.\u0027, mount_path)"},{"line_number":139,"context_line":"            try:"},{"line_number":140,"context_line":"                umount_volume(mount_path)"},{"line_number":141,"context_line":"            except Exception as exc:"},{"line_number":142,"context_line":"                LOG.warning(\u0027Unmounting previous mount %(mnt)s failed, \u0027"},{"line_number":143,"context_line":"                            \u0027trying to continue with existing mount. \u0027"},{"line_number":144,"context_line":"                            \u0027umount failure reason was %(fail)s\u0027,"},{"line_number":145,"context_line":"                            {\"mnt\": mount_path, \"fail\": exc})"},{"line_number":146,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":147,"context_line":"            mounted \u003d False"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9fdfeff1_e39e3168","line":145,"range":{"start_line":139,"start_character":0,"end_line":145,"end_character":61},"in_reply_to":"9fdfeff1_361fac71","updated":"2019-02-20 09:30:26.000000000","message":"Done","commit_id":"227f3fd55288e799bf926ad9d9aaea78babd20d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"8309a25c91badb438dd59af2cbd5bb7f250b1759","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        try:"},{"line_number":166,"context_line":"            validate_volume(mount_path)"},{"line_number":167,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":168,"context_line":"            LOG.info(\"Trying to disconnect unmounted Quobyte volume at %s\","},{"line_number":169,"context_line":"                     mount_path)"},{"line_number":170,"context_line":"        except nova_exception.StaleVolumeMount as nes:"},{"line_number":171,"context_line":"            LOG.warning(\"Could not disconnect Quobyte volume mount: %s\", nes)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fdfeff1_8a0c2ced","line":168,"range":{"start_line":168,"start_character":21,"end_line":168,"end_character":75},"updated":"2019-02-19 14:36:26.000000000","message":"I didn\u0027t notice this before, but is this a helpful error message? FWICT, this happens because we tried to validate the volume before removing it and it failed because (a) the mount path didn\u0027t point to a Quobyte filesystem or (b) the mount path didn\u0027t even exist (the two conditions that can raise InvalidVolume from this exception). If that\u0027s the case, shouldn\u0027t do something like so:\n\n  except (nova_exception.InvalidVolume,\n          nova_exception.StaleVolumeMount) as exc:\n      LOG.warning(\u0027Could not disconnect Quobyte volume mount: %s\u0027, exc)\n\ni.e. catch both exception types in the same block","commit_id":"227f3fd55288e799bf926ad9d9aaea78babd20d0"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e803eb60b054162dc692e1a63d327d5a4eec0d78","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        try:"},{"line_number":166,"context_line":"            validate_volume(mount_path)"},{"line_number":167,"context_line":"        except nova_exception.InvalidVolume:"},{"line_number":168,"context_line":"            LOG.info(\"Trying to disconnect unmounted Quobyte volume at %s\","},{"line_number":169,"context_line":"                     mount_path)"},{"line_number":170,"context_line":"        except nova_exception.StaleVolumeMount as nes:"},{"line_number":171,"context_line":"            LOG.warning(\"Could not disconnect Quobyte volume mount: %s\", nes)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9fdfeff1_43c4dd5f","line":168,"range":{"start_line":168,"start_character":21,"end_line":168,"end_character":75},"in_reply_to":"9fdfeff1_8a0c2ced","updated":"2019-02-20 09:30:26.000000000","message":"Done","commit_id":"227f3fd55288e799bf926ad9d9aaea78babd20d0"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7c9aff663950f2de2fa7ab6728778dd823f94828","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            validate_volume(mount_path)"},{"line_number":150,"context_line":"        except nova_exception.NovaException as nex:"},{"line_number":151,"context_line":"            LOG.error(\"Quobyte mount failed on %(mnt)s due to %(msg)s\","},{"line_number":152,"context_line":"                      {\"mnt\": mount_path, \"msg\": nex})"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9fdfeff1_a3110960","line":150,"range":{"start_line":150,"start_character":0,"end_line":150,"end_character":51},"updated":"2019-02-20 09:57:29.000000000","message":"nit: Would probably be saner to catch the specific exceptions here too, as below:\n\n    except (nova_exception.InvalidVolume,\n            nova_exception.StaleVolumeMount) as exc:","commit_id":"99922fbd79f4bf63e856dfc019cd980ce653aa72"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"0b131ac165c4500b0240b4f4596e5b553d26d09e","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            validate_volume(mount_path)"},{"line_number":150,"context_line":"        except nova_exception.NovaException as nex:"},{"line_number":151,"context_line":"            LOG.error(\"Quobyte mount failed on %(mnt)s due to %(msg)s\","},{"line_number":152,"context_line":"                      {\"mnt\": mount_path, \"msg\": nex})"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9fdfeff1_40fdae06","line":150,"range":{"start_line":150,"start_character":0,"end_line":150,"end_character":51},"in_reply_to":"9fdfeff1_a3110960","updated":"2019-02-20 12:55:03.000000000","message":"Done","commit_id":"99922fbd79f4bf63e856dfc019cd980ce653aa72"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"7c9aff663950f2de2fa7ab6728778dd823f94828","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            validate_volume(mount_path)"},{"line_number":150,"context_line":"        except nova_exception.NovaException as nex:"},{"line_number":151,"context_line":"            LOG.error(\"Quobyte mount failed on %(mnt)s due to %(msg)s\","},{"line_number":152,"context_line":"                      {\"mnt\": mount_path, \"msg\": nex})"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @utils.synchronized(\u0027connect_qb_volume\u0027)"},{"line_number":155,"context_line":"    def disconnect_volume(self, connection_info, instance):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9fdfeff1_23051915","line":152,"range":{"start_line":151,"start_character":0,"end_line":152,"end_character":54},"updated":"2019-02-20 09:57:29.000000000","message":"nit: You\u0027re logging the mount path twice because it\u0027s logged in all the exceptions above. This would probably read better if it was like the disconnect message:\n\n  LOG.warning(\"Could not mount Quobyte volume: %s\", exc)\n\n(or s/mount/connect/ - I\u0027m not sure what\u0027s the preferred terminology)","commit_id":"99922fbd79f4bf63e856dfc019cd980ce653aa72"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"0b131ac165c4500b0240b4f4596e5b553d26d09e","unresolved":false,"context_lines":[{"line_number":148,"context_line":"        try:"},{"line_number":149,"context_line":"            validate_volume(mount_path)"},{"line_number":150,"context_line":"        except nova_exception.NovaException as nex:"},{"line_number":151,"context_line":"            LOG.error(\"Quobyte mount failed on %(mnt)s due to %(msg)s\","},{"line_number":152,"context_line":"                      {\"mnt\": mount_path, \"msg\": nex})"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    @utils.synchronized(\u0027connect_qb_volume\u0027)"},{"line_number":155,"context_line":"    def disconnect_volume(self, connection_info, instance):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9fdfeff1_6002320c","line":152,"range":{"start_line":151,"start_character":0,"end_line":152,"end_character":54},"in_reply_to":"9fdfeff1_23051915","updated":"2019-02-20 12:55:03.000000000","message":"Done","commit_id":"99922fbd79f4bf63e856dfc019cd980ce653aa72"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e346cb03be25840b3858e13e91cdc9f390afca63","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        if libvirt_utils.is_mounted(mount_path, \u0027quobyte@\u0027 + quobyte_volume):"},{"line_number":160,"context_line":"            umount_volume(mount_path)"},{"line_number":161,"context_line":"        else:"},{"line_number":162,"context_line":"            LOG.info(\"Trying to disconnected unmounted volume at %s\","},{"line_number":163,"context_line":"                     mount_path)"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def _normalize_export(self, export):"},{"line_number":166,"context_line":"        protocol \u003d SOURCE_PROTOCOL + \"://\""}],"source_content_type":"text/x-python","patch_set":17,"id":"5fc1f717_bd5c6f7d","side":"PARENT","line":163,"range":{"start_line":162,"start_character":12,"end_line":163,"end_character":32},"updated":"2019-04-05 14:28:41.000000000","message":"Don\u0027t we want this log message anymore?","commit_id":"104d79d8dd05fc49c4160b759d43291b874c5d28"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e346cb03be25840b3858e13e91cdc9f390afca63","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        mount_path \u003d self._get_mount_path(connection_info)"},{"line_number":159,"context_line":"        try:"},{"line_number":160,"context_line":"            validate_volume(mount_path)"},{"line_number":161,"context_line":"        except (nova_exception.InvalidVolume,"},{"line_number":162,"context_line":"                nova_exception.StaleVolumeMount) as exc:"},{"line_number":163,"context_line":"            LOG.warning(\"Could not disconnect Quobyte volume mount: %s\", exc)"}],"source_content_type":"text/x-python","patch_set":17,"id":"5fc1f717_ddbdbb68","line":160,"range":{"start_line":160,"start_character":12,"end_line":160,"end_character":39},"updated":"2019-04-05 14:28:41.000000000","message":"This now cycles through the whole mount table rather than targeting the one mount_path. I get that that\u0027s probably necessary for your fix. But in real life, is that a possible performance killer?","commit_id":"05a73c0f3a9f8edf9024f9870279bc6fb7bba2e7"}],"releasenotes/notes/qb-bug-1730933-6695470ebaee0fbd.yaml":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"71bd52ba4e5f838c8d80456f2615b2008c943459","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The Quobyte Nova driver now supports identifying Quobyte mounts"},{"line_number":5,"context_line":"    via the mounts fstype field."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9fdfeff1_6d708c09","line":5,"range":{"start_line":4,"start_character":0,"end_line":5,"end_character":32},"updated":"2019-02-12 14:46:38.000000000","message":"So what? :) Tell me why I should care about this. I\u0027m presuming the reason is that it will lead to more consistent behavior? Alternatively, perhaps this corrects behavior where it was previously correct? If so, I wonder if this should be \u0027bugfixes\u0027 (or whatever the category is called) instead of \u0027features\u0027?","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"e248c9902606c85a2a25f5e6cefa28598f1dd00e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The Quobyte Nova driver now supports identifying Quobyte mounts"},{"line_number":5,"context_line":"    via the mounts fstype field."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"9fdfeff1_efc21d53","line":5,"range":{"start_line":4,"start_character":0,"end_line":5,"end_character":32},"in_reply_to":"9fdfeff1_6d708c09","updated":"2019-02-13 10:10:44.000000000","message":"Correct. :)\nThis is required for compatibility with future Quobyte client versions, i updated the message.","commit_id":"5de6b42d8a5fb963bf979c99d2776f91cb61947c"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"3471bbf421fe803a08f9e84d08caea41f47cf792","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The Quobyte Nova driver now supports identifying Quobyte mounts"},{"line_number":5,"context_line":"    via the mounts fstype field, which is used by Quobyte 2.x clients."},{"line_number":6,"context_line":"    The previous behaviour is deprecated and may be removed from the"},{"line_number":7,"context_line":"    Quobyte clients in the future."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"9fdfeff1_e011b05e","line":4,"range":{"start_line":4,"start_character":21,"end_line":4,"end_character":27},"updated":"2019-02-14 13:48:18.000000000","message":"volume driver?","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"},{"author":{"_account_id":13915,"name":"Silvan Kaiser","email":"silvan@quobyte.com","username":"kaisers"},"change_message_id":"48546504acb0b41d8431e1ec6d4403a460cee3ee","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The Quobyte Nova driver now supports identifying Quobyte mounts"},{"line_number":5,"context_line":"    via the mounts fstype field, which is used by Quobyte 2.x clients."},{"line_number":6,"context_line":"    The previous behaviour is deprecated and may be removed from the"},{"line_number":7,"context_line":"    Quobyte clients in the future."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"9fdfeff1_b5c95626","line":4,"range":{"start_line":4,"start_character":21,"end_line":4,"end_character":27},"in_reply_to":"9fdfeff1_e011b05e","updated":"2019-02-19 11:39:50.000000000","message":"Done","commit_id":"30502502b25df2c3e09c600f51f4a0cac63aafe8"}]}
