)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"3fef0036f25ad236e0e19ad84a3a6f5b920cf55f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"the logic that is closely monitoring the live-migration progress,"},{"line_number":17,"context_line":"and replaces the logic for automatically triggering post copy."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"The logging that tracks live-migration progress has been updated to"},{"line_number":20,"context_line":"reflect the removal of the stuck live-migration detection. It has"},{"line_number":21,"context_line":"largely been replaced with logging of the memory iterations as they"},{"line_number":22,"context_line":"happen. It is hoped this can promoted to an INFO log if it proves to be"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1a430d35_1f77a1a0","line":19,"range":{"start_line":19,"start_character":4,"end_line":19,"end_character":11},"updated":"2017-02-08 17:46:26.000000000","message":"nit: logic","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"9d16cd73173e6cbf9ed27aa392c39fc9e2df3a4c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"the logic that is closely monitoring the live-migration progress,"},{"line_number":17,"context_line":"and replaces the logic for automatically triggering post copy."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"The logging that tracks live-migration progress has been updated to"},{"line_number":20,"context_line":"reflect the removal of the stuck live-migration detection. It has"},{"line_number":21,"context_line":"largely been replaced with logging of the memory iterations as they"},{"line_number":22,"context_line":"happen. It is hoped this can promoted to an INFO log if it proves to be"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1a430d35_6e31d859","line":19,"range":{"start_line":19,"start_character":4,"end_line":19,"end_character":11},"in_reply_to":"1a430d35_1f77a1a0","updated":"2017-02-08 18:38:27.000000000","message":"No, I really mean the logging.","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"}],"nova/conf/libvirt.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f76992ea4302ed638f5d72264c305771e5fc7e9","unresolved":false,"context_lines":[{"line_number":389,"context_line":"    cfg.IntOpt(\u0027live_migration_progress_timeout\u0027,"},{"line_number":390,"context_line":"               default\u003d0,"},{"line_number":391,"context_line":"               deprecated_for_removal\u003dTrue,"},{"line_number":392,"context_line":"               deprecated_reason\u003d\"This is no longer used.\","},{"line_number":393,"context_line":"               deprecated_since\u003d\"16.0.0\","},{"line_number":394,"context_line":"               mutable\u003dTrue,"},{"line_number":395,"context_line":"               help\u003d\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a430d35_6850ff0b","line":392,"range":{"start_line":392,"start_character":33,"end_line":392,"end_character":34},"updated":"2017-02-08 13:10:20.000000000","message":"femtonit: \u0027, not \" :)","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f76992ea4302ed638f5d72264c305771e5fc7e9","unresolved":false,"context_lines":[{"line_number":395,"context_line":"               help\u003d\"\"\""},{"line_number":396,"context_line":"This configuration is no longer used by the code. The feature of"},{"line_number":397,"context_line":"trying to detect \"stuck\" live-migrations has been removed as it was"},{"line_number":398,"context_line":"found to be fundamentally flawed."},{"line_number":399,"context_line":"\"\"\"),"},{"line_number":400,"context_line":"    cfg.BoolOpt(\u0027live_migration_permit_post_copy\u0027,"},{"line_number":401,"context_line":"                default\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a430d35_a8566703","line":398,"updated":"2017-02-08 13:10:20.000000000","message":"Link to bug with futher context, please","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f76992ea4302ed638f5d72264c305771e5fc7e9","unresolved":false,"context_lines":[{"line_number":406,"context_line":"needs to be transferred. Post-copy requires libvirt\u003e\u003d1.3.3 and QEMU\u003e\u003d2.5.0."},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"When permitted, post-copy mode will be automatically activated if we reach"},{"line_number":409,"context_line":"the timeout defined by live_migration_completion_timeout. Note if no timeout"},{"line_number":410,"context_line":"is configured, there will be no automatic switch to post-copy."},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"The live-migration force complete API also uses post-copy when permitted. If"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a430d35_284b575a","line":409,"range":{"start_line":409,"start_character":23,"end_line":409,"end_character":56},"updated":"2017-02-08 13:10:20.000000000","message":"Format as ``code``, perhaps?","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"3fef0036f25ad236e0e19ad84a3a6f5b920cf55f","unresolved":false,"context_lines":[{"line_number":406,"context_line":"needs to be transferred. Post-copy requires libvirt\u003e\u003d1.3.3 and QEMU\u003e\u003d2.5.0."},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"When permitted, post-copy mode will be automatically activated if we reach"},{"line_number":409,"context_line":"the timeout defined by live_migration_completion_timeout. Note if no timeout"},{"line_number":410,"context_line":"is configured, there will be no automatic switch to post-copy."},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"The live-migration force complete API also uses post-copy when permitted. If"},{"line_number":413,"context_line":"post-copy mode is not available, force complete falls back to pausing the VM"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a430d35_bfadadea","line":410,"range":{"start_line":409,"start_character":58,"end_line":410,"end_character":62},"updated":"2017-02-08 17:46:26.000000000","message":"This seems to be important bit, maybe call it a next line to get attention?","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"5f76992ea4302ed638f5d72264c305771e5fc7e9","unresolved":false,"context_lines":[{"line_number":9191,"context_line":"    def test_live_migration_monitor_postcopy_switch(self,"},{"line_number":9192,"context_line":"            mock_postcopy_enabled):"},{"line_number":9193,"context_line":"        self.flags(live_migration_completion_timeout\u003d40,"},{"line_number":9194,"context_line":"                   group\u003d\u0027libvirt\u0027)"},{"line_number":9195,"context_line":"        mock_postcopy_enabled.return_value \u003d True"},{"line_number":9196,"context_line":""},{"line_number":9197,"context_line":"        # Each one of these fake times is used for time.time()"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a430d35_286277d8","line":9194,"updated":"2017-02-08 13:10:20.000000000","message":"nit: These can fit on the same line","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f8b14d3f4e32640e79767a2b8bf17e1d8624de9","unresolved":false,"context_lines":[{"line_number":1085,"context_line":"    @mock.patch.object(host.Host, \u0027has_min_version\u0027, return_value\u003dTrue)"},{"line_number":1086,"context_line":"    def test_live_migration_permit_auto_converge_true(self, host):"},{"line_number":1087,"context_line":"        self.flags(live_migration_permit_auto_converge\u003dTrue, group\u003d\u0027libvirt\u0027)"},{"line_number":1088,"context_line":"        self.flags(live_migration_permit_post_copy\u003dFalse, group\u003d\u0027libvirt\u0027)"},{"line_number":1089,"context_line":"        self._do_test_parse_migration_flags("},{"line_number":1090,"context_line":"            lm_expected\u003d(libvirt_driver.libvirt.VIR_MIGRATE_UNDEFINE_SOURCE |"},{"line_number":1091,"context_line":"                         libvirt_driver.libvirt.VIR_MIGRATE_PERSIST_DEST |"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ffa3b31_522496c6","line":1088,"updated":"2017-04-14 13:33:21.000000000","message":"This is the default, right, so this line is technically unnecessary?  (Cool to keep it to be explicit - just checking my understanding.)","commit_id":"4372ab13bd0b4ce31e33b955f198d1a4c729a434"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f8b14d3f4e32640e79767a2b8bf17e1d8624de9","unresolved":false,"context_lines":[{"line_number":8160,"context_line":"            self, mock_old_xml, mock_new_xml,"},{"line_number":8161,"context_line":"            mock_migrateToURI3, mock_min_version):"},{"line_number":8162,"context_line":"        self.flags(live_migration_tunnelled\u003dTrue, group\u003d\u0027libvirt\u0027)"},{"line_number":8163,"context_line":"        self.flags(live_migration_permit_post_copy\u003dFalse, group\u003d\u0027libvirt\u0027)"},{"line_number":8164,"context_line":"        # Preparing mocks"},{"line_number":8165,"context_line":"        disk_paths \u003d []"},{"line_number":8166,"context_line":"        params \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"7ffa3b31_32210ab6","line":8163,"updated":"2017-04-14 13:33:21.000000000","message":"ditto","commit_id":"4372ab13bd0b4ce31e33b955f198d1a4c729a434"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"a64f5a02a83d7f019cd785e4752b343200f00b78","unresolved":false,"context_lines":[{"line_number":6337,"context_line":"                    if is_post_copy_enabled:"},{"line_number":6338,"context_line":"                        LOG.debug(\"Attempting to trigger post_copy \""},{"line_number":6339,"context_line":"                                  \"due to completion timeout.\")"},{"line_number":6340,"context_line":"                        pc_trigger \u003d libvirt_migrate.trigger_postcopy_switch"},{"line_number":6341,"context_line":"                        post_copy_triggered \u003d pc_trigger("},{"line_number":6342,"context_line":"                                guest, instance, migration)"},{"line_number":6343,"context_line":"                    if not post_copy_triggered:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_cd0cdb3d","line":6340,"updated":"2017-02-07 12:16:27.000000000","message":"Assume you\u0027ve done this for line length? I wonder if for readability this should be in a helper function.\n\nIn fact, I wonder why it shouldn\u0027t be in the migrate module.","commit_id":"6b645c06659fefaca8c27a962f34f4605181812e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"5813189827722cc8697941dd4b3f1523856e4106","unresolved":false,"context_lines":[{"line_number":6337,"context_line":"                    if is_post_copy_enabled:"},{"line_number":6338,"context_line":"                        LOG.debug(\"Attempting to trigger post_copy \""},{"line_number":6339,"context_line":"                                  \"due to completion timeout.\")"},{"line_number":6340,"context_line":"                        pc_trigger \u003d libvirt_migrate.trigger_postcopy_switch"},{"line_number":6341,"context_line":"                        post_copy_triggered \u003d pc_trigger("},{"line_number":6342,"context_line":"                                guest, instance, migration)"},{"line_number":6343,"context_line":"                    if not post_copy_triggered:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_2d48ffcb","line":6340,"in_reply_to":"1a430d35_cd0cdb3d","updated":"2017-02-07 12:28:08.000000000","message":"yeah, its line length. Yeah, possible worth a move to some trigger or abort kind of thing.","commit_id":"6b645c06659fefaca8c27a962f34f4605181812e"},{"author":{"_account_id":18339,"name":"Sivasathurappan Radhakrishnan","email":"siva.radhakrishnan@intel.com","username":"sivakrishnan"},"change_message_id":"935a94a2683a78d5b19113faf6230b9b8a90aed8","unresolved":false,"context_lines":[{"line_number":6327,"context_line":"                now \u003d time.time()"},{"line_number":6328,"context_line":"                elapsed \u003d now - start"},{"line_number":6329,"context_line":""},{"line_number":6330,"context_line":"                if libvirt_migrate.should_abort(instance, elapsed,"},{"line_number":6331,"context_line":"                                                completion_timeout,"},{"line_number":6332,"context_line":"                                                migration.status):"},{"line_number":6333,"context_line":"                    LOG.info(_LI(\"Hit live-migration completion timeout \""},{"line_number":6334,"context_line":"                                 \"after %s seconds.\"),"},{"line_number":6335,"context_line":"                             completion_timeout, instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a430d35_171a4e7d","line":6332,"range":{"start_line":6330,"start_character":16,"end_line":6332,"end_character":66},"updated":"2017-02-08 06:04:19.000000000","message":"What happens if completion_timeout is disabled or set to 0 ? In this scenario post copy wouldn\u0027t be called at all even if needed. I think we can avoid this scenario by setting min value to 1 in \u0027live_migration_completion_timeout\u0027 conf option.","commit_id":"af19f3cc332ceea2c665be6581e38c30a6e2d499"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"8662e8c5c24a6d3b13c06fc0e01bcc6c29914df3","unresolved":false,"context_lines":[{"line_number":6327,"context_line":"                now \u003d time.time()"},{"line_number":6328,"context_line":"                elapsed \u003d now - start"},{"line_number":6329,"context_line":""},{"line_number":6330,"context_line":"                if libvirt_migrate.should_abort(instance, elapsed,"},{"line_number":6331,"context_line":"                                                completion_timeout,"},{"line_number":6332,"context_line":"                                                migration.status):"},{"line_number":6333,"context_line":"                    LOG.info(_LI(\"Hit live-migration completion timeout \""},{"line_number":6334,"context_line":"                                 \"after %s seconds.\"),"},{"line_number":6335,"context_line":"                             completion_timeout, instance\u003dinstance)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a430d35_fc3835d5","line":6332,"range":{"start_line":6330,"start_character":16,"end_line":6332,"end_character":66},"in_reply_to":"1a430d35_171a4e7d","updated":"2017-02-08 11:58:26.000000000","message":"Correct, if set to 0 post_copy would never be automatically called.\n\nYou would only trigger post_copy via the force_complete API, in that case.","commit_id":"af19f3cc332ceea2c665be6581e38c30a6e2d499"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"3fef0036f25ad236e0e19ad84a3a6f5b920cf55f","unresolved":false,"context_lines":[{"line_number":6327,"context_line":"                now \u003d time.time()"},{"line_number":6328,"context_line":"                elapsed \u003d now - start"},{"line_number":6329,"context_line":""},{"line_number":6330,"context_line":"                if libvirt_migrate.should_abort(instance, elapsed,"},{"line_number":6331,"context_line":"                                                completion_timeout,"},{"line_number":6332,"context_line":"                                                migration.status):"},{"line_number":6333,"context_line":"                    LOG.info(_LI(\"Hit live-migration completion timeout \""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a430d35_bf6bed1c","line":6330,"range":{"start_line":6330,"start_character":35,"end_line":6330,"end_character":47},"updated":"2017-02-08 17:46:26.000000000","message":"Just call this method only \"if completion_timeout !\u003d 0\"?","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"44167315fb5fcf47fe91c1748ff03068f9cd6537","unresolved":false,"context_lines":[{"line_number":6327,"context_line":"                now \u003d time.time()"},{"line_number":6328,"context_line":"                elapsed \u003d now - start"},{"line_number":6329,"context_line":""},{"line_number":6330,"context_line":"                if libvirt_migrate.should_abort(instance, elapsed,"},{"line_number":6331,"context_line":"                                                completion_timeout,"},{"line_number":6332,"context_line":"                                                migration.status):"},{"line_number":6333,"context_line":"                    LOG.info(_LI(\"Hit live-migration completion timeout \""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a430d35_647ad989","line":6330,"range":{"start_line":6330,"start_character":35,"end_line":6330,"end_character":47},"in_reply_to":"1a430d35_316731b8","updated":"2017-02-08 22:01:21.000000000","message":"I guess I am from C background and always look for small optimizations. I was thinking to save a stack call with just an if condition :)","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"9d16cd73173e6cbf9ed27aa392c39fc9e2df3a4c","unresolved":false,"context_lines":[{"line_number":6327,"context_line":"                now \u003d time.time()"},{"line_number":6328,"context_line":"                elapsed \u003d now - start"},{"line_number":6329,"context_line":""},{"line_number":6330,"context_line":"                if libvirt_migrate.should_abort(instance, elapsed,"},{"line_number":6331,"context_line":"                                                completion_timeout,"},{"line_number":6332,"context_line":"                                                migration.status):"},{"line_number":6333,"context_line":"                    LOG.info(_LI(\"Hit live-migration completion timeout \""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a430d35_316731b8","line":6330,"range":{"start_line":6330,"start_character":35,"end_line":6330,"end_character":47},"in_reply_to":"1a430d35_bf6bed1c","updated":"2017-02-08 18:38:27.000000000","message":"No, this method is what checks for the 0, see the unit tests.","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":18339,"name":"Sivasathurappan Radhakrishnan","email":"siva.radhakrishnan@intel.com","username":"sivakrishnan"},"change_message_id":"8d6771988dbe91f31eb9d2f324b8386cf1745fb5","unresolved":false,"context_lines":[{"line_number":6338,"context_line":"                            post_copy_triggered \u003d \\"},{"line_number":6339,"context_line":"                                libvirt_migrate.trigger_postcopy_switch("},{"line_number":6340,"context_line":"                                    guest, instance, migration)"},{"line_number":6341,"context_line":"                        elif not post_copy_triggered:"},{"line_number":6342,"context_line":"                            self.live_migration_force_complete(instance)"},{"line_number":6343,"context_line":"                    else:"},{"line_number":6344,"context_line":"                        LOG.debug(\"Attempting to abort live-migration \""}],"source_content_type":"text/x-python","patch_set":7,"id":"1a1ced50_8239bda6","line":6341,"range":{"start_line":6341,"start_character":24,"end_line":6341,"end_character":53},"updated":"2017-03-21 16:28:03.000000000","message":"should remove the elif and make it just if statement. will update it in the next patch","commit_id":"2f9b78f94ce1425397dbab07bbf2ea3af130dca5"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"ab72b67931d7a23048d686fad865ccaedded9ad2","unresolved":false,"context_lines":[{"line_number":6339,"context_line":"                                libvirt_migrate.trigger_postcopy_switch("},{"line_number":6340,"context_line":"                                    guest, instance, migration)"},{"line_number":6341,"context_line":"                        elif not post_copy_triggered:"},{"line_number":6342,"context_line":"                            self.live_migration_force_complete(instance)"},{"line_number":6343,"context_line":"                    else:"},{"line_number":6344,"context_line":"                        LOG.debug(\"Attempting to abort live-migration \""},{"line_number":6345,"context_line":"                                  \"due to completion timeout.\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"dfeb2761_352c0c98","line":6342,"range":{"start_line":6342,"start_character":33,"end_line":6342,"end_character":62},"updated":"2017-04-03 15:57:10.000000000","message":"This method itself can take care of triggering post-copy if enabled or pause otherwise, so I will just replace all logic as \nif is_post_copy_enabled:\n    self.live_migration_force_complete(instance)","commit_id":"2f9b78f94ce1425397dbab07bbf2ea3af130dca5"},{"author":{"_account_id":18339,"name":"Sivasathurappan Radhakrishnan","email":"siva.radhakrishnan@intel.com","username":"sivakrishnan"},"change_message_id":"bc68b0fa53d643086ba1b6d9a10b76064c085341","unresolved":false,"context_lines":[{"line_number":6339,"context_line":"                                libvirt_migrate.trigger_postcopy_switch("},{"line_number":6340,"context_line":"                                    guest, instance, migration)"},{"line_number":6341,"context_line":"                        elif not post_copy_triggered:"},{"line_number":6342,"context_line":"                            self.live_migration_force_complete(instance)"},{"line_number":6343,"context_line":"                    else:"},{"line_number":6344,"context_line":"                        LOG.debug(\"Attempting to abort live-migration \""},{"line_number":6345,"context_line":"                                  \"due to completion timeout.\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"dfeb2761_b80ed12f","line":6342,"range":{"start_line":6342,"start_character":33,"end_line":6342,"end_character":62},"in_reply_to":"dfeb2761_352c0c98","updated":"2017-04-06 21:59:30.000000000","message":"that\u0027s what I thought as well. we don\u0027t need if check for post_copy as well. it is being checked in self.live_migration_force_complete. will update it in next patch.","commit_id":"2f9b78f94ce1425397dbab07bbf2ea3af130dca5"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"d0d46b4bbab8761b8a418629a7021cd236d8308b","unresolved":false,"context_lines":[{"line_number":6342,"context_line":"                        self._clear_empty_migration(instance)"},{"line_number":6343,"context_line":"                        raise"},{"line_number":6344,"context_line":""},{"line_number":6345,"context_line":"                if (is_post_copy_enabled and"},{"line_number":6346,"context_line":"                    libvirt_migrate.should_switch_to_postcopy("},{"line_number":6347,"context_line":"                    info.memory_iteration, info.data_remaining,"},{"line_number":6348,"context_line":"                    previous_data_remaining, migration.status)):"},{"line_number":6349,"context_line":"                    libvirt_migrate.trigger_postcopy_switch(guest,"},{"line_number":6350,"context_line":"                                                            instance,"},{"line_number":6351,"context_line":"                                                            migration)"},{"line_number":6352,"context_line":"                previous_data_remaining \u003d info.data_remaining"},{"line_number":6353,"context_line":""},{"line_number":6354,"context_line":"                curdowntime \u003d libvirt_migrate.update_downtime("},{"line_number":6355,"context_line":"                    guest, instance, curdowntime,"}],"source_content_type":"text/x-python","patch_set":10,"id":"5ff73747_70541acb","side":"PARENT","line":6352,"range":{"start_line":6345,"start_character":0,"end_line":6352,"end_character":61},"updated":"2017-04-24 16:32:32.000000000","message":"Dropping this block changes the behaviour of a non-converging live migration significantly. This block will cause an immediate switch to post-copy if the migration isn\u0027t converging, or isn\u0027t converging fast enough. Without it, we now only switch to post-copy after the timeout has expired. If we already know it\u0027s not going to work, we shouldn\u0027t wait for the inevitable.\n\nI think we need to keep this.","commit_id":"1e0e4080fbe0515e6c0734ae3907d6a5d0e3079f"},{"author":{"_account_id":8768,"name":"Chris Friesen","email":"chris.friesen@windriver.com","username":"cbf123"},"change_message_id":"233e3956b5276facf3d8a66a00fde29538cd0c8c","unresolved":false,"context_lines":[{"line_number":6342,"context_line":"                        self._clear_empty_migration(instance)"},{"line_number":6343,"context_line":"                        raise"},{"line_number":6344,"context_line":""},{"line_number":6345,"context_line":"                if (is_post_copy_enabled and"},{"line_number":6346,"context_line":"                    libvirt_migrate.should_switch_to_postcopy("},{"line_number":6347,"context_line":"                    info.memory_iteration, info.data_remaining,"},{"line_number":6348,"context_line":"                    previous_data_remaining, migration.status)):"},{"line_number":6349,"context_line":"                    libvirt_migrate.trigger_postcopy_switch(guest,"},{"line_number":6350,"context_line":"                                                            instance,"},{"line_number":6351,"context_line":"                                                            migration)"},{"line_number":6352,"context_line":"                previous_data_remaining \u003d info.data_remaining"},{"line_number":6353,"context_line":""},{"line_number":6354,"context_line":"                curdowntime \u003d libvirt_migrate.update_downtime("},{"line_number":6355,"context_line":"                    guest, instance, curdowntime,"}],"source_content_type":"text/x-python","patch_set":10,"id":"ff346bd7_12c14f55","side":"PARENT","line":6352,"range":{"start_line":6345,"start_character":0,"end_line":6352,"end_character":61},"in_reply_to":"5ff73747_70541acb","updated":"2017-07-24 22:22:46.000000000","message":"The problem is that it turns out we do not have a good indicator of whether we\u0027re making forward progress. (Since qemu is returning garbage data.)  As such we don\u0027t actually *know* if the live migration is converging or not.\n\nIt would be possible to improve the data output by qemu and I think there was some effort to do that, but in the meantime we can\u0027t really tell if we\u0027re making progress or not.","commit_id":"1e0e4080fbe0515e6c0734ae3907d6a5d0e3079f"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"d0d46b4bbab8761b8a418629a7021cd236d8308b","unresolved":false,"context_lines":[{"line_number":6288,"context_line":"                                  migrate_data.block_migration)"},{"line_number":6289,"context_line":""},{"line_number":6290,"context_line":"        n \u003d 0"},{"line_number":6291,"context_line":"        start \u003d time.time()"},{"line_number":6292,"context_line":"        previous_iteration \u003d -1"},{"line_number":6293,"context_line":"        previous_it_data_remaining \u003d -1"},{"line_number":6294,"context_line":"        previous_it_time \u003d start"}],"source_content_type":"text/x-python","patch_set":10,"id":"5ff73747_39cd645d","line":6291,"updated":"2017-04-24 16:32:32.000000000","message":"Suggestion: timeutils.StopWatch() from oslo_utils seems to be the thing-du-jour for this, accounts for some time edge cases and also does splits, which would do the iteration timing for us, and timer.expired() would be very ergonomic.\n\nThis is fine, though.","commit_id":"4372ab13bd0b4ce31e33b955f198d1a4c729a434"},{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"d0d46b4bbab8761b8a418629a7021cd236d8308b","unresolved":false,"context_lines":[{"line_number":6331,"context_line":"                    timeout_action \u003d \\"},{"line_number":6332,"context_line":"                        CONF.libvirt.live_migration_action_on_timeout"},{"line_number":6333,"context_line":""},{"line_number":6334,"context_line":"                    if timeout_action \u003d\u003d \u0027force_complete\u0027:"},{"line_number":6335,"context_line":"                        self.live_migration_force_complete(instance)"},{"line_number":6336,"context_line":"                    else:"},{"line_number":6337,"context_line":"                        LOG.debug(\"Attempting to abort live-migration \""}],"source_content_type":"text/x-python","patch_set":10,"id":"5ff73747_ca121bb2","line":6334,"range":{"start_line":6334,"start_character":41,"end_line":6334,"end_character":57},"updated":"2017-04-24 16:32:32.000000000","message":"Thought: wouldn\u0027t it be grand if oslo.config automatically gave us constants for options with choices?","commit_id":"4372ab13bd0b4ce31e33b955f198d1a4c729a434"}],"nova/virt/libvirt/migration.py":[{"author":{"_account_id":9555,"name":"Matthew Booth","email":"mbooth@redhat.com","username":"MatthewBooth"},"change_message_id":"a64f5a02a83d7f019cd785e4752b343200f00b78","unresolved":false,"context_lines":[{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    :returns: True if migration should be aborted, False otherwise"},{"line_number":262,"context_line":"    \"\"\""},{"line_number":263,"context_line":"    if migration_status \u003d\u003d \u0027running (post-copy)\u0027:"},{"line_number":264,"context_line":"        return False"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    if completion_timeout !\u003d 0 and elapsed \u003e completion_timeout:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_69c3dced","line":263,"updated":"2017-02-07 12:16:27.000000000","message":"Not your patch, but... ewww. That\u0027s fragile.","commit_id":"6b645c06659fefaca8c27a962f34f4605181812e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"5813189827722cc8697941dd4b3f1523856e4106","unresolved":false,"context_lines":[{"line_number":260,"context_line":""},{"line_number":261,"context_line":"    :returns: True if migration should be aborted, False otherwise"},{"line_number":262,"context_line":"    \"\"\""},{"line_number":263,"context_line":"    if migration_status \u003d\u003d \u0027running (post-copy)\u0027:"},{"line_number":264,"context_line":"        return False"},{"line_number":265,"context_line":""},{"line_number":266,"context_line":"    if completion_timeout !\u003d 0 and elapsed \u003e completion_timeout:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a430d35_ad0a2f77","line":263,"in_reply_to":"1a430d35_69c3dced","updated":"2017-02-07 12:28:08.000000000","message":"Totally.","commit_id":"6b645c06659fefaca8c27a962f34f4605181812e"}],"releasenotes/notes/deprecate-live-migration-progress-timeout-b4640047dc5c8eed.yaml":[{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"3fef0036f25ad236e0e19ad84a3a6f5b920cf55f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"deprecations:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The live-migration progress timeout controlled by the configuration option"},{"line_number":5,"context_line":"    ``[libvirt]/live_migration_progress_timeout`` has been discovered to"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"1a430d35_df2ef9a3","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":12},"updated":"2017-02-08 17:46:26.000000000","message":"I think this should be modified in the last patch itself, where you were actually deprecating the option.","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"9d16cd73173e6cbf9ed27aa392c39fc9e2df3a4c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"deprecations:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The live-migration progress timeout controlled by the configuration option"},{"line_number":5,"context_line":"    ``[libvirt]/live_migration_progress_timeout`` has been discovered to"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"1a430d35_31fe51ae","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":12},"in_reply_to":"1a430d35_df2ef9a3","updated":"2017-02-08 18:38:27.000000000","message":"I am confusing myself, as the other hasn\u0027t merged into ocata yet, will clean that up.","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"3fef0036f25ad236e0e19ad84a3a6f5b920cf55f","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    ``[libvirt]/live_migration_progress_timeout`` has been discovered to"},{"line_number":6,"context_line":"    frequently cause live-migrations to fail with a progress timeout error,"},{"line_number":7,"context_line":"    even though the live-migration is still making good progress."},{"line_number":8,"context_line":"    This is no longer used in the code. The default has be changed to reflect"},{"line_number":9,"context_line":"    the fact the timeout is no longer triggered."},{"line_number":10,"context_line":"    To modify when a live-migration will fail with a timeout error, please now"},{"line_number":11,"context_line":"    look at ``[libvirt]/live_migration_completion_timeout`` and"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"1a430d35_7f6fc5fb","line":8,"range":{"start_line":8,"start_character":56,"end_line":8,"end_character":58},"updated":"2017-02-08 17:46:26.000000000","message":"nit: been","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"3fef0036f25ad236e0e19ad84a3a6f5b920cf55f","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    frequently cause live-migrations to fail with a progress timeout error,"},{"line_number":7,"context_line":"    even though the live-migration is still making good progress."},{"line_number":8,"context_line":"    This is no longer used in the code. The default has be changed to reflect"},{"line_number":9,"context_line":"    the fact the timeout is no longer triggered."},{"line_number":10,"context_line":"    To modify when a live-migration will fail with a timeout error, please now"},{"line_number":11,"context_line":"    look at ``[libvirt]/live_migration_completion_timeout`` and"},{"line_number":12,"context_line":"    ``[libvirt]/live_migration_downtime``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"1a430d35_9f61d107","line":9,"range":{"start_line":9,"start_character":13,"end_line":9,"end_character":16},"updated":"2017-02-08 17:46:26.000000000","message":"that?","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"3fef0036f25ad236e0e19ad84a3a6f5b920cf55f","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    even though the live-migration is still making good progress."},{"line_number":8,"context_line":"    This is no longer used in the code. The default has be changed to reflect"},{"line_number":9,"context_line":"    the fact the timeout is no longer triggered."},{"line_number":10,"context_line":"    To modify when a live-migration will fail with a timeout error, please now"},{"line_number":11,"context_line":"    look at ``[libvirt]/live_migration_completion_timeout`` and"},{"line_number":12,"context_line":"    ``[libvirt]/live_migration_downtime``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"1a430d35_5fe769ab","line":10,"range":{"start_line":10,"start_character":68,"end_line":10,"end_character":78},"updated":"2017-02-08 17:46:26.000000000","message":"do we need this? Being polite :)","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"9d16cd73173e6cbf9ed27aa392c39fc9e2df3a4c","unresolved":false,"context_lines":[{"line_number":7,"context_line":"    even though the live-migration is still making good progress."},{"line_number":8,"context_line":"    This is no longer used in the code. The default has be changed to reflect"},{"line_number":9,"context_line":"    the fact the timeout is no longer triggered."},{"line_number":10,"context_line":"    To modify when a live-migration will fail with a timeout error, please now"},{"line_number":11,"context_line":"    look at ``[libvirt]/live_migration_completion_timeout`` and"},{"line_number":12,"context_line":"    ``[libvirt]/live_migration_downtime``."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"1a430d35_9181c5fd","line":10,"range":{"start_line":10,"start_character":68,"end_line":10,"end_character":78},"in_reply_to":"1a430d35_5fe769ab","updated":"2017-02-08 18:38:27.000000000","message":"not fixing here, should be fixed on previous patch if needed.","commit_id":"0328742e8a62a62acbda776eb6da23bf2724f8b2"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"41056a517ac6b007b185a55c31cc3ae24b268f72","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    frequently cause live-migrations to fail with a progress timeout error,"},{"line_number":7,"context_line":"    even though the live-migration is still making good progress."},{"line_number":8,"context_line":"    This configuration is no longer used in the code. The default has been"},{"line_number":9,"context_line":"    changed to reflect the fact the timeout is no longer triggered."},{"line_number":10,"context_line":"    To modify when a live-migration will fail with a timeout error, please now"},{"line_number":11,"context_line":"    look at ``[libvirt]/live_migration_completion_timeout`` and"},{"line_number":12,"context_line":"    ``[libvirt]/live_migration_downtime``."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"1a430d35_37439c6d","line":9,"range":{"start_line":9,"start_character":32,"end_line":9,"end_character":35},"updated":"2017-02-08 22:01:30.000000000","message":"nit: that?","commit_id":"423ecd674341c58144948d8f9e4910768e9f2f23"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"0a629069fad4ead933e999f9a7264dfae762b574","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    frequently cause live-migrations to fail with a progress timeout error,"},{"line_number":7,"context_line":"    even though the live-migration is still making good progress."},{"line_number":8,"context_line":"    This configuration is no longer used in the code. The default has been"},{"line_number":9,"context_line":"    changed to reflect the fact the timeout is no longer triggered."},{"line_number":10,"context_line":"    To modify when a live-migration will fail with a timeout error, please now"},{"line_number":11,"context_line":"    look at ``[libvirt]/live_migration_completion_timeout`` and"},{"line_number":12,"context_line":"    ``[libvirt]/live_migration_downtime``."}],"source_content_type":"text/x-yaml","patch_set":6,"id":"1a430d35_a0fd600a","line":9,"range":{"start_line":9,"start_character":32,"end_line":9,"end_character":35},"in_reply_to":"1a430d35_37439c6d","updated":"2017-02-09 16:29:35.000000000","message":"I could do \"the fact that the timeout\", but I find that too wordy myself.","commit_id":"423ecd674341c58144948d8f9e4910768e9f2f23"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cffaca95610c74951ae987d8431925758143601f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"issues:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The live-migration progress timeout controlled by the configuration option"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"7ffa3b31_a5615d3c","side":"PARENT","line":1,"updated":"2017-04-14 03:18:27.000000000","message":"Why delete this? I don\u0027t think that\u0027s normal since it messes with the reno history.","commit_id":"1e0e4080fbe0515e6c0734ae3907d6a5d0e3079f"}],"releasenotes/notes/live-migrate-progress-rewrite-5238ad6d82490ca7.yaml":[{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"ab72b67931d7a23048d686fad865ccaedded9ad2","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    making little progress."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    A new configuration option ``libvirt.live_migration_timeout_action``"},{"line_number":12,"context_line":"    will be added. This new option will have choice to ``abort`` (default)"},{"line_number":13,"context_line":"    or ``force_complete``. This option will determine what actions will be"},{"line_number":14,"context_line":"    taken against a VM after ``live_migration_completion_timeout`` expires."},{"line_number":15,"context_line":"    Currently nova just aborts the LM operation after completion timeout"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"dfeb2761_3551ac0f","line":12,"range":{"start_line":12,"start_character":35,"end_line":12,"end_character":44},"updated":"2017-04-03 15:57:10.000000000","message":"have","commit_id":"2f9b78f94ce1425397dbab07bbf2ea3af130dca5"},{"author":{"_account_id":19590,"name":"Sarafraj Singh","email":"Sarafraj.Singh@intel.com","username":"sarafrajsingh"},"change_message_id":"ab72b67931d7a23048d686fad865ccaedded9ad2","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    making little progress."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    A new configuration option ``libvirt.live_migration_timeout_action``"},{"line_number":12,"context_line":"    will be added. This new option will have choice to ``abort`` (default)"},{"line_number":13,"context_line":"    or ``force_complete``. This option will determine what actions will be"},{"line_number":14,"context_line":"    taken against a VM after ``live_migration_completion_timeout`` expires."},{"line_number":15,"context_line":"    Currently nova just aborts the LM operation after completion timeout"}],"source_content_type":"text/x-yaml","patch_set":7,"id":"dfeb2761_753174ec","line":12,"range":{"start_line":12,"start_character":4,"end_line":12,"end_character":11},"updated":"2017-04-03 15:57:10.000000000","message":"is","commit_id":"2f9b78f94ce1425397dbab07bbf2ea3af130dca5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cffaca95610c74951ae987d8431925758143601f","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":"    Config option ``libvirt.live_migration_progress_timeout`` was deprecated in"},{"line_number":5,"context_line":"    Ocata, and is removed."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Curent logic in libvirt driver to auto trigger post-copy is removed as"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"7ffa3b31_85666151","line":4,"range":{"start_line":4,"start_character":28,"end_line":4,"end_character":59},"updated":"2017-04-14 03:18:27.000000000","message":"Mention this in the upgrades section?","commit_id":"4372ab13bd0b4ce31e33b955f198d1a4c729a434"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cffaca95610c74951ae987d8431925758143601f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    Config option ``libvirt.live_migration_progress_timeout`` was deprecated in"},{"line_number":5,"context_line":"    Ocata, and is removed."},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    Curent logic in libvirt driver to auto trigger post-copy is removed as"},{"line_number":8,"context_line":"    it has proved impossible to detect when live-migration appears to be"},{"line_number":9,"context_line":"    making little progress."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":10,"id":"7ffa3b31_256c2d35","line":7,"range":{"start_line":7,"start_character":4,"end_line":7,"end_character":10},"updated":"2017-04-14 03:18:27.000000000","message":"Current","commit_id":"4372ab13bd0b4ce31e33b955f198d1a4c729a434"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cffaca95610c74951ae987d8431925758143601f","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    making little progress."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    A new configuration option ``libvirt.live_migration_timeout_action``"},{"line_number":12,"context_line":"    will be added. This new option will have choice to ``abort`` (default)"},{"line_number":13,"context_line":"    or ``force_complete``. This option will determine what actions will be"},{"line_number":14,"context_line":"    taken against a VM after ``live_migration_completion_timeout`` expires."},{"line_number":15,"context_line":"    Currently nova just aborts the LM operation after completion timeout"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"7ffa3b31_45605933","line":12,"range":{"start_line":12,"start_character":45,"end_line":12,"end_character":51},"updated":"2017-04-14 03:18:27.000000000","message":"a choice? choices?","commit_id":"4372ab13bd0b4ce31e33b955f198d1a4c729a434"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8f8b14d3f4e32640e79767a2b8bf17e1d8624de9","unresolved":false,"context_lines":[{"line_number":9,"context_line":"    making little progress."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"    A new configuration option ``libvirt.live_migration_timeout_action``"},{"line_number":12,"context_line":"    will be added. This new option will have choice to ``abort`` (default)"},{"line_number":13,"context_line":"    or ``force_complete``. This option will determine what actions will be"},{"line_number":14,"context_line":"    taken against a VM after ``live_migration_completion_timeout`` expires."},{"line_number":15,"context_line":"    Currently nova just aborts the LM operation after completion timeout"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"7ffa3b31_356694ef","line":12,"range":{"start_line":12,"start_character":4,"end_line":12,"end_character":11},"updated":"2017-04-14 13:33:21.000000000","message":"is / has been\n\nChange to current/past tense throughout.","commit_id":"4372ab13bd0b4ce31e33b955f198d1a4c729a434"}]}
