)]}'
{"etc/nova/rootwrap.d/compute.filters":[{"author":{"_account_id":1561,"name":"Russell Bryant","email":"rbryant@redhat.com","username":"russellb"},"change_message_id":"0744c841dd72829e17e2b0eefe633518600a1192","unresolved":false,"context_lines":[{"line_number":176,"context_line":"tgtadm: CommandFilter, /usr/sbin/tgtadm, root"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"# nova/virt/libvirt/volume_scality.py: mount -t sofs ..."},{"line_number":179,"context_line":"mount: CommandFilter, /bin/mount, root"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"# nova/utils.py:read_file_as_root: \u0027cat\u0027, file_path"},{"line_number":182,"context_line":"# (called from nova/virt/disk/vfs/localfs.py:VFSLocalFS.read_file)"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAM3%2F%2B7yQ%3D","line":179,"updated":"2013-02-13 23:10:47.000000000","message":"mount is already allowed, see line 17","commit_id":"d64d3999acb432d78d21cc28c18201e65813bce7"},{"author":{"_account_id":6540,"name":"Jean-Marc Saffroy","email":"jean.marc.saffroy@scality.com","username":"jean-marc-saffroy"},"change_message_id":"6535028430466d7dfc1129c366f9d2eacd4fadd7","unresolved":false,"context_lines":[{"line_number":176,"context_line":"tgtadm: CommandFilter, /usr/sbin/tgtadm, root"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"# nova/virt/libvirt/volume_scality.py: mount -t sofs ..."},{"line_number":179,"context_line":"mount: CommandFilter, /bin/mount, root"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"# nova/utils.py:read_file_as_root: \u0027cat\u0027, file_path"},{"line_number":182,"context_line":"# (called from nova/virt/disk/vfs/localfs.py:VFSLocalFS.read_file)"}],"source_content_type":"application/octet-stream","patch_set":13,"id":"AAAAM3%2F%2B67o%3D","line":179,"in_reply_to":"AAAAM3%2F%2B7yQ%3D","updated":"2013-02-14 13:25:39.000000000","message":"Done","commit_id":"d64d3999acb432d78d21cc28c18201e65813bce7"}],"nova/tests/test_libvirt_volume.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"dbd6a46458ed36d94882aac56ef72a5cde9b9008","unresolved":false,"context_lines":[{"line_number":446,"context_line":"            os.makedirs(os.path.join(TEST_MOUNT, \u0027sys\u0027))"},{"line_number":447,"context_line":"        except OSError as e:"},{"line_number":448,"context_line":"            if e.errno !\u003d errno.EEXIST:"},{"line_number":449,"context_line":"                raise e"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        def _access_wrapper(path, flags):"},{"line_number":452,"context_line":"            if path \u003d\u003d \u0027/sbin/mount.sofs\u0027:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B6nQ%3D","line":449,"updated":"2013-02-14 16:18:40.000000000","message":"You really need to use the temporary file and directory features already available for the test suite in the fixtures package…","commit_id":"cd93c3a029db7a9d213fa8fa6a7e1374239577a5"},{"author":{"_account_id":6540,"name":"Jean-Marc Saffroy","email":"jean.marc.saffroy@scality.com","username":"jean-marc-saffroy"},"change_message_id":"1fe774b9cc10b5b52e5b689d310821ccb285b404","unresolved":false,"context_lines":[{"line_number":446,"context_line":"            os.makedirs(os.path.join(TEST_MOUNT, \u0027sys\u0027))"},{"line_number":447,"context_line":"        except OSError as e:"},{"line_number":448,"context_line":"            if e.errno !\u003d errno.EEXIST:"},{"line_number":449,"context_line":"                raise e"},{"line_number":450,"context_line":""},{"line_number":451,"context_line":"        def _access_wrapper(path, flags):"},{"line_number":452,"context_line":"            if path \u003d\u003d \u0027/sbin/mount.sofs\u0027:"}],"source_content_type":"text/x-python","patch_set":14,"id":"AAAAM3%2F%2B0is%3D","line":449,"in_reply_to":"AAAAM3%2F%2B6nQ%3D","updated":"2013-02-18 16:20:45.000000000","message":"Done","commit_id":"cd93c3a029db7a9d213fa8fa6a7e1374239577a5"}],"nova/virt/libvirt/volume.py":[{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"152ae4849874b544b1c716e13f125bd1d9a4553e","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        conf \u003d super(ScalityVolumeDriver, self).connect_volume(connection_info,"},{"line_number":275,"context_line":"                                                               mount_device)"},{"line_number":276,"context_line":"        conf.source_type \u003d \u0027file\u0027"},{"line_number":277,"context_line":"        conf.driver_cache \u003d \u0027writethrough\u0027"},{"line_number":278,"context_line":"        return conf"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def disconnect_volume(self, connection_info, mount_device):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FMJs%3D","line":277,"updated":"2013-02-04 10:43:08.000000000","message":"Don\u0027t override the driver_cache value here. Nova defaults to cache \u003d \u0027none\u0027 to avoid polluting the host page cache. Libvirt will also refuse migration of any VM with a cache mode !\u003d \"none\". There is a host config param in another recent patch which allows the admin to selectively override this if they require.","commit_id":"2515d7c952d9d14b5c66aa11b5a21e6db979f0c1"},{"author":{"_account_id":6540,"name":"Jean-Marc Saffroy","email":"jean.marc.saffroy@scality.com","username":"jean-marc-saffroy"},"change_message_id":"43592409f9e05e877fb74eaa4d3f880340895ba0","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        conf \u003d super(ScalityVolumeDriver, self).connect_volume(connection_info,"},{"line_number":275,"context_line":"                                                               mount_device)"},{"line_number":276,"context_line":"        conf.source_type \u003d \u0027file\u0027"},{"line_number":277,"context_line":"        conf.driver_cache \u003d \u0027writethrough\u0027"},{"line_number":278,"context_line":"        return conf"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def disconnect_volume(self, connection_info, mount_device):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FMCU%3D","line":277,"in_reply_to":"AAAAM3%2F%2FMEE%3D","updated":"2013-02-04 13:45:01.000000000","message":"Done","commit_id":"2515d7c952d9d14b5c66aa11b5a21e6db979f0c1"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"8c724a5ae47e448f7572a482910cab3b296b51d5","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        conf \u003d super(ScalityVolumeDriver, self).connect_volume(connection_info,"},{"line_number":275,"context_line":"                                                               mount_device)"},{"line_number":276,"context_line":"        conf.source_type \u003d \u0027file\u0027"},{"line_number":277,"context_line":"        conf.driver_cache \u003d \u0027writethrough\u0027"},{"line_number":278,"context_line":"        return conf"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def disconnect_volume(self, connection_info, mount_device):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FMEE%3D","line":277,"in_reply_to":"AAAAM3%2F%2FMHA%3D","updated":"2013-02-04 12:54:45.000000000","message":"Ah FUSE, that makes sense then. Can you add a comment to the code to explain why you\u0027re overriding the default \u0027driver_cache\u0027 setting here, so future people understand.\n\nThe admin override is implemented in this change (still not merged)\nhttps://review.openstack.org/#/c/18042/","commit_id":"2515d7c952d9d14b5c66aa11b5a21e6db979f0c1"},{"author":{"_account_id":6540,"name":"Jean-Marc Saffroy","email":"jean.marc.saffroy@scality.com","username":"jean-marc-saffroy"},"change_message_id":"52b71e68e0825a3e9d3cfbb2d2a2b1b86a946ac0","unresolved":false,"context_lines":[{"line_number":274,"context_line":"        conf \u003d super(ScalityVolumeDriver, self).connect_volume(connection_info,"},{"line_number":275,"context_line":"                                                               mount_device)"},{"line_number":276,"context_line":"        conf.source_type \u003d \u0027file\u0027"},{"line_number":277,"context_line":"        conf.driver_cache \u003d \u0027writethrough\u0027"},{"line_number":278,"context_line":"        return conf"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"    def disconnect_volume(self, connection_info, mount_device):"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAM3%2F%2FMHA%3D","line":277,"in_reply_to":"AAAAM3%2F%2FMJs%3D","updated":"2013-02-04 12:01:09.000000000","message":"The problem here is that our SOFS is FUSE based, and setting cache \u003d \u0027none\u0027 causes qemu/kvm to open the volume file with O_DIRECT, which is rejected by FUSE (except in recent kernels, \u003e\u003d 3.3.0 it seems). So \u0027none\u0027 simply won\u0027t work, and we need to provide a different default value.\n\nNow if there is a way for the admin to explicitly override, of course we should use their settings. How is it done?","commit_id":"2515d7c952d9d14b5c66aa11b5a21e6db979f0c1"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"53a104af74803bfecbb082d3e22935ed590d023a","unresolved":false,"context_lines":[{"line_number":324,"context_line":"        except exception.ProcessExecutionError:"},{"line_number":325,"context_line":"            return False"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"class ScalityVolumeDriver(LibvirtVolumeDriver):"},{"line_number":328,"context_line":"    \"\"\"Scality SOFS Nova driver. Provide hypervisors with access"},{"line_number":329,"context_line":"    to sparse files on SOFS. \"\"\""},{"line_number":330,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAM3%2F%2FH%2Fk%3D","line":327,"updated":"2013-02-06 12:27:13.000000000","message":"Sorry to ask you to make yet another change - can you rename this to \u0027LibvirtScalityVolumeDriver\u0027 so we have consistent naming wrt existing drivers\n\nAlso, you should be subclassing LibvirtBaseVolumeDriver, rather than LibvirtVolumeDriver.","commit_id":"36e2c1b5a9057cb89374623788225ca9fdfdd887"}],"nova/virt/libvirt/volume_scality.py":[{"author":{"_account_id":951,"name":"Cian O\u0027Driscoll","email":"cian@hp.com","username":"dricco"},"change_message_id":"eb478e1954ec0610eecd5870aebbeb6fef5ac9dc","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        mount_path \u003d CONF.scality_sofs_mount_point"},{"line_number":112,"context_line":"        sysdir \u003d \u0027%s/%s\u0027 % (mount_path, \u0027sys\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if not self._dir_exists(mount_path):"},{"line_number":115,"context_line":"            utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, mount_path)"},{"line_number":116,"context_line":"        if not self._dir_exists(sysdir):"},{"line_number":117,"context_line":"            utils.execute(\u0027mount\u0027, \u0027-t\u0027, \u0027sofs\u0027, config, mount_path,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2Fi6w%3D","line":114,"updated":"2013-01-16 16:18:40.000000000","message":"Can you not use os.path.exists(path) instead of creating _dir_exists?","commit_id":"d5add7c1fd61da54b65afec88ae254eca10e8b5d"},{"author":{"_account_id":6540,"name":"Jean-Marc Saffroy","email":"jean.marc.saffroy@scality.com","username":"jean-marc-saffroy"},"change_message_id":"579d375ce8e85828ed597bcc9e31ceb309627959","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        mount_path \u003d CONF.scality_sofs_mount_point"},{"line_number":112,"context_line":"        sysdir \u003d \u0027%s/%s\u0027 % (mount_path, \u0027sys\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if not self._dir_exists(mount_path):"},{"line_number":115,"context_line":"            utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, mount_path)"},{"line_number":116,"context_line":"        if not self._dir_exists(sysdir):"},{"line_number":117,"context_line":"            utils.execute(\u0027mount\u0027, \u0027-t\u0027, \u0027sofs\u0027, config, mount_path,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAM3%2F%2Fif0%3D","line":114,"in_reply_to":"AAAAM3%2F%2Fi6w%3D","updated":"2013-01-16 19:49:57.000000000","message":"Well, _dir_exists also tells us that a given path is a directory (ie. not a file or a symlink), though I agree it doesn\u0027t buy us much here. I will remove it.","commit_id":"d5add7c1fd61da54b65afec88ae254eca10e8b5d"},{"author":{"_account_id":951,"name":"Cian O\u0027Driscoll","email":"cian@hp.com","username":"dricco"},"change_message_id":"14dad24d68fb3ed7f1abc8d72290e4e14b112ec8","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        config \u003d CONF.scality_sofs_config"},{"line_number":111,"context_line":"        mount_path \u003d CONF.scality_sofs_mount_point"},{"line_number":112,"context_line":"        sysdir \u003d \u0027%s/%s\u0027 % (mount_path, \u0027sys\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if not self._dir_exists(mount_path):"},{"line_number":115,"context_line":"            utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, mount_path)"},{"line_number":116,"context_line":"        if not self._dir_exists(sysdir):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2FhTs%3D","line":113,"updated":"2013-01-17 15:23:14.000000000","message":"Weren\u0027t you going to remove dir_exists, you can os.path.isdir(\u003cpath\u003e)","commit_id":"283a65cdae0d7bd23fe5270e6ac9d981d1a26685"},{"author":{"_account_id":6540,"name":"Jean-Marc Saffroy","email":"jean.marc.saffroy@scality.com","username":"jean-marc-saffroy"},"change_message_id":"77f84a8ebfd81fc77a02b7657e93646a967621bb","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        config \u003d CONF.scality_sofs_config"},{"line_number":111,"context_line":"        mount_path \u003d CONF.scality_sofs_mount_point"},{"line_number":112,"context_line":"        sysdir \u003d \u0027%s/%s\u0027 % (mount_path, \u0027sys\u0027)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        if not self._dir_exists(mount_path):"},{"line_number":115,"context_line":"            utils.execute(\u0027mkdir\u0027, \u0027-p\u0027, mount_path)"},{"line_number":116,"context_line":"        if not self._dir_exists(sysdir):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAM3%2F%2FhO8%3D","line":113,"in_reply_to":"AAAAM3%2F%2FhTs%3D","updated":"2013-01-17 16:12:00.000000000","message":"This patch set wasn\u0027t meant to be reviewed: being just a draft, I thought you couldn\u0027t see it! Sorry for the noise.\nYes, I *will* remove dir_exists and use os.path.isdir.","commit_id":"283a65cdae0d7bd23fe5270e6ac9d981d1a26685"}]}
