From f76ae7f854d4da05410074b8854a1046907fa246 Mon Sep 17 00:00:00 2001 From: Steve Baker Date: Wed, 4 Apr 2018 02:25:15 +0000 Subject: [PATCH] Switch to concurrent.futures for container prepare/upload Using process based concurrency doesn't work with mistral's threading model. Switching to concurrent.futures allows the threading executor to be used instead. Change-Id: I2c7a1a7cb8d8e195e041b5b185c1ceba3a6d0e86 --- requirements.txt | 1 + setup.cfg | 1 + tripleo_common/image/image_uploader.py | 6 +++--- tripleo_common/tests/image/test_image_uploader.py | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) diff --git a/requirements.txt b/requirements.txt index 684a85694..c129373ac 100644 --- a/requirements.txt +++ b/requirements.txt @@ -27,3 +27,4 @@ python-zaqarclient>=1.0.0 # Apache-2.0 python-keystoneclient>=3.8.0 # Apache-2.0 keystoneauth1>=3.4.0 # Apache-2.0 tenacity>=4.4.0 # Apache-2.0 +futures>=3.0.0;python_version=='2.7' or python_version=='2.6' # BSD diff --git a/setup.cfg b/setup.cfg index 12cf2af61..7f4c705ac 100644 --- a/setup.cfg +++ b/setup.cfg @@ -81,6 +81,7 @@ mistral.actions = tripleo.config.download_config = tripleo_common.actions.config:DownloadConfigAction tripleo.config.get_overcloud_config = tripleo_common.actions.config:GetOvercloudConfig tripleo.container_images.prepare = tripleo_common.actions.container_images:PrepareContainerImageEnv + tripleo.container_images.prepare_upload = tripleo_common.actions.container_images:PrepareUploadContainerImages tripleo.deployment.config = tripleo_common.actions.deployment:OrchestrationDeployAction tripleo.deployment.deploy = tripleo_common.actions.deployment:DeployStackAction tripleo.deployment.overcloudrc = tripleo_common.actions.deployment:OvercloudRcAction diff --git a/tripleo_common/image/image_uploader.py b/tripleo_common/image/image_uploader.py index a022f1f2a..04f74b6f9 100644 --- a/tripleo_common/image/image_uploader.py +++ b/tripleo_common/image/image_uploader.py @@ -15,9 +15,9 @@ import abc +from concurrent import futures import json import logging -import multiprocessing import netifaces import os import requests @@ -323,7 +323,7 @@ class DockerImageUploader(ImageUploader): for image in images: discover_args.append((image, tag_from_label, self.insecure_registries)) - p = multiprocessing.Pool(16) + p = futures.ThreadPoolExecutor(max_workers=16) versioned_images = {} for image, versioned_image in p.map(discover_tag_from_inspect, @@ -376,7 +376,7 @@ class DockerImageUploader(ImageUploader): # workers will be half the CPU count, to a minimum of 2 workers = max(2, processutils.get_worker_count() // 2) - p = multiprocessing.Pool(workers) + p = futures.ThreadPoolExecutor(max_workers=workers) for result in p.map(docker_upload, self.upload_tasks): local_images.extend(result) diff --git a/tripleo_common/tests/image/test_image_uploader.py b/tripleo_common/tests/image/test_image_uploader.py index 27c338682..b694c7eba 100644 --- a/tripleo_common/tests/image/test_image_uploader.py +++ b/tripleo_common/tests/image/test_image_uploader.py @@ -396,7 +396,7 @@ class TestDockerImageUploader(base.TestCase): ('docker.io/t/foo', 'rdo_version', sr) ) - @mock.patch('multiprocessing.Pool') + @mock.patch('concurrent.futures.ThreadPoolExecutor') def test_discover_image_tags(self, mock_pool): mock_pool.return_value.map.return_value = ( ('docker.io/t/foo', 'a'),