)]}'
{"nova/tests/virt/disk/test_loop.py":[{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"4c700d33cc8fb0da32f4337669b9ee597186a802","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import fixtures"},{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":"from testtools.matchers import Equals"},{"line_number":22,"context_line":"from testtools.matchers import MatchesListwise"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2F9I8%3D","line":20,"updated":"2012-12-19 00:23:16.000000000","message":"os is standard library, should be in its own section.","commit_id":"83aefca4d1473f4d3b40861e76f95353df897ac4"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"7dc30b99d1e8b0b436d888ef4958e4144cfb0596","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import fixtures"},{"line_number":20,"context_line":"import os"},{"line_number":21,"context_line":"from testtools.matchers import Equals"},{"line_number":22,"context_line":"from testtools.matchers import MatchesListwise"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2F9Ig%3D","line":20,"in_reply_to":"AAAAM3%2F%2F9I8%3D","updated":"2012-12-19 00:28:59.000000000","message":"Done","commit_id":"83aefca4d1473f4d3b40861e76f95353df897ac4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"4c700d33cc8fb0da32f4337669b9ee597186a802","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from testtools.matchers import MatchesListwise"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from nova import test"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from nova import utils"},{"line_number":27,"context_line":"from nova.virt.disk.mount import loop"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2F9JA%3D","line":25,"updated":"2012-12-19 00:23:16.000000000","message":"This blank line should not be here.","commit_id":"83aefca4d1473f4d3b40861e76f95353df897ac4"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"7dc30b99d1e8b0b436d888ef4958e4144cfb0596","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from testtools.matchers import MatchesListwise"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from nova import test"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"from nova import utils"},{"line_number":27,"context_line":"from nova.virt.disk.mount import loop"},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2F9Ic%3D","line":25,"in_reply_to":"AAAAM3%2F%2F9JA%3D","updated":"2012-12-19 00:28:59.000000000","message":"Done","commit_id":"83aefca4d1473f4d3b40861e76f95353df897ac4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"4c700d33cc8fb0da32f4337669b9ee597186a802","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            return False"},{"line_number":92,"context_line":"        l._inner_get_dev \u003d fake_get_dev_fails"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        # Fail to get a device"},{"line_number":95,"context_line":"        self.assertFalse(l.get_dev())"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def test_unget_dev(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2F9I0%3D","line":94,"updated":"2012-12-19 00:23:16.000000000","message":"Missing full stop. (There are many in this file).","commit_id":"83aefca4d1473f4d3b40861e76f95353df897ac4"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"7dc30b99d1e8b0b436d888ef4958e4144cfb0596","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            return False"},{"line_number":92,"context_line":"        l._inner_get_dev \u003d fake_get_dev_fails"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"        # Fail to get a device"},{"line_number":95,"context_line":"        self.assertFalse(l.get_dev())"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def test_unget_dev(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2F9IY%3D","line":94,"in_reply_to":"AAAAM3%2F%2F9I0%3D","updated":"2012-12-19 00:28:59.000000000","message":"We don\u0027t consistently enforce this one, so I\u0027m going to leave it.","commit_id":"83aefca4d1473f4d3b40861e76f95353df897ac4"},{"author":{"_account_id":4190,"name":"lifeless","email":"robertc@robertcollins.net","username":"lifeless"},"change_message_id":"4c700d33cc8fb0da32f4337669b9ee597186a802","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                                             _fake_noop))"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # This just checks that a free of something we don\u0027t have doesn\u0027t"},{"line_number":104,"context_line":"        # throw and exception"},{"line_number":105,"context_line":"        l.unget_dev()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2F9I4%3D","line":104,"updated":"2012-12-19 00:23:16.000000000","message":"\u0027an\u0027, missing full stop.","commit_id":"83aefca4d1473f4d3b40861e76f95353df897ac4"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"7dc30b99d1e8b0b436d888ef4958e4144cfb0596","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                                             _fake_noop))"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        # This just checks that a free of something we don\u0027t have doesn\u0027t"},{"line_number":104,"context_line":"        # throw and exception"},{"line_number":105,"context_line":"        l.unget_dev()"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2F9IU%3D","line":104,"in_reply_to":"AAAAM3%2F%2F9I4%3D","updated":"2012-12-19 00:28:59.000000000","message":"Done","commit_id":"83aefca4d1473f4d3b40861e76f95353df897ac4"}],"nova/virt/disk/mount/loop.py":[{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"6fae026908e522c97e22e63d95c3c84b1aa61bab","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        # NOTE(mikal): the retry is required here in case we are low on loop"},{"line_number":45,"context_line":"        # devices. Note however that modern kernels will use more loop devices"},{"line_number":46,"context_line":"        # if they exist. If you\u0027re seeing lots of retries, consider adding"},{"line_number":47,"context_line":"        # more devices."},{"line_number":48,"context_line":"        return self._get_dev_retry_helper()"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def unget_dev(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMX%2F%2FzMU%3D","line":47,"updated":"2012-12-16 11:32:34.000000000","message":"we really should LOG.info(self.error) above so that this is apparent in the logs","commit_id":"8d0b50b9469a448944497cbd4d303bfa0de179e8"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"6fae026908e522c97e22e63d95c3c84b1aa61bab","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        if not self.linked:"},{"line_number":52,"context_line":"            return"},{"line_number":53,"context_line":"        LOG.debug(_(\"Release loop device %s\"), self.device)"},{"line_number":54,"context_line":"        utils.execute(\u0027losetup\u0027, \u0027--detach\u0027, self.device, run_as_root\u003dTrue)"},{"line_number":55,"context_line":"        self.linked \u003d False"},{"line_number":56,"context_line":"        self.device \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAMX%2F%2FzMQ%3D","line":54,"updated":"2012-12-16 11:32:34.000000000","message":"I suppose if we\u0027re retrying losetup --find, we should as validly retry losetup --detach for the previously mentioned kernel issue.\n\nI.E. both loop retries are a bit of a band aid/layering violation\nfor kernel issues that can be avoided externally (by increasing\nloop devices or ensuring the aforementioned patch re blkid contention is there).\n\nI.E. the value of the retries are debatable (I\u0027m 60:40 for adding them),\nbut they\u0027re both of the same value I\u0027d say.","commit_id":"8d0b50b9469a448944497cbd4d303bfa0de179e8"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"2f4ef5e3b6357c5a5a1a8d35c127dc0625bda5b5","unresolved":false,"context_lines":[{"line_number":51,"context_line":"        if not self.linked:"},{"line_number":52,"context_line":"            return"},{"line_number":53,"context_line":"        LOG.debug(_(\"Release loop device %s\"), self.device)"},{"line_number":54,"context_line":"        utils.execute(\u0027losetup\u0027, \u0027--detach\u0027, self.device, run_as_root\u003dTrue)"},{"line_number":55,"context_line":"        self.linked \u003d False"},{"line_number":56,"context_line":"        self.device \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAM3%2F%2F%2F4E%3D","line":54,"in_reply_to":"AAAAMX%2F%2FzMQ%3D","updated":"2012-12-16 22:37:44.000000000","message":"The problem here is determining if the detach failed. I guess we could use exit code for that...","commit_id":"8d0b50b9469a448944497cbd4d303bfa0de179e8"},{"author":{"_account_id":1812,"name":"p-draigbrady","email":"P@draigBrady.com","username":"p-draigbrady"},"change_message_id":"7df8b3e0cb285377b87ec64b995057d3ddd9ef18","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    def unget_dev(self):"},{"line_number":52,"context_line":"        if not self.linked:"},{"line_number":53,"context_line":"            return"},{"line_number":54,"context_line":"        LOG.debug(_(\"Release loop device %s\"), self.device)"},{"line_number":55,"context_line":"        utils.execute(\u0027losetup\u0027, \u0027--detach\u0027, self.device, run_as_root\u003dTrue,"},{"line_number":56,"context_line":"                      attempts\u003d3)"},{"line_number":57,"context_line":"        self.linked \u003d False"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FmM%3D","line":54,"updated":"2012-12-17 11:17:31.000000000","message":"Sorry for the churn. The attempts\u003d3 really needs a comment.\n\n    # On some kernels, losetup -d will intermittently fail,\n    # thus leaking a loop device unless the losetup -d is retried:\n    # https://lkml.org/lkml/2012/9/28/62","commit_id":"7dfdd379db1f5dbad108671eb49f6e46b805aa1a"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"c2243d2a7406e944add4a9baf7369363abdadf77","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    def unget_dev(self):"},{"line_number":52,"context_line":"        if not self.linked:"},{"line_number":53,"context_line":"            return"},{"line_number":54,"context_line":"        LOG.debug(_(\"Release loop device %s\"), self.device)"},{"line_number":55,"context_line":"        utils.execute(\u0027losetup\u0027, \u0027--detach\u0027, self.device, run_as_root\u003dTrue,"},{"line_number":56,"context_line":"                      attempts\u003d3)"},{"line_number":57,"context_line":"        self.linked \u003d False"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2F%2FAs%3D","line":54,"in_reply_to":"AAAAM3%2F%2F%2FmM%3D","updated":"2012-12-17 21:08:55.000000000","message":"Done","commit_id":"7dfdd379db1f5dbad108671eb49f6e46b805aa1a"}]}
