)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"90566e19f31bc9c22d9724dd54ba2964ca3e8fac","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This will add additonal KVM-based qoutas for Cinder front-end QoS"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"The new quotas are:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":" - read_bytes_sec_max"},{"line_number":14,"context_line":" - write_bytes_sec_max"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5f7c97a3_b70476c7","line":11,"updated":"2018-06-11 21:02:34.000000000","message":"nit: these should all be prefixed with disk_ since that\u0027s what the actual qos extra spec is called. What you have here is how it gets defined in the guest xml:\n\nhttps://libvirt.org/formatdomain.html#elementsDisks","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"860f94d5d92850a6b33ee9295d05120470175cf2","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This will add additonal KVM-based qoutas for Cinder front-end QoS"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"The new quotas are:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":" - read_bytes_sec_max"},{"line_number":14,"context_line":" - write_bytes_sec_max"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5f7c97a3_c146fa21","line":11,"in_reply_to":"5f7c97a3_b646a620","updated":"2018-06-12 14:33:16.000000000","message":"\u003e It appears there is no documentation for this spec so one will be added when this is merged.\n\nI expect to see at least a cinder docs patch started for the new qos specs support you\u0027re adding before we merge the nova change.","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"9f2b34e1168461a1c1f790b26b839675f80cc1db","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This will add additonal KVM-based qoutas for Cinder front-end QoS"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"The new quotas are:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":" - read_bytes_sec_max"},{"line_number":14,"context_line":" - write_bytes_sec_max"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"5f7c97a3_b646a620","line":11,"in_reply_to":"5f7c97a3_b70476c7","updated":"2018-06-12 14:02:05.000000000","message":"You are referring to the capacity based QoS specs. These are different to the external disk QoS specs. Capacity based is for Ceph and ScaleIO (I think). \nThese new spec values are correct for the Cinder external disk QoS extra spec. It appears there is no documentation for this spec so one will be added when this is merged.","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d1032e5102b40aa04160350155af6affedb8471b","unresolved":false,"context_lines":[{"line_number":18,"context_line":" - total_iops_sec_max"},{"line_number":19,"context_line":" - size_iops_sec"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Cinder documentation updated by this: https://review.openstack.org/574804"},{"line_number":22,"context_line":"Change-Id: I5a8f34c7ed3dea940700dffd54bc7d44f7518ab4"},{"line_number":23,"context_line":"Implements: blueprint enhanced-kvm-storage-qos"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"5f7c97a3_fe870760","line":21,"updated":"2018-06-12 22:59:35.000000000","message":"Let\u0027s depends-on this change:\n\nDepends-On: https://review.openstack.org/574804","commit_id":"da2ca5ec775bf608d154925d4cc5ed38f9cb11de"}],"nova/tests/unit/virt/libvirt/test_config.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"90566e19f31bc9c22d9724dd54ba2964ca3e8fac","unresolved":false,"context_lines":[{"line_number":1190,"context_line":"        self.assertNotIsInstance(obj.device_addr,"},{"line_number":1191,"context_line":"                                 config.LibvirtConfigGuestDeviceAddressPCI)"},{"line_number":1192,"context_line":"        self.assertNotIsInstance(obj.device_addr,"},{"line_number":1193,"context_line":"                                 config.LibvirtConfigGuestDeviceAddressDrive)"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":"    def test_config_disk_device_address_type_ccw(self):"},{"line_number":1196,"context_line":"        xml \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_77233e59","line":1193,"updated":"2018-06-11 21:02:34.000000000","message":"nit: drop the unrelated changes here and below, it clutters up the diff","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"860f94d5d92850a6b33ee9295d05120470175cf2","unresolved":false,"context_lines":[{"line_number":1190,"context_line":"        self.assertNotIsInstance(obj.device_addr,"},{"line_number":1191,"context_line":"                                 config.LibvirtConfigGuestDeviceAddressPCI)"},{"line_number":1192,"context_line":"        self.assertNotIsInstance(obj.device_addr,"},{"line_number":1193,"context_line":"                                 config.LibvirtConfigGuestDeviceAddressDrive)"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":"    def test_config_disk_device_address_type_ccw(self):"},{"line_number":1196,"context_line":"        xml \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_015ab2f0","line":1193,"in_reply_to":"5f7c97a3_36d61651","updated":"2018-06-12 14:33:16.000000000","message":"That can\u0027t be true - if it were, everyone\u0027s changes would be failing. Are you sure there isn\u0027t something with your local IDE or pep8 configuration that is flagging these?","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"9f2b34e1168461a1c1f790b26b839675f80cc1db","unresolved":false,"context_lines":[{"line_number":1190,"context_line":"        self.assertNotIsInstance(obj.device_addr,"},{"line_number":1191,"context_line":"                                 config.LibvirtConfigGuestDeviceAddressPCI)"},{"line_number":1192,"context_line":"        self.assertNotIsInstance(obj.device_addr,"},{"line_number":1193,"context_line":"                                 config.LibvirtConfigGuestDeviceAddressDrive)"},{"line_number":1194,"context_line":""},{"line_number":1195,"context_line":"    def test_config_disk_device_address_type_ccw(self):"},{"line_number":1196,"context_line":"        xml \u003d \"\"\""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_36d61651","line":1193,"in_reply_to":"5f7c97a3_77233e59","updated":"2018-06-12 14:02:05.000000000","message":"I can see why you would want it, but Zuul is being very picky and this seems to fail tox and pep tests if I leave it where it was. This is why the diff has the same extra spaces added 2 more times","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a75065baed1722de4a7d424c0206fba13b16a4eb","unresolved":false,"context_lines":[{"line_number":1022,"context_line":"        obj.disk_write_bytes_sec \u003d 1024000"},{"line_number":1023,"context_line":"        obj.disk_write_iops_sec \u003d 1000"},{"line_number":1024,"context_line":"        obj.disk_total_iops_sec \u003d 2000"},{"line_number":1025,"context_line":"        obj.disk_write_bytes_sec_max \u003d 1536000"},{"line_number":1026,"context_line":"        obj.disk_write_iops_sec_max \u003d 1500"},{"line_number":1027,"context_line":"        obj.disk_total_iops_sec_max \u003d 3072000"},{"line_number":1028,"context_line":"        obj.disk_read_bytes_sec_max \u003d 1536000"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_21bd6ed7","line":1025,"updated":"2018-06-12 14:38:35.000000000","message":"Please add a note that the total iops/bytes values here are for illustration purposes, but the total values can\u0027t actually be used in conjunction with the read/write values.","commit_id":"661bd2230b91c8072b4e72d69457ff02114baf9d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"433f01ed8404070d22ef12bc5a597f9bbb383a8e","unresolved":false,"context_lines":[{"line_number":1022,"context_line":"        obj.disk_write_bytes_sec \u003d 1024000"},{"line_number":1023,"context_line":"        obj.disk_write_iops_sec \u003d 1000"},{"line_number":1024,"context_line":"        obj.disk_total_iops_sec \u003d 2000"},{"line_number":1025,"context_line":"        obj.disk_write_bytes_sec_max \u003d 1536000"},{"line_number":1026,"context_line":"        obj.disk_write_iops_sec_max \u003d 1500"},{"line_number":1027,"context_line":"        obj.disk_total_iops_sec_max \u003d 3072000"},{"line_number":1028,"context_line":"        obj.disk_read_bytes_sec_max \u003d 1536000"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_0114f24b","line":1025,"in_reply_to":"5f7c97a3_21bd6ed7","updated":"2018-06-13 03:20:17.000000000","message":"Done","commit_id":"661bd2230b91c8072b4e72d69457ff02114baf9d"}],"nova/tests/unit/virt/libvirt/test_imagebackend.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"90566e19f31bc9c22d9724dd54ba2964ca3e8fac","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            \u0027quota:disk_read_iops_sec_max\u0027: 2 * units.Ki,"},{"line_number":175,"context_line":"            \u0027quota:disk_write_bytes_sec_max\u0027: 25 * units.Mi,"},{"line_number":176,"context_line":"            \u0027quota:disk_write_iops_sec_max\u0027: 3 * units.Ki,"},{"line_number":177,"context_line":"            \u0027quota:disk_total_bytes_sec_max\u0027: 40 * units.Mi,"},{"line_number":178,"context_line":"            \u0027quota:disk_total_iops_sec_max\u0027: 4 * units.Ki,"},{"line_number":179,"context_line":"            \u0027quota:disk_size_iops_sec\u0027: 16,"},{"line_number":180,"context_line":"        }"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_17fbeabd","line":178,"range":{"start_line":177,"start_character":12,"end_line":178,"end_character":58},"updated":"2018-06-11 21:02:34.000000000","message":"nit: according to the libvirt docs, the total_*_max elements cannot appear when read/write max are specified:\n\nhttps://libvirt.org/formatdomain.html#elementsDisks\n\nI know this is just test code, but it\u0027s something that should be noted in the docs change for the actual qos specs in the cinder admin guide.","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"9f2b34e1168461a1c1f790b26b839675f80cc1db","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            \u0027quota:disk_read_iops_sec_max\u0027: 2 * units.Ki,"},{"line_number":175,"context_line":"            \u0027quota:disk_write_bytes_sec_max\u0027: 25 * units.Mi,"},{"line_number":176,"context_line":"            \u0027quota:disk_write_iops_sec_max\u0027: 3 * units.Ki,"},{"line_number":177,"context_line":"            \u0027quota:disk_total_bytes_sec_max\u0027: 40 * units.Mi,"},{"line_number":178,"context_line":"            \u0027quota:disk_total_iops_sec_max\u0027: 4 * units.Ki,"},{"line_number":179,"context_line":"            \u0027quota:disk_size_iops_sec\u0027: 16,"},{"line_number":180,"context_line":"        }"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_f6597efc","line":178,"range":{"start_line":177,"start_character":12,"end_line":178,"end_character":58},"in_reply_to":"5f7c97a3_17fbeabd","updated":"2018-06-12 14:02:05.000000000","message":"A note will be added to this effect in the new doc page that will be written for Cinder","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"860f94d5d92850a6b33ee9295d05120470175cf2","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            \u0027quota:disk_read_iops_sec_max\u0027: 2 * units.Ki,"},{"line_number":175,"context_line":"            \u0027quota:disk_write_bytes_sec_max\u0027: 25 * units.Mi,"},{"line_number":176,"context_line":"            \u0027quota:disk_write_iops_sec_max\u0027: 3 * units.Ki,"},{"line_number":177,"context_line":"            \u0027quota:disk_total_bytes_sec_max\u0027: 40 * units.Mi,"},{"line_number":178,"context_line":"            \u0027quota:disk_total_iops_sec_max\u0027: 4 * units.Ki,"},{"line_number":179,"context_line":"            \u0027quota:disk_size_iops_sec\u0027: 16,"},{"line_number":180,"context_line":"        }"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_616a8681","line":178,"range":{"start_line":177,"start_character":12,"end_line":178,"end_character":58},"in_reply_to":"5f7c97a3_f6597efc","updated":"2018-06-12 14:33:16.000000000","message":"Sure, that\u0027s fine, I just want to see it in the docs.","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a75065baed1722de4a7d424c0206fba13b16a4eb","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            \u0027quota:disk_write_iops_sec\u0027: 2 * units.Ki,"},{"line_number":171,"context_line":"            \u0027quota:disk_total_bytes_sec\u0027: 30 * units.Mi,"},{"line_number":172,"context_line":"            \u0027quota:disk_total_iops_sec\u0027: 3 * units.Ki,"},{"line_number":173,"context_line":"            \u0027quota:disk_read_bytes_sec_max\u0027: 15 * units.Mi,"},{"line_number":174,"context_line":"            \u0027quota:disk_read_iops_sec_max\u0027: 2 * units.Ki,"},{"line_number":175,"context_line":"            \u0027quota:disk_write_bytes_sec_max\u0027: 25 * units.Mi,"},{"line_number":176,"context_line":"            \u0027quota:disk_write_iops_sec_max\u0027: 3 * units.Ki,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_21a24eaf","line":173,"updated":"2018-06-12 14:38:35.000000000","message":"If you removed the imagebackend libvirt_info changes, why are these still here?","commit_id":"661bd2230b91c8072b4e72d69457ff02114baf9d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"433f01ed8404070d22ef12bc5a597f9bbb383a8e","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            \u0027quota:disk_write_iops_sec\u0027: 2 * units.Ki,"},{"line_number":171,"context_line":"            \u0027quota:disk_total_bytes_sec\u0027: 30 * units.Mi,"},{"line_number":172,"context_line":"            \u0027quota:disk_total_iops_sec\u0027: 3 * units.Ki,"},{"line_number":173,"context_line":"            \u0027quota:disk_read_bytes_sec_max\u0027: 15 * units.Mi,"},{"line_number":174,"context_line":"            \u0027quota:disk_read_iops_sec_max\u0027: 2 * units.Ki,"},{"line_number":175,"context_line":"            \u0027quota:disk_write_bytes_sec_max\u0027: 25 * units.Mi,"},{"line_number":176,"context_line":"            \u0027quota:disk_write_iops_sec_max\u0027: 3 * units.Ki,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_010e328b","line":173,"in_reply_to":"5f7c97a3_21a24eaf","updated":"2018-06-13 03:20:17.000000000","message":"Jet-lag :)","commit_id":"661bd2230b91c8072b4e72d69457ff02114baf9d"}],"nova/tests/unit/virt/libvirt/volume/test_volume.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"90566e19f31bc9c22d9724dd54ba2964ca3e8fac","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                        \u0027read_iops_sec_max\u0027: \u00272000\u0027,"},{"line_number":125,"context_line":"                        \u0027write_bytes_sec_max\u0027: \u0027250000\u0027,"},{"line_number":126,"context_line":"                        \u0027write_iops_sec_max\u0027: \u00273000\u0027,"},{"line_number":127,"context_line":"                        \u0027total_bytes_sec_max\u0027: \u0027400000\u0027,"},{"line_number":128,"context_line":"                        \u0027total_iops_sec_max\u0027: \u00274000\u0027,"},{"line_number":129,"context_line":"                        \u0027size_iops_sec\u0027: \u002716\u0027,"},{"line_number":130,"context_line":"                        }"},{"line_number":131,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_3721464e","line":128,"range":{"start_line":127,"start_character":24,"end_line":128,"end_character":53},"updated":"2018-06-11 21:02:34.000000000","message":"again, apparently not something that can be specified along with read/write max values.","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"860f94d5d92850a6b33ee9295d05120470175cf2","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                        \u0027read_iops_sec_max\u0027: \u00272000\u0027,"},{"line_number":125,"context_line":"                        \u0027write_bytes_sec_max\u0027: \u0027250000\u0027,"},{"line_number":126,"context_line":"                        \u0027write_iops_sec_max\u0027: \u00273000\u0027,"},{"line_number":127,"context_line":"                        \u0027total_bytes_sec_max\u0027: \u0027400000\u0027,"},{"line_number":128,"context_line":"                        \u0027total_iops_sec_max\u0027: \u00274000\u0027,"},{"line_number":129,"context_line":"                        \u0027size_iops_sec\u0027: \u002716\u0027,"},{"line_number":130,"context_line":"                        }"},{"line_number":131,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_a1f97ec8","line":128,"range":{"start_line":127,"start_character":24,"end_line":128,"end_character":53},"in_reply_to":"5f7c97a3_16067acf","updated":"2018-06-12 14:33:16.000000000","message":"It would probably be good to add a comment noting that the total values are in here for illustration purposes but can\u0027t actually be used with the read/write values for the same category (iops or bytes).","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"9f2b34e1168461a1c1f790b26b839675f80cc1db","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                        \u0027read_iops_sec_max\u0027: \u00272000\u0027,"},{"line_number":125,"context_line":"                        \u0027write_bytes_sec_max\u0027: \u0027250000\u0027,"},{"line_number":126,"context_line":"                        \u0027write_iops_sec_max\u0027: \u00273000\u0027,"},{"line_number":127,"context_line":"                        \u0027total_bytes_sec_max\u0027: \u0027400000\u0027,"},{"line_number":128,"context_line":"                        \u0027total_iops_sec_max\u0027: \u00274000\u0027,"},{"line_number":129,"context_line":"                        \u0027size_iops_sec\u0027: \u002716\u0027,"},{"line_number":130,"context_line":"                        }"},{"line_number":131,"context_line":"                }"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_16067acf","line":128,"range":{"start_line":127,"start_character":24,"end_line":128,"end_character":53},"in_reply_to":"5f7c97a3_3721464e","updated":"2018-06-12 14:02:05.000000000","message":"Will be documented and as you say this is just a test so are you OK with leaving these in to show they are available if anyone looks at the test?","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a75065baed1722de4a7d424c0206fba13b16a4eb","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    \u0027qos_specs\u0027: {"},{"line_number":121,"context_line":"                        \u0027total_bytes_sec\u0027: \u0027102400\u0027,"},{"line_number":122,"context_line":"                        \u0027read_iops_sec\u0027: \u0027200\u0027,"},{"line_number":123,"context_line":"                        \u0027read_bytes_sec_max\u0027: \u0027150000\u0027,"},{"line_number":124,"context_line":"                        \u0027read_iops_sec_max\u0027: \u00272000\u0027,"},{"line_number":125,"context_line":"                        \u0027write_bytes_sec_max\u0027: \u0027250000\u0027,"},{"line_number":126,"context_line":"                        \u0027write_iops_sec_max\u0027: \u00273000\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_619b6672","line":123,"updated":"2018-06-12 14:38:35.000000000","message":"Please add a note that the total iops/bytes values here are for illustration purposes, but the total values can\u0027t actually be used in conjunction with the read/write values.","commit_id":"661bd2230b91c8072b4e72d69457ff02114baf9d"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"433f01ed8404070d22ef12bc5a597f9bbb383a8e","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                    \u0027qos_specs\u0027: {"},{"line_number":121,"context_line":"                        \u0027total_bytes_sec\u0027: \u0027102400\u0027,"},{"line_number":122,"context_line":"                        \u0027read_iops_sec\u0027: \u0027200\u0027,"},{"line_number":123,"context_line":"                        \u0027read_bytes_sec_max\u0027: \u0027150000\u0027,"},{"line_number":124,"context_line":"                        \u0027read_iops_sec_max\u0027: \u00272000\u0027,"},{"line_number":125,"context_line":"                        \u0027write_bytes_sec_max\u0027: \u0027250000\u0027,"},{"line_number":126,"context_line":"                        \u0027write_iops_sec_max\u0027: \u00273000\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_3c51150f","line":123,"in_reply_to":"5f7c97a3_619b6672","updated":"2018-06-13 03:20:17.000000000","message":"Done","commit_id":"661bd2230b91c8072b4e72d69457ff02114baf9d"}],"nova/virt/libvirt/imagebackend.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"90566e19f31bc9c22d9724dd54ba2964ca3e8fac","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            # specified."},{"line_number":165,"context_line":"            info.device_addr.unit \u003d disk_unit"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def disk_qos(self, info, extra_specs):"},{"line_number":168,"context_line":"        tune_items \u003d [\u0027disk_read_bytes_sec\u0027, \u0027disk_read_iops_sec\u0027,"},{"line_number":169,"context_line":"            \u0027disk_write_bytes_sec\u0027, \u0027disk_write_iops_sec\u0027,"},{"line_number":170,"context_line":"            \u0027disk_total_bytes_sec\u0027, \u0027disk_total_iops_sec\u0027,"},{"line_number":171,"context_line":"            \u0027disk_read_bytes_sec_max\u0027, \u0027disk_read_iops_sec_max\u0027,"},{"line_number":172,"context_line":"            \u0027disk_write_bytes_sec_max\u0027, \u0027disk_write_iops_sec_max\u0027,"},{"line_number":173,"context_line":"            \u0027disk_total_bytes_sec_max\u0027, \u0027disk_total_iops_sec_max\u0027,"},{"line_number":174,"context_line":"            \u0027disk_size_iops_sec\u0027]"},{"line_number":175,"context_line":"        for key, value in extra_specs.items():"},{"line_number":176,"context_line":"            scope \u003d key.split(\u0027:\u0027)"},{"line_number":177,"context_line":"            if len(scope) \u003e 1 and scope[0] \u003d\u003d \u0027quota\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_f7c42e62","line":174,"range":{"start_line":167,"start_character":3,"end_line":174,"end_character":33},"updated":"2018-06-11 21:02:34.000000000","message":"These are flavor extra specs, so they should be documented in the admin guide for flavor extra specs:\n\nhttps://docs.openstack.org/nova/latest/user/flavors.html\n\nSee the \"Disk tuning\" section.","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"9f2b34e1168461a1c1f790b26b839675f80cc1db","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            # specified."},{"line_number":165,"context_line":"            info.device_addr.unit \u003d disk_unit"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def disk_qos(self, info, extra_specs):"},{"line_number":168,"context_line":"        tune_items \u003d [\u0027disk_read_bytes_sec\u0027, \u0027disk_read_iops_sec\u0027,"},{"line_number":169,"context_line":"            \u0027disk_write_bytes_sec\u0027, \u0027disk_write_iops_sec\u0027,"},{"line_number":170,"context_line":"            \u0027disk_total_bytes_sec\u0027, \u0027disk_total_iops_sec\u0027,"},{"line_number":171,"context_line":"            \u0027disk_read_bytes_sec_max\u0027, \u0027disk_read_iops_sec_max\u0027,"},{"line_number":172,"context_line":"            \u0027disk_write_bytes_sec_max\u0027, \u0027disk_write_iops_sec_max\u0027,"},{"line_number":173,"context_line":"            \u0027disk_total_bytes_sec_max\u0027, \u0027disk_total_iops_sec_max\u0027,"},{"line_number":174,"context_line":"            \u0027disk_size_iops_sec\u0027]"},{"line_number":175,"context_line":"        for key, value in extra_specs.items():"},{"line_number":176,"context_line":"            scope \u003d key.split(\u0027:\u0027)"},{"line_number":177,"context_line":"            if len(scope) \u003e 1 and scope[0] \u003d\u003d \u0027quota\u0027:"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_d6aec27f","line":174,"range":{"start_line":167,"start_character":3,"end_line":174,"end_character":33},"in_reply_to":"5f7c97a3_f7c42e62","updated":"2018-06-12 14:02:05.000000000","message":"Oops. You are correct. These are for local disk tuning, not external disk tuning. I will remove this change.","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"}],"nova/virt/libvirt/volume/volume.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"90566e19f31bc9c22d9724dd54ba2964ca3e8fac","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            tune_opts \u003d [\u0027total_bytes_sec\u0027, \u0027read_bytes_sec\u0027,"},{"line_number":65,"context_line":"                         \u0027write_bytes_sec\u0027, \u0027total_iops_sec\u0027,"},{"line_number":66,"context_line":"                         \u0027read_iops_sec\u0027, \u0027write_iops_sec\u0027,"},{"line_number":67,"context_line":"                         \u0027read_bytes_sec_max\u0027, \u0027read_iops_sec_max\u0027,"},{"line_number":68,"context_line":"                         \u0027write_bytes_sec_max\u0027, \u0027write_iops_sec_max\u0027,"},{"line_number":69,"context_line":"                         \u0027total_bytes_sec_max\u0027, \u0027total_iops_sec_max\u0027,"},{"line_number":70,"context_line":"                         \u0027size_iops_sec\u0027]"},{"line_number":71,"context_line":"            specs \u003d data[\u0027qos_specs\u0027]"},{"line_number":72,"context_line":"            if isinstance(specs, dict):"},{"line_number":73,"context_line":"                for k, v in specs.items():"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_77e25ed6","line":70,"range":{"start_line":67,"start_character":25,"end_line":70,"end_character":40},"updated":"2018-06-11 21:02:34.000000000","message":"These need to be documented in Cinder:\n\nhttps://docs.openstack.org/cinder/latest/admin/blockstorage-capacity-based-qos.html\n\nAlso, it looks like Cinder hard-codes these, so you must also have a corresponding dependent change to Cinder:\n\nhttps://github.com/openstack/cinder/blob/ad5f301d296ff57b98734261da809a117b72b340/cinder/volume/manager.py#L1599\n\nThe unfortunate thing about this is this is basically a non-discoverable API change but because the qos_specs are stashed down in the attachment\u0027s connection_info, which is itself unversioned and not validated by any kind of schema, this is all best effort - you must have the right version of cinder and nova to get this to all work, and use the correct virt driver. Anyway, documentation will need to note these driver and virt-specific limitations.","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"9f2b34e1168461a1c1f790b26b839675f80cc1db","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            tune_opts \u003d [\u0027total_bytes_sec\u0027, \u0027read_bytes_sec\u0027,"},{"line_number":65,"context_line":"                         \u0027write_bytes_sec\u0027, \u0027total_iops_sec\u0027,"},{"line_number":66,"context_line":"                         \u0027read_iops_sec\u0027, \u0027write_iops_sec\u0027,"},{"line_number":67,"context_line":"                         \u0027read_bytes_sec_max\u0027, \u0027read_iops_sec_max\u0027,"},{"line_number":68,"context_line":"                         \u0027write_bytes_sec_max\u0027, \u0027write_iops_sec_max\u0027,"},{"line_number":69,"context_line":"                         \u0027total_bytes_sec_max\u0027, \u0027total_iops_sec_max\u0027,"},{"line_number":70,"context_line":"                         \u0027size_iops_sec\u0027]"},{"line_number":71,"context_line":"            specs \u003d data[\u0027qos_specs\u0027]"},{"line_number":72,"context_line":"            if isinstance(specs, dict):"},{"line_number":73,"context_line":"                for k, v in specs.items():"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_b679c62f","line":70,"range":{"start_line":67,"start_character":25,"end_line":70,"end_character":40},"in_reply_to":"5f7c97a3_10de8210","updated":"2018-06-12 14:02:05.000000000","message":"As above","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e2a55ea4941b0afe411573bee0b8d25919af01eb","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            tune_opts \u003d [\u0027total_bytes_sec\u0027, \u0027read_bytes_sec\u0027,"},{"line_number":65,"context_line":"                         \u0027write_bytes_sec\u0027, \u0027total_iops_sec\u0027,"},{"line_number":66,"context_line":"                         \u0027read_iops_sec\u0027, \u0027write_iops_sec\u0027,"},{"line_number":67,"context_line":"                         \u0027read_bytes_sec_max\u0027, \u0027read_iops_sec_max\u0027,"},{"line_number":68,"context_line":"                         \u0027write_bytes_sec_max\u0027, \u0027write_iops_sec_max\u0027,"},{"line_number":69,"context_line":"                         \u0027total_bytes_sec_max\u0027, \u0027total_iops_sec_max\u0027,"},{"line_number":70,"context_line":"                         \u0027size_iops_sec\u0027]"},{"line_number":71,"context_line":"            specs \u003d data[\u0027qos_specs\u0027]"},{"line_number":72,"context_line":"            if isinstance(specs, dict):"},{"line_number":73,"context_line":"                for k, v in specs.items():"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_10de8210","line":70,"range":{"start_line":67,"start_character":25,"end_line":70,"end_character":40},"in_reply_to":"5f7c97a3_77e25ed6","updated":"2018-06-12 12:53:20.000000000","message":"\u003e Also, it looks like Cinder hard-codes these, so you must also have a corresponding dependent change to Cinder:\n\nI guess those are just the _per_gb specific ones, so we should be OK with the new support you\u0027re adding. But I\u0027d still like to see the Cinder docs patch started before we approve this nova change.","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"9f2b34e1168461a1c1f790b26b839675f80cc1db","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            tune_opts \u003d [\u0027total_bytes_sec\u0027, \u0027read_bytes_sec\u0027,"},{"line_number":65,"context_line":"                         \u0027write_bytes_sec\u0027, \u0027total_iops_sec\u0027,"},{"line_number":66,"context_line":"                         \u0027read_iops_sec\u0027, \u0027write_iops_sec\u0027,"},{"line_number":67,"context_line":"                         \u0027read_bytes_sec_max\u0027, \u0027read_iops_sec_max\u0027,"},{"line_number":68,"context_line":"                         \u0027write_bytes_sec_max\u0027, \u0027write_iops_sec_max\u0027,"},{"line_number":69,"context_line":"                         \u0027total_bytes_sec_max\u0027, \u0027total_iops_sec_max\u0027,"},{"line_number":70,"context_line":"                         \u0027size_iops_sec\u0027]"},{"line_number":71,"context_line":"            specs \u003d data[\u0027qos_specs\u0027]"},{"line_number":72,"context_line":"            if isinstance(specs, dict):"},{"line_number":73,"context_line":"                for k, v in specs.items():"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f7c97a3_967e0a17","line":70,"range":{"start_line":67,"start_character":25,"end_line":70,"end_character":40},"in_reply_to":"5f7c97a3_77e25ed6","updated":"2018-06-12 14:02:05.000000000","message":"You are seeing the capacity based QoS values here used by SDS solutions such as Ceph. I\u0027m adding to external disk QoS which doesn\u0027t have documentation. I\u0027ll add this to the docs when this is merged.","commit_id":"764b489b169d11ddc3b4d25ae1778d38f2aa6310"}],"releasenotes/notes/enhanced-kvm-storage-qos-f8f67d404949c0b0.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"add0044653701f33acc04058443dae0a3fde8e03","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 KVM driver now supports additional Cinder front-end"},{"line_number":5,"context_line":"    QoS specs, allowing the specification of additional IO"},{"line_number":6,"context_line":"    burst limits applied for each attached disk, individually."},{"line_number":7,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5f7c97a3_7605fc13","line":4,"range":{"start_line":4,"start_character":8,"end_line":4,"end_character":11},"updated":"2018-06-05 22:49:43.000000000","message":"libvirt","commit_id":"fadaeeecccb330cdd46eee03b5ff3fd5a89cc5b0"},{"author":{"_account_id":13425,"name":"Simon Dodsley","email":"simon@everpuredata.com","username":"sdodsley"},"change_message_id":"598d94eb9892faf023e80f070b914c9e9e3186d9","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 KVM driver now supports additional Cinder front-end"},{"line_number":5,"context_line":"    QoS specs, allowing the specification of additional IO"},{"line_number":6,"context_line":"    burst limits applied for each attached disk, individually."},{"line_number":7,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":2,"id":"5f7c97a3_74be1d00","line":4,"range":{"start_line":4,"start_character":8,"end_line":4,"end_character":11},"in_reply_to":"5f7c97a3_7605fc13","updated":"2018-06-07 19:24:07.000000000","message":"fixed","commit_id":"fadaeeecccb330cdd46eee03b5ff3fd5a89cc5b0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a75065baed1722de4a7d424c0206fba13b16a4eb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"5f7c97a3_0184f209","line":15,"updated":"2018-06-12 14:38:35.000000000","message":"I\u0027d like to see this link to the cinder docs on these for further details, so we should make this dependent on the cinder docs change.","commit_id":"661bd2230b91c8072b4e72d69457ff02114baf9d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d1032e5102b40aa04160350155af6affedb8471b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"5f7c97a3_7e93f7a3","line":15,"updated":"2018-06-12 22:59:35.000000000","message":"We should add:\n\nFor more information, see the Cinder admin guide:\n\nhttps://docs.openstack.org/cinder/latest/admin/blockstorage-basic-volume-qos.html","commit_id":"da2ca5ec775bf608d154925d4cc5ed38f9cb11de"}]}
