diff --git a/.github/actions/run-python-test-set/action.yml b/.github/actions/run-python-test-set/action.yml index bb120e9470..4493985587 100644 --- a/.github/actions/run-python-test-set/action.yml +++ b/.github/actions/run-python-test-set/action.yml @@ -71,12 +71,12 @@ runs: path: /tmp/neon-previous prefix: latest - - name: Download compatibility snapshot for Postgres 14 - if: inputs.build_type != 'remote' && inputs.pg_version == 'v14' + - name: Download compatibility snapshot + if: inputs.build_type != 'remote' uses: ./.github/actions/download with: - name: compatibility-snapshot-${{ inputs.build_type }}-pg14 - path: /tmp/compatibility_snapshot_pg14 + name: compatibility-snapshot-${{ inputs.build_type }}-pg${{ inputs.pg_version }} + path: /tmp/compatibility_snapshot_pg${{ inputs.pg_version }} prefix: latest - name: Checkout @@ -106,7 +106,7 @@ runs: BUILD_TYPE: ${{ inputs.build_type }} AWS_ACCESS_KEY_ID: ${{ inputs.real_s3_access_key_id }} AWS_SECRET_ACCESS_KEY: ${{ inputs.real_s3_secret_access_key }} - COMPATIBILITY_SNAPSHOT_DIR: /tmp/compatibility_snapshot_pg14 + COMPATIBILITY_SNAPSHOT_DIR: /tmp/compatibility_snapshot_pg${{ inputs.pg_version }} ALLOW_BACKWARD_COMPATIBILITY_BREAKAGE: contains(github.event.pull_request.labels.*.name, 'backward compatibility breakage') ALLOW_FORWARD_COMPATIBILITY_BREAKAGE: contains(github.event.pull_request.labels.*.name, 'forward compatibility breakage') RERUN_FLAKY: ${{ inputs.rerun_flaky }} @@ -197,13 +197,13 @@ runs: scripts/generate_and_push_perf_report.sh fi - - name: Upload compatibility snapshot for Postgres 14 - if: github.ref_name == 'release' && inputs.pg_version == 'v14' + - name: Upload compatibility snapshot + if: github.ref_name == 'release' uses: ./.github/actions/upload with: - name: compatibility-snapshot-${{ inputs.build_type }}-pg14-${{ github.run_id }} + name: compatibility-snapshot-${{ inputs.build_type }}-pg${{ inputs.pg_version }}-${{ github.run_id }} # Directory is created by test_compatibility.py::test_create_snapshot, keep the path in sync with the test - path: /tmp/test_output/compatibility_snapshot_pg14/ + path: /tmp/test_output/compatibility_snapshot_pg${{ inputs.pg_version }}/ prefix: latest - name: Upload test results diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 9114e02622..5d588aaa85 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -957,7 +957,7 @@ jobs: promote-compatibility-data: runs-on: [ self-hosted, gen3, small ] container: - image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/rust:pinned + image: 369495373322.dkr.ecr.eu-central-1.amazonaws.com/base:pinned options: --init needs: [ promote-images, tag, regress-tests ] if: github.ref_name == 'release' && github.event_name != 'workflow_dispatch' @@ -968,11 +968,13 @@ jobs: PREFIX: artifacts/latest run: | # Update compatibility snapshot for the release - for build_type in debug release; do - OLD_FILENAME=compatibility-snapshot-${build_type}-pg14-${GITHUB_RUN_ID}.tar.zst - NEW_FILENAME=compatibility-snapshot-${build_type}-pg14.tar.zst + for pg_version in v14 v15; do + for build_type in debug release; do + OLD_FILENAME=compatibility-snapshot-${build_type}-pg${pg_version}-${GITHUB_RUN_ID}.tar.zst + NEW_FILENAME=compatibility-snapshot-${build_type}-pg${pg_version}.tar.zst - time aws s3 mv --only-show-errors s3://${BUCKET}/${PREFIX}/${OLD_FILENAME} s3://${BUCKET}/${PREFIX}/${NEW_FILENAME} + time aws s3 mv --only-show-errors s3://${BUCKET}/${PREFIX}/${OLD_FILENAME} s3://${BUCKET}/${PREFIX}/${NEW_FILENAME} + done done # Update Neon artifact for the release (reuse already uploaded artifact) diff --git a/test_runner/fixtures/neon_fixtures.py b/test_runner/fixtures/neon_fixtures.py index 1a480e1b04..8ec17834ac 100644 --- a/test_runner/fixtures/neon_fixtures.py +++ b/test_runner/fixtures/neon_fixtures.py @@ -149,7 +149,7 @@ def top_output_dir(base_dir: Path) -> Iterator[Path]: @pytest.fixture(scope="session") def versioned_pg_distrib_dir(pg_distrib_dir: Path, pg_version: PgVersion) -> Iterator[Path]: - versioned_dir = pg_distrib_dir / f"v{pg_version}" + versioned_dir = pg_distrib_dir / pg_version.v_prefixed psql_bin_path = versioned_dir / "bin/psql" postgres_bin_path = versioned_dir / "bin/postgres" @@ -1745,8 +1745,8 @@ class PgBin: def __init__(self, log_dir: Path, pg_distrib_dir: Path, pg_version: PgVersion): self.log_dir = log_dir self.pg_version = pg_version - self.pg_bin_path = pg_distrib_dir / f"v{pg_version}" / "bin" - self.pg_lib_dir = pg_distrib_dir / f"v{pg_version}" / "lib" + self.pg_bin_path = pg_distrib_dir / pg_version.v_prefixed / "bin" + self.pg_lib_dir = pg_distrib_dir / pg_version.v_prefixed / "lib" self.env = os.environ.copy() self.env["LD_LIBRARY_PATH"] = str(self.pg_lib_dir) diff --git a/test_runner/fixtures/pg_version.py b/test_runner/fixtures/pg_version.py index 554f841d14..d67f088365 100644 --- a/test_runner/fixtures/pg_version.py +++ b/test_runner/fixtures/pg_version.py @@ -27,6 +27,12 @@ class PgVersion(str, enum.Enum): def __repr__(self) -> str: return f"'{self.value}'" + # In GitHub workflows we use Postgres version with v-prefix (e.g. v14 instead of just 14), + # sometime we need to do so in tests. + @property + def v_prefixed(self) -> str: + return f"v{self.value}" + @classmethod def _missing_(cls, value) -> Optional["PgVersion"]: known_values = {v.value for _, v in cls.__members__.items()} diff --git a/test_runner/regress/test_compatibility.py b/test_runner/regress/test_compatibility.py index 7bc12847b7..fe8dc293c1 100644 --- a/test_runner/regress/test_compatibility.py +++ b/test_runner/regress/test_compatibility.py @@ -16,7 +16,7 @@ from fixtures.neon_fixtures import ( ) from fixtures.pageserver.http import PageserverHttpClient from fixtures.pageserver.utils import wait_for_last_record_lsn, wait_for_upload -from fixtures.pg_version import PgVersion, skip_on_postgres +from fixtures.pg_version import PgVersion from fixtures.types import Lsn from pytest import FixtureRequest @@ -41,7 +41,6 @@ check_ondisk_data_compatibility_if_enabled = pytest.mark.skipif( ) -@skip_on_postgres(PgVersion.V15, "Compatibility tests doesn't support Postgres 15 yet") @pytest.mark.xdist_group("compatibility") @pytest.mark.order(before="test_forward_compatibility") def test_create_snapshot( @@ -49,12 +48,13 @@ def test_create_snapshot( pg_bin: PgBin, top_output_dir: Path, test_output_dir: Path, + pg_version: PgVersion, ): # The test doesn't really test anything # it creates a new snapshot for releases after we tested the current version against the previous snapshot in `test_backward_compatibility`. # # There's no cleanup here, it allows to adjust the data in `test_backward_compatibility` itself without re-collecting it. - neon_env_builder.pg_version = PgVersion.V14 + neon_env_builder.pg_version = pg_version neon_env_builder.num_safekeepers = 3 neon_env_builder.enable_local_fs_remote_storage() neon_env_builder.preserve_database_files = True @@ -90,13 +90,14 @@ def test_create_snapshot( env.pageserver.stop() # Directory `compatibility_snapshot_dir` is uploaded to S3 in a workflow, keep the name in sync with it - compatibility_snapshot_dir = top_output_dir / "compatibility_snapshot_pg14" + compatibility_snapshot_dir = ( + top_output_dir / f"compatibility_snapshot_pg{pg_version.v_prefixed}" + ) if compatibility_snapshot_dir.exists(): shutil.rmtree(compatibility_snapshot_dir) shutil.copytree(test_output_dir, compatibility_snapshot_dir) -@skip_on_postgres(PgVersion.V15, "Compatibility tests doesn't support Postgres 15 yet") @check_ondisk_data_compatibility_if_enabled @pytest.mark.xdist_group("compatibility") @pytest.mark.order(after="test_create_snapshot") @@ -115,7 +116,7 @@ def test_backward_compatibility( compatibility_snapshot_dir_env = os.environ.get("COMPATIBILITY_SNAPSHOT_DIR") assert ( compatibility_snapshot_dir_env is not None - ), "COMPATIBILITY_SNAPSHOT_DIR is not set. It should be set to `compatibility_snapshot_pg14` path generateted by test_create_snapshot (ideally generated by the previous version of Neon)" + ), f"COMPATIBILITY_SNAPSHOT_DIR is not set. It should be set to `compatibility_snapshot_pg{pg_version.v_prefixed}` path generateted by test_create_snapshot (ideally generated by the previous version of Neon)" compatibility_snapshot_dir = Path(compatibility_snapshot_dir_env).resolve() breaking_changes_allowed = ( @@ -155,7 +156,6 @@ def test_backward_compatibility( ), "Breaking changes are allowed by ALLOW_BACKWARD_COMPATIBILITY_BREAKAGE, but the test has passed without any breakage" -@skip_on_postgres(PgVersion.V15, "Compatibility tests doesn't support Postgres 15 yet") @check_ondisk_data_compatibility_if_enabled @pytest.mark.xdist_group("compatibility") @pytest.mark.order(after="test_create_snapshot") @@ -183,7 +183,9 @@ def test_forward_compatibility( ), "COMPATIBILITY_POSTGRES_DISTRIB_DIR is not set. It should be set to a pg_install directrory (ideally generated by the previous version of Neon)" compatibility_postgres_distrib_dir = Path(compatibility_postgres_distrib_dir_env).resolve() - compatibility_snapshot_dir = top_output_dir / "compatibility_snapshot_pg14" + compatibility_snapshot_dir = ( + top_output_dir / f"compatibility_snapshot_pg{pg_version.v_prefixed}" + ) breaking_changes_allowed = ( os.environ.get("ALLOW_FORWARD_COMPATIBILITY_BREAKAGE", "false").lower() == "true" diff --git a/test_runner/regress/test_pg_regress.py b/test_runner/regress/test_pg_regress.py index a1d2a56d8a..505d8d4129 100644 --- a/test_runner/regress/test_pg_regress.py +++ b/test_runner/regress/test_pg_regress.py @@ -33,8 +33,8 @@ def test_pg_regress( (runpath / "testtablespace").mkdir(parents=True) # Compute all the file locations that pg_regress will need. - build_path = pg_distrib_dir / f"build/v{env.pg_version}/src/test/regress" - src_path = base_dir / f"vendor/postgres-v{env.pg_version}/src/test/regress" + build_path = pg_distrib_dir / f"build/{env.pg_version.v_prefixed}/src/test/regress" + src_path = base_dir / f"vendor/postgres-{env.pg_version.v_prefixed}/src/test/regress" bindir = pg_distrib_dir / f"v{env.pg_version}/bin" schedule = src_path / "parallel_schedule" pg_regress = build_path / "pg_regress" @@ -97,8 +97,8 @@ def test_isolation( (runpath / "testtablespace").mkdir(parents=True) # Compute all the file locations that pg_isolation_regress will need. - build_path = pg_distrib_dir / f"build/v{env.pg_version}/src/test/isolation" - src_path = base_dir / f"vendor/postgres-v{env.pg_version}/src/test/isolation" + build_path = pg_distrib_dir / f"build/{env.pg_version.v_prefixed}/src/test/isolation" + src_path = base_dir / f"vendor/postgres-{env.pg_version.v_prefixed}/src/test/isolation" bindir = pg_distrib_dir / f"v{env.pg_version}/bin" schedule = src_path / "isolation_schedule" pg_isolation_regress = build_path / "pg_isolation_regress"