)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"048b8181cb74fd62f0448f7b3a0052bf47a8a4b4","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Limit parallel live migrations in progress"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch extends the previous one to allow limiting the total number of parallel"},{"line_number":10,"context_line":"builds that nova-compute will attempt to cover live migrations. Since we can now"},{"line_number":11,"context_line":"block immediately on the semaphore, this also implements the behavior we have in"},{"line_number":12,"context_line":"build, which spawns a new thread for the process so that we don\u0027t starve out"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1a4dcd0f_86c97428","line":9,"updated":"2015-08-12 15:08:01.000000000","message":"Which previous one?  I don\u0027t see a dependent change.","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"55b118ba67a7e5f9e6fcd7a38999a56b619cb616","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Limit parallel live migrations in progress"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch extends the previous one to allow limiting the total number of parallel"},{"line_number":10,"context_line":"builds that nova-compute will attempt to cover live migrations. Since we can now"},{"line_number":11,"context_line":"block immediately on the semaphore, this also implements the behavior we have in"},{"line_number":12,"context_line":"build, which spawns a new thread for the process so that we don\u0027t starve out"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1a4dcd0f_c62d3ca9","line":9,"in_reply_to":"1a4dcd0f_86c97428","updated":"2015-08-12 15:11:49.000000000","message":"Do you mean I412d2849fd16430e6926fc983c031babb7ad04d0 ?","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eaa6e1d7655d2becfeec94eb02217c00fa0582fc","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Limit parallel live migrations in progress"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch extends the previous one to allow limiting the total number of parallel"},{"line_number":10,"context_line":"builds that nova-compute will attempt to cover live migrations. Since we can now"},{"line_number":11,"context_line":"block immediately on the semaphore, this also implements the behavior we have in"},{"line_number":12,"context_line":"build, which spawns a new thread for the process so that we don\u0027t starve out"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a4dcd0f_178cacd8","line":9,"updated":"2015-08-12 15:52:48.000000000","message":"If you mean change I412d2849fd16430e6926fc983c031babb7ad04d0 it\u0027d be good to point that out here, since \u0027previous one\u0027 made me think dependent change in a series.","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eaa6e1d7655d2becfeec94eb02217c00fa0582fc","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch extends the previous one to allow limiting the total number of parallel"},{"line_number":10,"context_line":"builds that nova-compute will attempt to cover live migrations. Since we can now"},{"line_number":11,"context_line":"block immediately on the semaphore, this also implements the behavior we have in"},{"line_number":12,"context_line":"build, which spawns a new thread for the process so that we don\u0027t starve out"},{"line_number":13,"context_line":"RPC workers waiting on the semaphore. In reality, live migrations take a long time,"},{"line_number":14,"context_line":"so this was something we should have already had."},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a4dcd0f_5758f489","line":12,"updated":"2015-08-12 15:52:48.000000000","message":"s/out/our/?","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":11303,"name":"Markus Zoeller (markus_z)","email":"mzoeller@linux.vnet.ibm.com","username":"mzoeller"},"change_message_id":"79ce4e2dc9e2eb2f8d0eab97f0b1d8b3a7250edd","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"DocImpact: Adds a new configuration variable to limit parallel live migrations."},{"line_number":29,"context_line":"           Zero means \"unlimited\" and nonzero means \"this many in parallel\"."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Closes-Bug: #1478108"},{"line_number":32,"context_line":"Change-Id: Ia8a796372746b7fc75485dc2e663f270dbd5893a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a4dcd0f_325c564a","line":30,"updated":"2015-08-12 16:08:39.000000000","message":"Depending on the default value you choose for the config option, the \"UpgradeImpact\" tag would be needed as well, right? If you choose \"0\", then everything behaves as before, if you choose a value \u003e0, then the \"UpgradeImpact\" would be necessary, I guess.","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ddeeb3f16df95e44694c579704c02df6697ebd4a","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"DocImpact: Adds a new configuration variable to limit parallel live migrations."},{"line_number":29,"context_line":"           Zero means \"unlimited\" and nonzero means \"this many in parallel\"."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Closes-Bug: #1478108"},{"line_number":32,"context_line":"Change-Id: Ia8a796372746b7fc75485dc2e663f270dbd5893a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"1a4dcd0f_dd0183b0","line":30,"in_reply_to":"1a4dcd0f_325c564a","updated":"2015-08-12 16:23:15.000000000","message":"Before this, it was likely to just melt down if you did more than a few. Since this doesn\u0027t require ops to make a change during upgrade, I don\u0027t think it needs an UpgradeImpact, IMHO.","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"}],"nova/compute/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fd2a4585eceb6d90da91b87dc7b0c90c9e33db67","unresolved":false,"context_lines":[{"line_number":4919,"context_line":""},{"line_number":4920,"context_line":"        return pre_live_migration_data"},{"line_number":4921,"context_line":""},{"line_number":4922,"context_line":"    @wrap_exception()"},{"line_number":4923,"context_line":"    @wrap_instance_fault"},{"line_number":4924,"context_line":"    def live_migration(self, context, dest, instance, block_migration,"},{"line_number":4925,"context_line":"                       migration, migrate_data):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_8cc99328","side":"PARENT","line":4922,"updated":"2015-08-12 15:36:57.000000000","message":"I\u0027m wondering if we still want these on _do_live_migration - they are still on _do_build_and_run_instance.  I\u0027m not totally sure what happens regarding handling these in live_migration if _do_live_migration is spawned on another thread and raises an exception, does it get back to live_migration?  I remember we had a problem with that and the @reverts_task_state decorator in the build_and_run_instance_case:\n\nc43f2b0d708f0f4b37850d2917c0abcc13b8789b\n\nI guess in that case it was more of a problem in the decorator expecting instance to be in kwargs but it was actually in args.","commit_id":"868d05e4b7b6971c371f30fb0492cf921747570d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"84fbb8cbca32772706d9a250898084c01521cd5f","unresolved":false,"context_lines":[{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":134,"context_line":"               default\u003d60,"},{"line_number":135,"context_line":"               help\u003d\u0027Number of times to retry block device\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_2c387fd2","line":132,"updated":"2015-08-12 15:23:33.000000000","message":"Would it be helpful to note that they should consider the value of rpc_thread_pool_size  when changing this, at least regarding upper bounds?","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":8190,"name":"Drew Thorstensen (thorst)","email":"thorst@us.ibm.com","username":"thorst"},"change_message_id":"19872dac6b32e20321a54dce52cb0ec283af8436","unresolved":false,"context_lines":[{"line_number":690,"context_line":"            self._build_semaphore \u003d compute_utils.UnlimitedSemaphore()"},{"line_number":691,"context_line":"        if CONF.max_concurrent_live_migrations !\u003d 0:"},{"line_number":692,"context_line":"            self._live_migration_semaphore \u003d eventlet.semaphore.Semaphore("},{"line_number":693,"context_line":"                CONF.max_concurrent_live_migrations)"},{"line_number":694,"context_line":"        else:"},{"line_number":695,"context_line":"            self._live_migration_semaphore \u003d compute_utils.UnlimitedSemaphore()"},{"line_number":696,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_9760bca6","line":693,"updated":"2015-08-12 15:41:25.000000000","message":"I question if the compute driver itself should have some input into this?\n\nIt seems like there would be benefit if the calculation was min(CONF.max_concurrent_live_migrations, driver.max_concurrent_live_migrations)?\n\nThis is something that I believe affects most hypervisors.\n - KVM: Admins can tune the max concurrent live migrations for KVM by updating the libvirt.conf\n - PowerVM: Has a max concurrent live migrations (I mention because I\u0027d put the implementation in for that)\n - VMWare: Appears to have similar limits (but perhaps requires some calculations:  http://pubs.vmware.com/vsphere-51/index.jsp?topic\u003d%2Fcom.vmware.vsphere.vcenterhost.doc%2FGUID-F0C0FFD7-FC60-4CF9-B4E4-106FC1B97730.html )\n\nThe default implementation could just return 0 (indicating ignore me, just use CONF value).\n\nSorry if I\u0027m missing something, but I was thinking that could be useful.  I can also help work on it if that provides benefit as well.\n\nThx!","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fc39d8b176e9ca34735d1633fb0b752e23ac8a41","unresolved":false,"context_lines":[{"line_number":690,"context_line":"            self._build_semaphore \u003d compute_utils.UnlimitedSemaphore()"},{"line_number":691,"context_line":"        if CONF.max_concurrent_live_migrations !\u003d 0:"},{"line_number":692,"context_line":"            self._live_migration_semaphore \u003d eventlet.semaphore.Semaphore("},{"line_number":693,"context_line":"                CONF.max_concurrent_live_migrations)"},{"line_number":694,"context_line":"        else:"},{"line_number":695,"context_line":"            self._live_migration_semaphore \u003d compute_utils.UnlimitedSemaphore()"},{"line_number":696,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_7b42b269","line":693,"in_reply_to":"1a4dcd0f_9760bca6","updated":"2015-08-12 19:11:55.000000000","message":"If you want that, then just set this to zero, right?\n\nNova does more things than just call the driver\u0027s live_migration method. This gates all of it. If you want Nova to start as many as it is asked for and depend on the driver to manage a reasonable level then you can just disable this in nova.","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fd2a4585eceb6d90da91b87dc7b0c90c9e33db67","unresolved":false,"context_lines":[{"line_number":4990,"context_line":"        \"\"\"Executing live migration."},{"line_number":4991,"context_line":""},{"line_number":4992,"context_line":"        :param context: security context"},{"line_number":4993,"context_line":"        :param instance: a nova.objects.instance.Instance object"},{"line_number":4994,"context_line":"        :param dest: destination host"},{"line_number":4995,"context_line":"        :param block_migration: if true, prepare for block migration"},{"line_number":4996,"context_line":"        :param migration: an nova.objects.Migration object"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_cc60fbd1","line":4993,"updated":"2015-08-12 15:36:57.000000000","message":"I realize this docstring was copied, but dest and instance are in the wrong order for the params in the doc string so might as well fix it while moving it.","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fd2a4585eceb6d90da91b87dc7b0c90c9e33db67","unresolved":false,"context_lines":[{"line_number":4994,"context_line":"        :param dest: destination host"},{"line_number":4995,"context_line":"        :param block_migration: if true, prepare for block migration"},{"line_number":4996,"context_line":"        :param migration: an nova.objects.Migration object"},{"line_number":4997,"context_line":"        :param migrate_data: implementation specific params"},{"line_number":4998,"context_line":""},{"line_number":4999,"context_line":"        \"\"\""},{"line_number":5000,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_8c9d13be","line":4997,"updated":"2015-08-12 15:36:57.000000000","message":"Maybe we should take the chance to point out this is a dict.","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fd2a4585eceb6d90da91b87dc7b0c90c9e33db67","unresolved":false,"context_lines":[{"line_number":5003,"context_line":"            migration.status \u003d \u0027queued\u0027"},{"line_number":5004,"context_line":"            migration.save()"},{"line_number":5005,"context_line":""},{"line_number":5006,"context_line":"        def dispatch_live_migration(*args, **kwargs):"},{"line_number":5007,"context_line":"            with self._live_migration_semaphore:"},{"line_number":5008,"context_line":"                self._do_live_migration(*args, **kwargs)"},{"line_number":5009,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_6ce8c7b3","line":5006,"updated":"2015-08-12 15:36:57.000000000","message":"In the case of build_and_run_instance we lock on the instance uuid so nothing is doing things on the instance while it\u0027s queued up to run.  Do we want to do something similar here?","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"20eed11cbed300ac987dbe5dc76093eb79f01060","unresolved":false,"context_lines":[{"line_number":5009,"context_line":""},{"line_number":5010,"context_line":"        # NOTE(danms): We spawn here to return the RPC worker thread back to"},{"line_number":5011,"context_line":"        # the pool. Since what follows could take a really long time, we don\u0027t"},{"line_number":5012,"context_line":"        # want to tie up RPC workers."},{"line_number":5013,"context_line":"        utils.spawn_n(dispatch_live_migration,"},{"line_number":5014,"context_line":"                      context, dest, instance,"},{"line_number":5015,"context_line":"                      block_migration, migration,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_2623c0be","line":5012,"updated":"2015-08-12 15:11:41.000000000","message":"The   self.driver.live_migration virt driver call from _do_live_migration launches migration in the background - it doesn\u0027t wait for completion.  So you\u0027re merely limiting concurrent attempts to /launch/ live migration, and so this is not blocking for a long time.\n\nCompletion happens in a background thread in the virt drivers - see in libvirt/driver.py\n\n        utils.spawn(self._live_migration, context, instance, dest,\n                          post_method, recover_method, block_migration,\n                          migrate_data)","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"19d72745ce0ba2bf0e78d66e5ed2d199712f004b","unresolved":false,"context_lines":[{"line_number":5009,"context_line":""},{"line_number":5010,"context_line":"        # NOTE(danms): We spawn here to return the RPC worker thread back to"},{"line_number":5011,"context_line":"        # the pool. Since what follows could take a really long time, we don\u0027t"},{"line_number":5012,"context_line":"        # want to tie up RPC workers."},{"line_number":5013,"context_line":"        utils.spawn_n(dispatch_live_migration,"},{"line_number":5014,"context_line":"                      context, dest, instance,"},{"line_number":5015,"context_line":"                      block_migration, migration,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_c9530de1","line":5012,"in_reply_to":"1a4dcd0f_2623c0be","updated":"2015-08-12 15:13:58.000000000","message":"For libvirt, but other virt drivers might not be doing that same thing.","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"b53150bb37455fdc82c300435c977f466b1b0d2d","unresolved":false,"context_lines":[{"line_number":5009,"context_line":""},{"line_number":5010,"context_line":"        # NOTE(danms): We spawn here to return the RPC worker thread back to"},{"line_number":5011,"context_line":"        # the pool. Since what follows could take a really long time, we don\u0027t"},{"line_number":5012,"context_line":"        # want to tie up RPC workers."},{"line_number":5013,"context_line":"        utils.spawn_n(dispatch_live_migration,"},{"line_number":5014,"context_line":"                      context, dest, instance,"},{"line_number":5015,"context_line":"                      block_migration, migration,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_cc1ebbba","line":5012,"in_reply_to":"1a4dcd0f_ac0a4fd0","updated":"2015-08-12 15:32:29.000000000","message":"Yeah, that ought to be doable.","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"762b91424629904a62eb3d0724576c4134364bbc","unresolved":false,"context_lines":[{"line_number":5009,"context_line":""},{"line_number":5010,"context_line":"        # NOTE(danms): We spawn here to return the RPC worker thread back to"},{"line_number":5011,"context_line":"        # the pool. Since what follows could take a really long time, we don\u0027t"},{"line_number":5012,"context_line":"        # want to tie up RPC workers."},{"line_number":5013,"context_line":"        utils.spawn_n(dispatch_live_migration,"},{"line_number":5014,"context_line":"                      context, dest, instance,"},{"line_number":5015,"context_line":"                      block_migration, migration,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_ac0a4fd0","line":5012,"in_reply_to":"1a4dcd0f_c9530de1","updated":"2015-08-12 15:27:26.000000000","message":"Yeah, but with this change, I think we can and should just remove that spawn in libvirt so that it\u0027s concurrent, right? We actually need to do that for proper updating of the migration object state and notifications anyway.\n\nYou okay with that?","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"69ff5639f374f7438c09acc352287187e4031a45","unresolved":false,"context_lines":[{"line_number":5009,"context_line":""},{"line_number":5010,"context_line":"        # NOTE(danms): We spawn here to return the RPC worker thread back to"},{"line_number":5011,"context_line":"        # the pool. Since what follows could take a really long time, we don\u0027t"},{"line_number":5012,"context_line":"        # want to tie up RPC workers."},{"line_number":5013,"context_line":"        utils.spawn_n(dispatch_live_migration,"},{"line_number":5014,"context_line":"                      context, dest, instance,"},{"line_number":5015,"context_line":"                      block_migration, migration,"}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_8cf0b368","line":5012,"in_reply_to":"1a4dcd0f_cc1ebbba","updated":"2015-08-12 15:33:47.000000000","message":"I\u0027ll do that in a follow-on to this, as I survey the other drivers for similar changes.","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":11303,"name":"Markus Zoeller (markus_z)","email":"mzoeller@linux.vnet.ibm.com","username":"mzoeller"},"change_message_id":"94916411f47a40ca0efad94061af4ab8b5125091","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    cfg.IntOpt(\u0027max_concurrent_builds\u0027,"},{"line_number":128,"context_line":"               default\u003d10,"},{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_521ec25f","line":130,"updated":"2015-08-12 15:54:29.000000000","message":"Does it make sense to apply this to cold-migrations as well? The user can do a \"nova host-evacuate\" which calls the evacuate in a loop for all instances on that host.\n\nhttp://lists.openstack.org/pipermail/openstack-dev/2015-June/067787.html","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ddeeb3f16df95e44694c579704c02df6697ebd4a","unresolved":false,"context_lines":[{"line_number":127,"context_line":"    cfg.IntOpt(\u0027max_concurrent_builds\u0027,"},{"line_number":128,"context_line":"               default\u003d10,"},{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_5ddb334f","line":130,"in_reply_to":"1a4dcd0f_521ec25f","updated":"2015-08-12 16:23:15.000000000","message":"I think it should be a different tunable. If you are on shared storage, a cold migration is very lightweight, but live migrations are still network-intensive.","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":11303,"name":"Markus Zoeller (markus_z)","email":"mzoeller@linux.vnet.ibm.com","username":"mzoeller"},"change_message_id":"94916411f47a40ca0efad94061af4ab8b5125091","unresolved":false,"context_lines":[{"line_number":128,"context_line":"               default\u003d10,"},{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":134,"context_line":"               default\u003d60,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_1244ba47","line":131,"updated":"2015-08-12 15:54:29.000000000","message":"The behavior from previous releases would be achieved with \"0\" as value, right? Wouldn\u0027t that be a better option? Some operators could be confused if they were used to the, let\u0027s say 20 instances they could live-migrate in Kilo and before, but now it got limited to 1 because they didn\u0027t know about the new config option.","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ddeeb3f16df95e44694c579704c02df6697ebd4a","unresolved":false,"context_lines":[{"line_number":128,"context_line":"               default\u003d10,"},{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":134,"context_line":"               default\u003d60,"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_bd8d9732","line":131,"in_reply_to":"1a4dcd0f_1244ba47","updated":"2015-08-12 16:23:15.000000000","message":"No, I think sane and safe defaults have always been a goal of ours. Before, the default was not safe, this default is. I don\u0027t think changing defaults falls into the scope of being a disturbing change.  For reference, in the previous patch where we limited builds, we chose a value and set it. We didn\u0027t default it to zero to maintain previous (broken) behavior.","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eaa6e1d7655d2becfeec94eb02217c00fa0582fc","unresolved":false,"context_lines":[{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":134,"context_line":"               default\u003d60,"},{"line_number":135,"context_line":"               help\u003d\u0027Number of times to retry block device\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_b7ccd835","line":132,"updated":"2015-08-12 15:52:48.000000000","message":"Same question as before about mentioning taking note of the rpc_thread_pool_size value when changing this.  I think it\u0027s useful to know that when you have a billion options some of them are inter-related and changing one can be impacted by the other.","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ddeeb3f16df95e44694c579704c02df6697ebd4a","unresolved":false,"context_lines":[{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":134,"context_line":"               default\u003d60,"},{"line_number":135,"context_line":"               help\u003d\u0027Number of times to retry block device\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_1d428bae","line":132,"in_reply_to":"1a4dcd0f_b7ccd835","updated":"2015-08-12 16:23:15.000000000","message":"I\u0027m not sure what you\u0027re getting at here. Are you saying people might\u0027ve increased that limit to avoid blocking RPC because of lots of migrations and now they can drop it? We could, I guess, but it\u0027s unlikely that you were able to sustain enough live migration traffic to really starve your workers before without other failures.","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":8190,"name":"Drew Thorstensen (thorst)","email":"thorst@us.ibm.com","username":"thorst"},"change_message_id":"13212640fc8ad459114d921cb82ff35da5a41504","unresolved":false,"context_lines":[{"line_number":688,"context_line":"                CONF.max_concurrent_builds)"},{"line_number":689,"context_line":"        else:"},{"line_number":690,"context_line":"            self._build_semaphore \u003d compute_utils.UnlimitedSemaphore()"},{"line_number":691,"context_line":"        if CONF.max_concurrent_live_migrations !\u003d 0:"},{"line_number":692,"context_line":"            self._live_migration_semaphore \u003d eventlet.semaphore.Semaphore("},{"line_number":693,"context_line":"                CONF.max_concurrent_live_migrations)"},{"line_number":694,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_7713b065","line":691,"updated":"2015-08-12 15:52:59.000000000","message":"Just want to make sure this doesn\u0027t get lost.  I put a comment on patch set 1.\n\nFor reference, PowerVM (which we\u0027re working the driver currently in stackforge) does also run concurrent live migrations.  But there is an upper boundary (something that can be found programatically).","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":11303,"name":"Markus Zoeller (markus_z)","email":"mzoeller@linux.vnet.ibm.com","username":"mzoeller"},"change_message_id":"94916411f47a40ca0efad94061af4ab8b5125091","unresolved":false,"context_lines":[{"line_number":688,"context_line":"                CONF.max_concurrent_builds)"},{"line_number":689,"context_line":"        else:"},{"line_number":690,"context_line":"            self._build_semaphore \u003d compute_utils.UnlimitedSemaphore()"},{"line_number":691,"context_line":"        if CONF.max_concurrent_live_migrations !\u003d 0:"},{"line_number":692,"context_line":"            self._live_migration_semaphore \u003d eventlet.semaphore.Semaphore("},{"line_number":693,"context_line":"                CONF.max_concurrent_live_migrations)"},{"line_number":694,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_12b27a4c","line":691,"updated":"2015-08-12 15:54:29.000000000","message":"What happens when I give a negative value? Maybe we could use the arguments \"min\" on the config option to make the contract clearer and detect breaks at an earlier point in time?","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ddeeb3f16df95e44694c579704c02df6697ebd4a","unresolved":false,"context_lines":[{"line_number":688,"context_line":"                CONF.max_concurrent_builds)"},{"line_number":689,"context_line":"        else:"},{"line_number":690,"context_line":"            self._build_semaphore \u003d compute_utils.UnlimitedSemaphore()"},{"line_number":691,"context_line":"        if CONF.max_concurrent_live_migrations !\u003d 0:"},{"line_number":692,"context_line":"            self._live_migration_semaphore \u003d eventlet.semaphore.Semaphore("},{"line_number":693,"context_line":"                CONF.max_concurrent_live_migrations)"},{"line_number":694,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_1da60bae","line":691,"in_reply_to":"1a4dcd0f_12b27a4c","updated":"2015-08-12 16:23:15.000000000","message":"Sure, sounds good.","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eaa6e1d7655d2becfeec94eb02217c00fa0582fc","unresolved":false,"context_lines":[{"line_number":4990,"context_line":"        \"\"\"Executing live migration."},{"line_number":4991,"context_line":""},{"line_number":4992,"context_line":"        :param context: security context"},{"line_number":4993,"context_line":"        :param instance: a nova.objects.instance.Instance object"},{"line_number":4994,"context_line":"        :param dest: destination host"},{"line_number":4995,"context_line":"        :param block_migration: if true, prepare for block migration"},{"line_number":4996,"context_line":"        :param migration: an nova.objects.Migration object"}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_9733dc13","line":4993,"updated":"2015-08-12 15:52:48.000000000","message":"nit: dest and instance are in the wrong order here.","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eaa6e1d7655d2becfeec94eb02217c00fa0582fc","unresolved":false,"context_lines":[{"line_number":5003,"context_line":"            migration.status \u003d \u0027queued\u0027"},{"line_number":5004,"context_line":"            migration.save()"},{"line_number":5005,"context_line":""},{"line_number":5006,"context_line":"        def dispatch_live_migration(*args, **kwargs):"},{"line_number":5007,"context_line":"            with self._live_migration_semaphore:"},{"line_number":5008,"context_line":"                self._do_live_migration(*args, **kwargs)"},{"line_number":5009,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_7745f06c","line":5006,"updated":"2015-08-12 15:52:48.000000000","message":"Same comment as patch set 1 regarding locking this on instance.uuid, is that desirable?","commit_id":"dd77225d0927fd6eff8d551cef8e8fd1a494c32a"},{"author":{"_account_id":8190,"name":"Drew Thorstensen (thorst)","email":"thorst@us.ibm.com","username":"thorst"},"change_message_id":"b51c802d413ff4f4be85af0df014f012e96d87d1","unresolved":false,"context_lines":[{"line_number":688,"context_line":"                CONF.max_concurrent_builds)"},{"line_number":689,"context_line":"        else:"},{"line_number":690,"context_line":"            self._build_semaphore \u003d compute_utils.UnlimitedSemaphore()"},{"line_number":691,"context_line":"        if max(CONF.max_concurrent_live_migrations, 0) !\u003d 0:"},{"line_number":692,"context_line":"            self._live_migration_semaphore \u003d eventlet.semaphore.Semaphore("},{"line_number":693,"context_line":"                CONF.max_concurrent_live_migrations)"},{"line_number":694,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a4dcd0f_7b58728a","line":691,"updated":"2015-08-12 19:08:00.000000000","message":"Same comment as I had on patch set 1/2","commit_id":"178cb3bbee04fb8954b671bd611d2d5593621c5f"},{"author":{"_account_id":8190,"name":"Drew Thorstensen (thorst)","email":"thorst@us.ibm.com","username":"thorst"},"change_message_id":"4dd4dfa7cdfa470fe92d7863cb78c9319817c2f0","unresolved":false,"context_lines":[{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":134,"context_line":"               default\u003d60,"},{"line_number":135,"context_line":"               help\u003d\u0027Number of times to retry block device\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_b11a9b7b","line":132,"updated":"2015-08-12 20:04:55.000000000","message":"Thanks Dan for the previous response!  I still am a bit concerned about this attribute.\n\nLets say my hypervisor is configured to support 10 concurrent migrations (the default for libvirt).  In my opinion, in your default case, you\u0027d want to target that upper limit.  By doing this, you get higher throughput right out of the box, maintain instance state for the operators, and don\u0027t generally require additional configuration.\n\nIf we ask the drivers for an upper limit, then the operators are really only tuning this down if they find a reason (ex. network).  I would think that would be a minority of operators?  But if we default it to 1, then I think almost all would want to tune that higher (for drivers that support multiple live migrations).\n\nI also think its best to ask the drivers, because each driver will know where to look.  libvirt would look in the libvirt.conf.  PowerVM (the driver I\u0027m working on in stackforge) would ask the system - which evaluates the systems configuration and returns that upper limit.\n\nI don\u0027t really like the behavior of setting it to 0, and then sending them all down to the driver (and hypervisor) to juggle.  It seems like we lose a lot of the value of this queueing state if we do that.  And while they *can* tune that variable to get that benefit, it just feels nicer to me if that default were the upper boundary instead of 1?\n\nI agree the driver will definitely still need to bound on the concurrent live migrations, but just from a usability side this is where my head was at.","commit_id":"75b27b20ff770567fa7672ec7e2fdf8496cdea7f"},{"author":{"_account_id":8190,"name":"Drew Thorstensen (thorst)","email":"thorst@us.ibm.com","username":"thorst"},"change_message_id":"831f24906a4e38c8b7b09960f9b7558689df1f5a","unresolved":false,"context_lines":[{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":134,"context_line":"               default\u003d60,"},{"line_number":135,"context_line":"               help\u003d\u0027Number of times to retry block device\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_7b794d92","line":132,"in_reply_to":"1a4dcd0f_18fccf70","updated":"2015-08-12 21:03:00.000000000","message":"I thought the loss would be the instance state wouldn\u0027t show up as queued?  But I could be misreading.\n\nI had been reading the RedHat documentation here:  https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Virtualization_Deployment_and_Administration_Guide/sect-KVM_live_migration-Live_KVM_migration_with_virsh.html\n\n\nSpecifically this line:  \"As the default setting is 20, there is enough to run 10 instances without changing the settings.\"","commit_id":"75b27b20ff770567fa7672ec7e2fdf8496cdea7f"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"2713ff6abe1262b06130467818e9831748b6747d","unresolved":false,"context_lines":[{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":134,"context_line":"               default\u003d60,"},{"line_number":135,"context_line":"               help\u003d\u0027Number of times to retry block device\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_c97e9b18","line":132,"in_reply_to":"1a4dcd0f_5b7b31f5","updated":"2015-08-12 22:17:19.000000000","message":"I agree. I feel like any value higher than 1 is probably the wrong answer for any in tree driver. I\u0027m really not interested in building interfaces for out of tree stuff.  Honestly, I\u0027m currently -1 on this patch because I feel like this config options needs to be *a lot* scarier of \"don\u0027t change this, you\u0027ll be sorry\", because this is one of those tunables that people will think \"oh, if I turn the knob to 11 it will make things go faster\". And not, it will slow down the aggregate completion time, exactly the opposite of what was expected. It will also leave more guests at risk for a longer period of time.","commit_id":"75b27b20ff770567fa7672ec7e2fdf8496cdea7f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1e9d152950369ef52dff8feced70e7a7afb2e90c","unresolved":false,"context_lines":[{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":134,"context_line":"               default\u003d60,"},{"line_number":135,"context_line":"               help\u003d\u0027Number of times to retry block device\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_5b7b31f5","line":132,"in_reply_to":"1a4dcd0f_7b794d92","updated":"2015-08-12 21:14:13.000000000","message":"No, the loss would be that the migration object wouldn\u0027t stay in the queued state (for long). That is only visible in the os-migrations bit of the API, and only to admins.\n\nThat limit is the number of client connections to libvirtd, not the number of concurrent migrations. I think we do all our migrations through a single connection, which means we\u0027re not limited by that, and hence the requirement for this limit in nova.\n\nMaybe others can chime in here if their drivers could even provide such a recommendation. If powervm is the only one, then I\u0027d say we punt on anything dynamic for the moment, especially since that driver is not currently in tree.\n\nEven still, if we\u0027re just going to initialize the semaphore from the driver\u0027s notion at startup, why wouldn\u0027t an op have a puppet fact that returns the driver\u0027s guess and use that to write the nova config? If I have multiple libvirt boxes, some with 10g admin links for live migration, I would likely use the link speed fact and some scaling factor to write the config per-node...","commit_id":"75b27b20ff770567fa7672ec7e2fdf8496cdea7f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ac6e5b69ab2bbd9cdb71d476263d30ae45db2081","unresolved":false,"context_lines":[{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":134,"context_line":"               default\u003d60,"},{"line_number":135,"context_line":"               help\u003d\u0027Number of times to retry block device\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_18fccf70","line":132,"in_reply_to":"1a4dcd0f_b11a9b7b","updated":"2015-08-12 20:49:36.000000000","message":"We don\u0027t have any config options (that I know of) that vary in their defaults based on the driver being used, and the one case that I remember where we had to consider doing such a thing was really painful and not well liked.\n\nWhere do you see that libvirt has a limit of 10 by default? I couldn\u0027t find any reference to such a limit at all.\n\nI don\u0027t see the value in making the behavior of this tunable be complicated by the interplay between it and the driver, and especially in the case where one driver may determine the limit based on current resources, and another by config. I think this is easy to understand as it is. If the driver really does make a better decision than one by config, I don\u0027t think that you\u0027re losing *anything* by setting this to zero and then throttling at the driver level.","commit_id":"75b27b20ff770567fa7672ec7e2fdf8496cdea7f"},{"author":{"_account_id":8190,"name":"Drew Thorstensen (thorst)","email":"thorst@us.ibm.com","username":"thorst"},"change_message_id":"955fabb8d3d1f63710c0bac9e6de4bd38fe2b079","unresolved":false,"context_lines":[{"line_number":129,"context_line":"               help\u003d\u0027Maximum number of instance builds to run concurrently\u0027),"},{"line_number":130,"context_line":"    cfg.IntOpt(\u0027max_concurrent_live_migrations\u0027,"},{"line_number":131,"context_line":"               default\u003d1,"},{"line_number":132,"context_line":"               help\u003d\u0027Maximum number of live migrations to run concurrently\u0027),"},{"line_number":133,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":134,"context_line":"               default\u003d60,"},{"line_number":135,"context_line":"               help\u003d\u0027Number of times to retry block device\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_54a69b0f","line":132,"in_reply_to":"1a4dcd0f_c97e9b18","updated":"2015-08-13 01:47:22.000000000","message":"Thanks Dan \u0026 Sean.  I\u0027m just trying to make sure that as we implement the powervm driver we don\u0027t do anything wrong.  PowerVM will typically support 8, 16, etc... (multiples of 8 I believe, based off of config), so I just wanted to make sure that we were taking advantage of that and not doing anything weird in the driver to try to support that concurrency.\n\nIt seems like the approach for us would be to set this to 0 and let the responsibility go down to the hypervisor.  Or perhaps, as you mentioned, have this as something like puppet could derive.\n\nThanks for walking me through it!","commit_id":"75b27b20ff770567fa7672ec7e2fdf8496cdea7f"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"047c06548e70b23fb763c8b4beab491563684b0a","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                    \u0027overwhelming the host/network and causing failures. It \u0027"},{"line_number":136,"context_line":"                    \u0027is not recommended that you change this unless you are \u0027"},{"line_number":137,"context_line":"                    \u0027very sure that doing so is safe and stable in your \u0027"},{"line_number":138,"context_line":"                    \u0027environment.\u0027),"},{"line_number":139,"context_line":"    cfg.IntOpt(\u0027block_device_allocate_retries\u0027,"},{"line_number":140,"context_line":"               default\u003d60,"},{"line_number":141,"context_line":"               help\u003d\u0027Number of times to retry block device\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_35fac044","line":138,"updated":"2015-08-13 18:09:57.000000000","message":"thanks for making this scary","commit_id":"2c0a306632351fd5bf35ff0ec3f0a133fbe8f1ac"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"da861e9fbc688f940860bd53e94ce226c2e7f998","unresolved":false,"context_lines":[{"line_number":3871,"context_line":"    @mock.patch(\u0027nova.compute.manager.ComputeManager.\u0027"},{"line_number":3872,"context_line":"                \u0027_do_live_migration\u0027)"},{"line_number":3873,"context_line":"    def _test_max_concurrent_live(self, mock_lm, mock_spawn):"},{"line_number":3874,"context_line":"        mock_spawn.side_effect \u003d lambda f, *a, **k: f(*a, **k)"},{"line_number":3875,"context_line":""},{"line_number":3876,"context_line":"        @mock.patch(\u0027nova.objects.Migration.save\u0027)"},{"line_number":3877,"context_line":"        def _do_it(mock_mig_save):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_0aca031b","line":3874,"updated":"2015-08-13 18:04:15.000000000","message":"I thought we were supposed to use this, probably doesn\u0027t matter though:\n\nhttps://github.com/openstack/nova/blob/master/nova/tests/unit/fake_utils.py#L20","commit_id":"2c0a306632351fd5bf35ff0ec3f0a133fbe8f1ac"}],"nova/tests/unit/virt/libvirt/test_driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"da861e9fbc688f940860bd53e94ce226c2e7f998","unresolved":false,"context_lines":[{"line_number":11533,"context_line":"                                                  dstfile, \"qcow2\")"},{"line_number":11534,"context_line":"            mock_define.assert_called_once_with(xmldoc)"},{"line_number":11535,"context_line":""},{"line_number":11536,"context_line":"    @mock.patch.object(utils, \"spawn\")"},{"line_number":11537,"context_line":"    def test_live_migration_hostname_valid(self, mock_spawn):"},{"line_number":11538,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":11539,"context_line":"        drvr.live_migration(self.context, self.test_instance,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_152f843f","side":"PARENT","line":11536,"updated":"2015-08-13 18:04:15.000000000","message":"There is another one of these here:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/tests/unit/virt/libvirt/test_driver.py#n6606","commit_id":"65381d6a427537b3e9799f11b3efe6f3c1d92b91"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b9a3cb2306a29bcef7b6437359bc4d04cadbe8d0","unresolved":false,"context_lines":[{"line_number":11533,"context_line":"                                                  dstfile, \"qcow2\")"},{"line_number":11534,"context_line":"            mock_define.assert_called_once_with(xmldoc)"},{"line_number":11535,"context_line":""},{"line_number":11536,"context_line":"    @mock.patch.object(utils, \"spawn\")"},{"line_number":11537,"context_line":"    def test_live_migration_hostname_valid(self, mock_spawn):"},{"line_number":11538,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":11539,"context_line":"        drvr.live_migration(self.context, self.test_instance,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_d5003c69","side":"PARENT","line":11536,"in_reply_to":"1a4dcd0f_152f843f","updated":"2015-08-13 18:07:16.000000000","message":"This one is different. If you look, it\u0027s calling driver._live_migration(), which has its own spawn inside for something else.","commit_id":"65381d6a427537b3e9799f11b3efe6f3c1d92b91"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"bd451c48981dda08756ab32a2b3a2e97080e23a4","unresolved":false,"context_lines":[{"line_number":11533,"context_line":"                                                  dstfile, \"qcow2\")"},{"line_number":11534,"context_line":"            mock_define.assert_called_once_with(xmldoc)"},{"line_number":11535,"context_line":""},{"line_number":11536,"context_line":"    @mock.patch.object(utils, \"spawn\")"},{"line_number":11537,"context_line":"    def test_live_migration_hostname_valid(self, mock_spawn):"},{"line_number":11538,"context_line":"        drvr \u003d libvirt_driver.LibvirtDriver(fake.FakeVirtAPI(), False)"},{"line_number":11539,"context_line":"        drvr.live_migration(self.context, self.test_instance,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a4dcd0f_9572b4e2","side":"PARENT","line":11536,"in_reply_to":"1a4dcd0f_d5003c69","updated":"2015-08-13 18:11:29.000000000","message":"Ah so it is:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/virt/libvirt/driver.py#n5973\n\ntouche","commit_id":"65381d6a427537b3e9799f11b3efe6f3c1d92b91"}],"nova/virt/libvirt/driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"daf5e43383cb4b14a0d4c1da9b1b62123f044787","unresolved":false,"context_lines":[{"line_number":5427,"context_line":"        if not libvirt_utils.is_valid_hostname(dest):"},{"line_number":5428,"context_line":"            raise exception.InvalidHostname(hostname\u003ddest)"},{"line_number":5429,"context_line":""},{"line_number":5430,"context_line":"        utils.spawn(self._live_migration, context, instance, dest,"},{"line_number":5431,"context_line":"                          post_method, recover_method, block_migration,"},{"line_number":5432,"context_line":"                          migrate_data)"},{"line_number":5433,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1a4dcd0f_5710f458","line":5430,"updated":"2015-08-12 15:53:22.000000000","message":"You can remove the mocks on utils.spawn in the tests now:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/tests/unit/virt/libvirt/test_driver.py#n11533","commit_id":"da8ed47181db4adc2f00193040dfdc8492bd983a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"fc25a44adf029b0884d0a4d5f3ae8730742a9fea","unresolved":false,"context_lines":[{"line_number":5427,"context_line":"        if not libvirt_utils.is_valid_hostname(dest):"},{"line_number":5428,"context_line":"            raise exception.InvalidHostname(hostname\u003ddest)"},{"line_number":5429,"context_line":""},{"line_number":5430,"context_line":"        utils.spawn(self._live_migration, context, instance, dest,"},{"line_number":5431,"context_line":"                          post_method, recover_method, block_migration,"},{"line_number":5432,"context_line":"                          migrate_data)"},{"line_number":5433,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_52a32200","side":"PARENT","line":5430,"updated":"2015-08-12 15:53:48.000000000","message":"You can remove the utils.spawn mocks in the test_driver code now:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/tests/unit/virt/libvirt/test_driver.py#n11533","commit_id":"868d05e4b7b6971c371f30fb0492cf921747570d"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ddeeb3f16df95e44694c579704c02df6697ebd4a","unresolved":false,"context_lines":[{"line_number":5427,"context_line":"        if not libvirt_utils.is_valid_hostname(dest):"},{"line_number":5428,"context_line":"            raise exception.InvalidHostname(hostname\u003ddest)"},{"line_number":5429,"context_line":""},{"line_number":5430,"context_line":"        utils.spawn(self._live_migration, context, instance, dest,"},{"line_number":5431,"context_line":"                          post_method, recover_method, block_migration,"},{"line_number":5432,"context_line":"                          migrate_data)"},{"line_number":5433,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1a4dcd0f_ddabc373","side":"PARENT","line":5430,"in_reply_to":"1a4dcd0f_52a32200","updated":"2015-08-12 16:23:15.000000000","message":"Okay, thanks.","commit_id":"868d05e4b7b6971c371f30fb0492cf921747570d"}]}
