)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"164924a025897384dc64cdf7199127ee62cf6ee8","unresolved":false,"context_lines":[{"line_number":11,"context_line":"migration of large VMs to ever complete. Rather than trying to"},{"line_number":12,"context_line":"invent a new policy for changing downtime in OpenStack, copy"},{"line_number":13,"context_line":"the existing logic that is successfully battle tested by the"},{"line_number":14,"context_line":"oVirt project in VDSM."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Note that setting the downtime step delay based on guest RAM size"},{"line_number":17,"context_line":"is an inexact science, as RAM size is only one factor influencing"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"7a016987_eb520c12","line":14,"updated":"2015-05-25 11:27:16.000000000","message":"That logic looks really interesting and should improve the migration.\n\nQemu verify if the last amount of data we still have to transfer can be done in less than max_downtime (default to 30seconds) before to move in the next step. So by starting with something small if the bandwidth is good we can clearly reduce the downtime.","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b7e5a84a502c07347c8be7386b73fbed6779b554","unresolved":false,"context_lines":[{"line_number":6196,"context_line":"            if len(time_records) \u003e 0:"},{"line_number":6197,"context_line":"                return time_records[0]"},{"line_number":6198,"context_line":"            else:"},{"line_number":6199,"context_line":"                return 1431968772"},{"line_number":6200,"context_line":""},{"line_number":6201,"context_line":"        mock_job_info.side_effect \u003d fake_job_info"},{"line_number":6202,"context_line":"        mock_time.side_effect \u003d fake_time"}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_5111fc5b","line":6199,"updated":"2015-06-10 15:45:45.000000000","message":"Can you document what this magic number is, or calculate it so that it\u0027s easier to understand?\n\nEven if you did this it would be easier to understand:\n\n return int(datetime.datetime(1955, 11, 5, 11, 2, 00).strftime(\u0027%s\u0027))","commit_id":"c7e3fe94d9832504765174545d1aa5ad9f86db43"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"beb3c2ad33f80e15a88d4d6098d5337758ab39e8","unresolved":false,"context_lines":[{"line_number":6196,"context_line":"            if len(time_records) \u003e 0:"},{"line_number":6197,"context_line":"                return time_records[0]"},{"line_number":6198,"context_line":"            else:"},{"line_number":6199,"context_line":"                return 1431968772"},{"line_number":6200,"context_line":""},{"line_number":6201,"context_line":"        mock_job_info.side_effect \u003d fake_job_info"},{"line_number":6202,"context_line":"        mock_time.side_effect \u003d fake_time"}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_947c02ed","line":6199,"in_reply_to":"3afb71cf_5111fc5b","updated":"2015-06-10 15:49:57.000000000","message":"Yeah, its not really magic - its just completely arbitrary really, so we can return some fixed time value here.","commit_id":"c7e3fe94d9832504765174545d1aa5ad9f86db43"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"fcb751e50e02b6771ccd6223b7ae4d888cc5cd9e","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    cfg.IntOpt(\u0027live_migration_downtime_delay\u0027,"},{"line_number":169,"context_line":"               default\u003d75,"},{"line_number":170,"context_line":"               help\u003d\u0027Time to wait, in seconds, between each step increase \u0027"},{"line_number":171,"context_line":"                    \u0027of the migration downtime. Value is per GiB of guest \u0027"},{"line_number":172,"context_line":"                    \u0027RAM, with lower bound of a minimum of 2 GiB\u0027),"},{"line_number":173,"context_line":"    cfg.StrOpt(\u0027snapshot_image_format\u0027,"},{"line_number":174,"context_line":"               help\u003d\u0027Snapshot image format (valid options are : \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_f8e36ba2","line":171,"updated":"2015-05-19 19:43:11.000000000","message":"not sure it makes sense for this to be scaled by guest size.  Rate of dirtying of memory doesn\u0027t necessarily scale with size of guest but rather with pattern of activity.","commit_id":"bb322b6eb8ad257d0203d3dcad2183ac8cee6db1"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"c9c4099dda00e68332b869f0b54868c368556e85","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    cfg.IntOpt(\u0027live_migration_downtime_delay\u0027,"},{"line_number":169,"context_line":"               default\u003d75,"},{"line_number":170,"context_line":"               help\u003d\u0027Time to wait, in seconds, between each step increase \u0027"},{"line_number":171,"context_line":"                    \u0027of the migration downtime. Value is per GiB of guest \u0027"},{"line_number":172,"context_line":"                    \u0027RAM, with lower bound of a minimum of 2 GiB\u0027),"},{"line_number":173,"context_line":"    cfg.StrOpt(\u0027snapshot_image_format\u0027,"},{"line_number":174,"context_line":"               help\u003d\u0027Snapshot image format (valid options are : \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_ba283d34","line":171,"in_reply_to":"7a016987_f8e36ba2","updated":"2015-05-20 09:20:43.000000000","message":"This isn\u0027t an exact science, but the available bandwidth of the network has an impact here as it limits how much data we can transfer in a given time. Small guests which dirty data quickly are easier to migrate with small downtime, because the network can still keep up with the data sizes. As RAM gets larger, it is increasingly hard for the network to keep up with a guest that is dirtying a % of its RAM quickly. As noted in the commit message, this approach to configuration has been proved useful/usable in the real world by the oVirt application. So I\u0027ll prefer this approach over inventing something different in OpenStack which we\u0027ll have no real world evidence to backup.\n\nAlso, I expect we\u0027ll revisit migration tuning in the future, after this ability has been deployed in the field and we get further user/operator feedback as to what they feel they need beyond this.","commit_id":"bb322b6eb8ad257d0203d3dcad2183ac8cee6db1"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"fcb751e50e02b6771ccd6223b7ae4d888cc5cd9e","unresolved":false,"context_lines":[{"line_number":169,"context_line":"               default\u003d75,"},{"line_number":170,"context_line":"               help\u003d\u0027Time to wait, in seconds, between each step increase \u0027"},{"line_number":171,"context_line":"                    \u0027of the migration downtime. Value is per GiB of guest \u0027"},{"line_number":172,"context_line":"                    \u0027RAM, with lower bound of a minimum of 2 GiB\u0027),"},{"line_number":173,"context_line":"    cfg.StrOpt(\u0027snapshot_image_format\u0027,"},{"line_number":174,"context_line":"               help\u003d\u0027Snapshot image format (valid options are : \u0027"},{"line_number":175,"context_line":"                    \u0027raw, qcow2, vmdk, vdi). \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_1889a7c9","line":172,"updated":"2015-05-19 19:43:11.000000000","message":"add the minimum of 10 sec to the help?","commit_id":"bb322b6eb8ad257d0203d3dcad2183ac8cee6db1"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"c9c4099dda00e68332b869f0b54868c368556e85","unresolved":false,"context_lines":[{"line_number":169,"context_line":"               default\u003d75,"},{"line_number":170,"context_line":"               help\u003d\u0027Time to wait, in seconds, between each step increase \u0027"},{"line_number":171,"context_line":"                    \u0027of the migration downtime. Value is per GiB of guest \u0027"},{"line_number":172,"context_line":"                    \u0027RAM, with lower bound of a minimum of 2 GiB\u0027),"},{"line_number":173,"context_line":"    cfg.StrOpt(\u0027snapshot_image_format\u0027,"},{"line_number":174,"context_line":"               help\u003d\u0027Snapshot image format (valid options are : \u0027"},{"line_number":175,"context_line":"                    \u0027raw, qcow2, vmdk, vdi). \u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_fad91558","line":172,"in_reply_to":"7a016987_1889a7c9","updated":"2015-05-20 09:20:43.000000000","message":"Yep","commit_id":"bb322b6eb8ad257d0203d3dcad2183ac8cee6db1"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"fcb751e50e02b6771ccd6223b7ae4d888cc5cd9e","unresolved":false,"context_lines":[{"line_number":5534,"context_line":"        LOG.debug(\"Migration operation thread has finished\","},{"line_number":5535,"context_line":"                  instance\u003dinstance)"},{"line_number":5536,"context_line":""},{"line_number":5537,"context_line":"    @staticmethod"},{"line_number":5538,"context_line":"    def _migration_downtime_steps(ram_gb):"},{"line_number":5539,"context_line":"        downtime \u003d CONF.libvirt.live_migration_downtime"},{"line_number":5540,"context_line":"        steps \u003d CONF.libvirt.live_migration_downtime_steps"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_786bfbf1","line":5537,"updated":"2015-05-19 19:43:11.000000000","message":"result of calculations below not obvious at first glance...maybe a comment?","commit_id":"bb322b6eb8ad257d0203d3dcad2183ac8cee6db1"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"7314ada53e10a20b8f6f795cffa637f59ace6f56","unresolved":false,"context_lines":[{"line_number":5534,"context_line":"        LOG.debug(\"Migration operation thread has finished\","},{"line_number":5535,"context_line":"                  instance\u003dinstance)"},{"line_number":5536,"context_line":""},{"line_number":5537,"context_line":"    @staticmethod"},{"line_number":5538,"context_line":"    def _migration_downtime_steps(ram_gb):"},{"line_number":5539,"context_line":"        downtime \u003d CONF.libvirt.live_migration_downtime"},{"line_number":5540,"context_line":"        steps \u003d CONF.libvirt.live_migration_downtime_steps"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_5a74a934","line":5537,"in_reply_to":"7a016987_3ac32d59","updated":"2015-05-20 09:22:03.000000000","message":"BTW look at the added test_live_migration_downtime_steps for example data it calculates","commit_id":"bb322b6eb8ad257d0203d3dcad2183ac8cee6db1"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"c9c4099dda00e68332b869f0b54868c368556e85","unresolved":false,"context_lines":[{"line_number":5534,"context_line":"        LOG.debug(\"Migration operation thread has finished\","},{"line_number":5535,"context_line":"                  instance\u003dinstance)"},{"line_number":5536,"context_line":""},{"line_number":5537,"context_line":"    @staticmethod"},{"line_number":5538,"context_line":"    def _migration_downtime_steps(ram_gb):"},{"line_number":5539,"context_line":"        downtime \u003d CONF.libvirt.live_migration_downtime"},{"line_number":5540,"context_line":"        steps \u003d CONF.libvirt.live_migration_downtime_steps"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a016987_3ac32d59","line":5537,"in_reply_to":"7a016987_786bfbf1","updated":"2015-05-20 09:20:43.000000000","message":"It is approximately calculating an exponential backoff. eg the downtime is initially increased by only a small amount, and as time goes on, we do increasingly large jumps in downtime.","commit_id":"bb322b6eb8ad257d0203d3dcad2183ac8cee6db1"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"164924a025897384dc64cdf7199127ee62cf6ee8","unresolved":false,"context_lines":[{"line_number":157,"context_line":"               default\u003d0,"},{"line_number":158,"context_line":"               help\u003d\u0027Maximum bandwidth to be used during migration, in Mbps\u0027),"},{"line_number":159,"context_line":"    cfg.IntOpt(\u0027live_migration_downtime\u0027,"},{"line_number":160,"context_line":"               default\u003d500,"},{"line_number":161,"context_line":"               help\u003d\u0027Maximum permitted downtime, in milliseconds, for live \u0027"},{"line_number":162,"context_line":"                    \u0027migration switchover. Minimum of 100ms is required. \u0027"},{"line_number":163,"context_line":"                    \u0027Use a large value if guest liveness is unimportant.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_6b661cee","line":160,"updated":"2015-05-25 11:27:16.000000000","message":"Don\u0027t we have to add a timeout ? the default value from Qemu is 30s which can probably handle all situations. What about if bandwidth is not enough and so we need more than 500ms.","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"762866fdb67945ff8ccec18b537e2f02e8c342c9","unresolved":false,"context_lines":[{"line_number":157,"context_line":"               default\u003d0,"},{"line_number":158,"context_line":"               help\u003d\u0027Maximum bandwidth to be used during migration, in Mbps\u0027),"},{"line_number":159,"context_line":"    cfg.IntOpt(\u0027live_migration_downtime\u0027,"},{"line_number":160,"context_line":"               default\u003d500,"},{"line_number":161,"context_line":"               help\u003d\u0027Maximum permitted downtime, in milliseconds, for live \u0027"},{"line_number":162,"context_line":"                    \u0027migration switchover. Minimum of 100ms is required. \u0027"},{"line_number":163,"context_line":"                    \u0027Use a large value if guest liveness is unimportant.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_5ae32506","line":160,"in_reply_to":"7a016987_09a68d53","updated":"2015-05-25 16:40:11.000000000","message":"My mistake. even that, don\u0027t we have to handle when we are not able to finish the migration?","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"e48c695c9ae7e32f9724d2965741af7c1e66fafb","unresolved":false,"context_lines":[{"line_number":157,"context_line":"               default\u003d0,"},{"line_number":158,"context_line":"               help\u003d\u0027Maximum bandwidth to be used during migration, in Mbps\u0027),"},{"line_number":159,"context_line":"    cfg.IntOpt(\u0027live_migration_downtime\u0027,"},{"line_number":160,"context_line":"               default\u003d500,"},{"line_number":161,"context_line":"               help\u003d\u0027Maximum permitted downtime, in milliseconds, for live \u0027"},{"line_number":162,"context_line":"                    \u0027migration switchover. Minimum of 100ms is required. \u0027"},{"line_number":163,"context_line":"                    \u0027Use a large value if guest liveness is unimportant.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_55c0967c","line":160,"in_reply_to":"7a016987_5ae32506","updated":"2015-05-25 17:34:00.000000000","message":"The overall timeout is in the dependent patch.","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"9f062e4cc82031e989212a140a02048b2f121681","unresolved":false,"context_lines":[{"line_number":157,"context_line":"               default\u003d0,"},{"line_number":158,"context_line":"               help\u003d\u0027Maximum bandwidth to be used during migration, in Mbps\u0027),"},{"line_number":159,"context_line":"    cfg.IntOpt(\u0027live_migration_downtime\u0027,"},{"line_number":160,"context_line":"               default\u003d500,"},{"line_number":161,"context_line":"               help\u003d\u0027Maximum permitted downtime, in milliseconds, for live \u0027"},{"line_number":162,"context_line":"                    \u0027migration switchover. Minimum of 100ms is required. \u0027"},{"line_number":163,"context_line":"                    \u0027Use a large value if guest liveness is unimportant.\u0027),"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_09a68d53","line":160,"in_reply_to":"7a016987_6b661cee","updated":"2015-05-25 15:03:00.000000000","message":"I think the qemu default is actually 300ms.  (max_downtime \u003d 300000000 in migration.c, with units of nanoseconds)","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"002f1791e297ccb76773d4b37f447cff6bde4a79","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    cfg.IntOpt(\u0027live_migration_downtime\u0027,"},{"line_number":160,"context_line":"               default\u003d500,"},{"line_number":161,"context_line":"               help\u003d\u0027Maximum permitted downtime, in milliseconds, for live \u0027"},{"line_number":162,"context_line":"                    \u0027migration switchover. Minimum of 100ms is required. \u0027"},{"line_number":163,"context_line":"                    \u0027Use a large value if guest liveness is unimportant.\u0027),"},{"line_number":164,"context_line":"    cfg.IntOpt(\u0027live_migration_downtime_steps\u0027,"},{"line_number":165,"context_line":"               default\u003d10,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_437d6eb0","line":162,"updated":"2015-05-26 11:25:37.000000000","message":"Wording Nit: \"required\" makes it sound like something the operator has to do, rather than something which nova just silently enforces. The next option uses \"will be rounded up to\", which is clearer IMO.","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"3b9a005856e00be2e94b66d65053c30eb3c75d18","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    cfg.IntOpt(\u0027live_migration_downtime\u0027,"},{"line_number":160,"context_line":"               default\u003d500,"},{"line_number":161,"context_line":"               help\u003d\u0027Maximum permitted downtime, in milliseconds, for live \u0027"},{"line_number":162,"context_line":"                    \u0027migration switchover. Minimum of 100ms is required. \u0027"},{"line_number":163,"context_line":"                    \u0027Use a large value if guest liveness is unimportant.\u0027),"},{"line_number":164,"context_line":"    cfg.IntOpt(\u0027live_migration_downtime_steps\u0027,"},{"line_number":165,"context_line":"               default\u003d10,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_8e738de7","line":162,"in_reply_to":"7a016987_437d6eb0","updated":"2015-05-26 11:33:30.000000000","message":"ok","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"002f1791e297ccb76773d4b37f447cff6bde4a79","unresolved":false,"context_lines":[{"line_number":5551,"context_line":"        max downtime is increased by small amounts, and as time goes"},{"line_number":5552,"context_line":"        by it is increased by ever larger amounts"},{"line_number":5553,"context_line":""},{"line_number":5554,"context_line":"        For example, for 10 steps, 30 seconds between steps and 400ms"},{"line_number":5555,"context_line":"        target maximum downtime, the steps will work out to"},{"line_number":5556,"context_line":""},{"line_number":5557,"context_line":"        -  90 seconds -\u003e set downtime to  41ms"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_0e867d65","line":5554,"updated":"2015-05-26 11:25:37.000000000","message":"90 seconds between steps?","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"3b9a005856e00be2e94b66d65053c30eb3c75d18","unresolved":false,"context_lines":[{"line_number":5551,"context_line":"        max downtime is increased by small amounts, and as time goes"},{"line_number":5552,"context_line":"        by it is increased by ever larger amounts"},{"line_number":5553,"context_line":""},{"line_number":5554,"context_line":"        For example, for 10 steps, 30 seconds between steps and 400ms"},{"line_number":5555,"context_line":"        target maximum downtime, the steps will work out to"},{"line_number":5556,"context_line":""},{"line_number":5557,"context_line":"        -  90 seconds -\u003e set downtime to  41ms"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_ae5d294a","line":5554,"in_reply_to":"7a016987_0e867d65","updated":"2015-05-26 11:33:30.000000000","message":"Opps, yes.","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"958723962f10f22dc26d5a3caf2dfd3d8b522811","unresolved":false,"context_lines":[{"line_number":5551,"context_line":"        max downtime is increased by small amounts, and as time goes"},{"line_number":5552,"context_line":"        by it is increased by ever larger amounts"},{"line_number":5553,"context_line":""},{"line_number":5554,"context_line":"        For example, for 10 steps, 30 seconds between steps and 400ms"},{"line_number":5555,"context_line":"        target maximum downtime, the steps will work out to"},{"line_number":5556,"context_line":""},{"line_number":5557,"context_line":"        -  90 seconds -\u003e set downtime to  41ms"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_e9979b38","line":5554,"in_reply_to":"7a016987_ae5d294a","updated":"2015-05-26 11:56:27.000000000","message":"That is why i have commented about the 3 gigs of memory i admitted the delay was calculated by 10 * ram_gb","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"164924a025897384dc64cdf7199127ee62cf6ee8","unresolved":false,"context_lines":[{"line_number":5552,"context_line":"        by it is increased by ever larger amounts"},{"line_number":5553,"context_line":""},{"line_number":5554,"context_line":"        For example, for 10 steps, 30 seconds between steps and 400ms"},{"line_number":5555,"context_line":"        target maximum downtime, the steps will work out to"},{"line_number":5556,"context_line":""},{"line_number":5557,"context_line":"        -  90 seconds -\u003e set downtime to  41ms"},{"line_number":5558,"context_line":"        - 180 seconds -\u003e set downtime to  41ms"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_50c30f38","line":5555,"updated":"2015-05-25 11:27:16.000000000","message":"and 3 gigs of memory","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":9420,"name":"Matthew Gilliard","email":"matthew.gilliard@hp.com","username":"gilliard"},"change_message_id":"002f1791e297ccb76773d4b37f447cff6bde4a79","unresolved":false,"context_lines":[{"line_number":5554,"context_line":"        For example, for 10 steps, 30 seconds between steps and 400ms"},{"line_number":5555,"context_line":"        target maximum downtime, the steps will work out to"},{"line_number":5556,"context_line":""},{"line_number":5557,"context_line":"        -  90 seconds -\u003e set downtime to  41ms"},{"line_number":5558,"context_line":"        - 180 seconds -\u003e set downtime to  41ms"},{"line_number":5559,"context_line":"        - 270 seconds -\u003e set downtime to  43ms"},{"line_number":5560,"context_line":"        - 360 seconds -\u003e set downtime to  47ms"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_0eed5d25","line":5557,"updated":"2015-05-26 11:25:37.000000000","message":"What\u0027s the timeout before this point? qemu default I guess, but could you make it explicit.","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"3b9a005856e00be2e94b66d65053c30eb3c75d18","unresolved":false,"context_lines":[{"line_number":5554,"context_line":"        For example, for 10 steps, 30 seconds between steps and 400ms"},{"line_number":5555,"context_line":"        target maximum downtime, the steps will work out to"},{"line_number":5556,"context_line":""},{"line_number":5557,"context_line":"        -  90 seconds -\u003e set downtime to  41ms"},{"line_number":5558,"context_line":"        - 180 seconds -\u003e set downtime to  41ms"},{"line_number":5559,"context_line":"        - 270 seconds -\u003e set downtime to  43ms"},{"line_number":5560,"context_line":"        - 360 seconds -\u003e set downtime to  47ms"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_8e5a6d4f","line":5557,"in_reply_to":"7a016987_0eed5d25","updated":"2015-05-26 11:33:30.000000000","message":"Yes,","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":7730,"name":"Sahid Orentino Ferdjaoui","email":"sahid.ferdjaoui@industrialdiscipline.com","username":"sahid"},"change_message_id":"164924a025897384dc64cdf7199127ee62cf6ee8","unresolved":false,"context_lines":[{"line_number":5589,"context_line":"    def _live_migration_monitor(self, context, instance, dest, post_method,"},{"line_number":5590,"context_line":"                                recover_method, block_migration,"},{"line_number":5591,"context_line":"                                migrate_data, dom, finish_event):"},{"line_number":5592,"context_line":"        ram_gb \u003d float(instance.flavor.memory_mb) / 1024"},{"line_number":5593,"context_line":"        if ram_gb \u003c 2:"},{"line_number":5594,"context_line":"            ram_gb \u003d 2"},{"line_number":5595,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"7a016987_85a14a96","line":5592,"updated":"2015-05-25 11:27:16.000000000","message":"nit: module units can be used here.","commit_id":"3fbe831915ada9a8932660eb8a424336f58a1bda"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b7e5a84a502c07347c8be7386b73fbed6779b554","unresolved":false,"context_lines":[{"line_number":5576,"context_line":"        steps \u003d CONF.libvirt.live_migration_downtime_steps"},{"line_number":5577,"context_line":"        delay \u003d CONF.libvirt.live_migration_downtime_delay"},{"line_number":5578,"context_line":""},{"line_number":5579,"context_line":"        if downtime \u003c 100:"},{"line_number":5580,"context_line":"            downtime \u003d 100"},{"line_number":5581,"context_line":"        if steps \u003c 3:"},{"line_number":5582,"context_line":"            steps \u003d 3"}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_54c9eaaa","line":5579,"updated":"2015-06-10 15:45:45.000000000","message":"Even though you document it in the config option, I think that a comment here about \"100ms minimum\" would be good, or even define that minimum as a constant and use it here and in the conf string.","commit_id":"c7e3fe94d9832504765174545d1aa5ad9f86db43"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b7e5a84a502c07347c8be7386b73fbed6779b554","unresolved":false,"context_lines":[{"line_number":5580,"context_line":"            downtime \u003d 100"},{"line_number":5581,"context_line":"        if steps \u003c 3:"},{"line_number":5582,"context_line":"            steps \u003d 3"},{"line_number":5583,"context_line":"        if delay \u003c 10:"},{"line_number":5584,"context_line":"            delay \u003d 10"},{"line_number":5585,"context_line":"        delay \u003d int(delay * ram_gb)"},{"line_number":5586,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3afb71cf_f4c21684","line":5583,"updated":"2015-06-10 15:45:45.000000000","message":"Same for these","commit_id":"c7e3fe94d9832504765174545d1aa5ad9f86db43"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"3905f29262123b3811fd9f1fec9de3ee95604535","unresolved":false,"context_lines":[{"line_number":5646,"context_line":"        if steps \u003c LIVE_MIGRATION_DOWNTIME_STEPS_MIN:"},{"line_number":5647,"context_line":"            steps \u003d LIVE_MIGRATION_DOWNTIME_STEPS_MIN"},{"line_number":5648,"context_line":"        if delay \u003c LIVE_MIGRATION_DOWNTIME_DELAY_MIN:"},{"line_number":5649,"context_line":"            delay \u003d LIVE_MIGRATION_DOWNTIME_DELAY_MIN"},{"line_number":5650,"context_line":"        delay \u003d int(delay * data_gb)"},{"line_number":5651,"context_line":""},{"line_number":5652,"context_line":"        offset \u003d downtime / float(steps + 1)"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_6c36e3e8","line":5649,"updated":"2015-08-11 06:50:08.000000000","message":"These are read strangely to me, I think I would have used min() instead. That said, totally a nit.","commit_id":"07c7e5caf2819d96809af1b9a19c046b9fd09851"},{"author":{"_account_id":2271,"name":"Michael Still","email":"mikal@stillhq.com","username":"mikalstill"},"change_message_id":"3905f29262123b3811fd9f1fec9de3ee95604535","unresolved":false,"context_lines":[{"line_number":5741,"context_line":"                # This is where we wire up calls to change live"},{"line_number":5742,"context_line":"                # migration status. eg change max downtime, cancel"},{"line_number":5743,"context_line":"                # the operation, change max bandwidth"},{"line_number":5744,"context_line":"                now \u003d time.time()"},{"line_number":5745,"context_line":"                elapsed \u003d now - start"},{"line_number":5746,"context_line":""},{"line_number":5747,"context_line":"                # See if we need to increase the max downtime. We"}],"source_content_type":"text/x-python","patch_set":10,"id":"1a4dcd0f_8ce7afe3","line":5744,"updated":"2015-08-11 06:50:08.000000000","message":"We should probably use monotonic time here to avoid clock weirdness doing bad things to our maximum downtimes? Again, a nit we can fix later.","commit_id":"07c7e5caf2819d96809af1b9a19c046b9fd09851"}]}
