This is an automated email from the ASF dual-hosted git repository.

potiuk pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/airflow.git


The following commit(s) were added to refs/heads/main by this push:
     new 741332c0a3 Optimize startup time for parallel tests (#40388)
741332c0a3 is described below

commit 741332c0a324b7af7b94ff999fdc05e0d3fb7341
Author: Jarek Potiuk <[email protected]>
AuthorDate: Sun Jun 23 20:11:46 2024 +0200

    Optimize startup time for parallel tests (#40388)
    
    When parallell tests start on CI, they are running parallel docker
    compose's and on a clean machine in CI this means that every parallel
    test is pulling the images needed to run tests. This means that
    backend images are pulled in parallell by all starting parallel runs.
    
    This PR optimizes this step - before running the tests in parallel
    we run `docker compose pull` once with the same compose files as
    tests - this will pull the necessary images only once.
    
    It should save a few seconds and save a lot of unnecessary traffic
    for CI tests - where same image is pulled multiple times - especially
    for self-hosted runners of ours where we run 8 docker compose instances
    in parallel.
---
 .../airflow_breeze/commands/testing_commands.py    | 22 ++++++++++++++++------
 .../src/airflow_breeze/params/shell_params.py      |  6 ++++--
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/dev/breeze/src/airflow_breeze/commands/testing_commands.py 
b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
index bb00cb1110..76e60fa7b2 100644
--- a/dev/breeze/src/airflow_breeze/commands/testing_commands.py
+++ b/dev/breeze/src/airflow_breeze/commands/testing_commands.py
@@ -153,14 +153,11 @@ def _run_test(
     shell_params: ShellParams,
     extra_pytest_args: tuple,
     python_version: str,
-    db_reset: bool,
     output: Output | None,
     test_timeout: int,
     output_outside_the_group: bool = False,
     skip_docker_compose_down: bool = False,
 ) -> tuple[int, str]:
-    shell_params.run_tests = True
-    shell_params.db_reset = db_reset
     if "[" in shell_params.test_type and not 
shell_params.test_type.startswith("Providers"):
         get_console(output=output).print(
             "[error]Only 'Providers' test type can specify actual tests with 
\\[\\][/]"
@@ -321,7 +318,6 @@ def _run_tests_in_pool(
                         "shell_params": 
shell_params.clone_with_test(test_type=test_type),
                         "extra_pytest_args": extra_pytest_args,
                         "python_version": shell_params.python,
-                        "db_reset": db_reset,
                         "output": outputs[index],
                         "test_timeout": test_timeout,
                         "skip_docker_compose_down": skip_docker_compose_down,
@@ -341,6 +337,17 @@ def _run_tests_in_pool(
     )
 
 
+def pull_images_for_docker_compose(shell_params: ShellParams):
+    get_console().print("Pulling images once before parallel run\n")
+    env = shell_params.env_variables_for_docker_commands
+    pull_cmd = [
+        "docker",
+        "compose",
+        "pull",
+    ]
+    run_command(pull_cmd, output=None, check=False, env=env)
+
+
 def run_tests_in_parallel(
     shell_params: ShellParams,
     extra_pytest_args: tuple,
@@ -363,6 +370,7 @@ def run_tests_in_parallel(
     get_console().print(f"[info]Skip docker-compose down: 
{skip_docker_compose_down}")
     get_console().print("[info]Shell params:")
     get_console().print(shell_params.__dict__)
+    pull_images_for_docker_compose(shell_params)
     _run_tests_in_pool(
         tests_to_run=shell_params.parallel_test_types_list,
         parallelism=parallelism,
@@ -752,6 +760,8 @@ def _run_test_command(
         use_airflow_version=use_airflow_version,
         use_packages_from_dist=use_packages_from_dist,
         use_xdist=use_xdist,
+        run_tests=True,
+        db_reset=db_reset,
     )
     rebuild_or_pull_ci_image_if_needed(command_params=shell_params)
     fix_ownership_using_docker()
@@ -798,7 +808,6 @@ def _run_test_command(
             shell_params=shell_params,
             extra_pytest_args=extra_pytest_args,
             python_version=python,
-            db_reset=db_reset,
             output=None,
             test_timeout=test_timeout,
             output_outside_the_group=True,
@@ -866,6 +875,8 @@ def integration_tests(
         skip_provider_tests=skip_provider_tests,
         test_type="Integration",
         force_sa_warnings=force_sa_warnings,
+        run_tests=True,
+        db_reset=db_reset,
     )
     fix_ownership_using_docker()
     cleanup_python_generated_files()
@@ -874,7 +885,6 @@ def integration_tests(
         shell_params=shell_params,
         extra_pytest_args=extra_pytest_args,
         python_version=python,
-        db_reset=db_reset,
         output=None,
         test_timeout=test_timeout,
         output_outside_the_group=True,
diff --git a/dev/breeze/src/airflow_breeze/params/shell_params.py 
b/dev/breeze/src/airflow_breeze/params/shell_params.py
index dd1bdbbfa5..f195bf4c96 100644
--- a/dev/breeze/src/airflow_breeze/params/shell_params.py
+++ b/dev/breeze/src/airflow_breeze/params/shell_params.py
@@ -459,11 +459,13 @@ class ShellParams:
     def rootless_docker(self) -> bool:
         return is_docker_rootless()
 
-    @cached_property
+    @property
     def env_variables_for_docker_commands(self) -> dict[str, str]:
         """
         Constructs environment variables needed by the docker-compose command, 
based on Shell parameters
-        passed to it.
+        passed to it. We cannot cache this property because it can be run few 
times after modifying shell
+        params - for example when we first run "pull" on images before tests 
anda then run tests - each
+        separately with different test types.
 
         This is the only place where you need to add environment variables if 
you want to pass them to
         docker or docker-compose.

Reply via email to