mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-16 01:42:55 +00:00
## Problem When we start compute with newer version of extension (i.e. 1.2) and then rollback the release, downgrading the compute version, next compute start will try to update extension to the latest version available in neon.control (i.e. 1.1). Thus we need to provide downgrade scripts like neon--1.2--1.1.sql These scripts must revert the changes made by the upgrade scripts in the reverse order. This is necessary to ensure that the next upgrade will work correctly. In general, we need to write upgrade and downgrade scripts to be more robust and add IF EXISTS / CREATE OR REPLACE clauses to all statements (where applicable). ## Summary of changes Adds downgrade scripts. Adds test cases for extension downgrade/upgrade. fixes #7066 This is a follow-up for https://app.incident.io/neondb/incidents/167?tab=follow-ups Signed-off-by: Alex Chi Z <chi@neon.tech> Co-authored-by: Alex Chi Z <iskyzh@gmail.com> Co-authored-by: Anastasia Lubennikova <anastasia@neon.tech>
63 lines
2.7 KiB
Python
63 lines
2.7 KiB
Python
from contextlib import closing
|
|
|
|
from fixtures.log_helper import log
|
|
from fixtures.neon_fixtures import NeonEnvBuilder
|
|
|
|
|
|
# Verify that the neon extension is installed and has the correct version.
|
|
def test_neon_extension(neon_env_builder: NeonEnvBuilder):
|
|
env = neon_env_builder.init_start()
|
|
env.neon_cli.create_branch("test_create_extension_neon")
|
|
|
|
endpoint_main = env.endpoints.create("test_create_extension_neon")
|
|
# don't skip pg_catalog updates - it runs CREATE EXTENSION neon
|
|
endpoint_main.respec(skip_pg_catalog_updates=False)
|
|
endpoint_main.start()
|
|
|
|
with closing(endpoint_main.connect()) as conn:
|
|
with conn.cursor() as cur:
|
|
cur.execute("SELECT extversion from pg_extension where extname='neon'")
|
|
# If this fails, it means the extension is either not installed
|
|
# or was updated and the version is different.
|
|
#
|
|
# IMPORTANT:
|
|
# If the version has changed, the test should be updated.
|
|
# Ensure that the default version is also updated in the neon.control file
|
|
assert cur.fetchone() == ("1.3",)
|
|
cur.execute("SELECT * from neon.NEON_STAT_FILE_CACHE")
|
|
res = cur.fetchall()
|
|
log.info(res)
|
|
assert len(res) == 1
|
|
assert len(res[0]) == 5
|
|
|
|
|
|
# Verify that the neon extension can be upgraded/downgraded.
|
|
def test_neon_extension_compatibility(neon_env_builder: NeonEnvBuilder):
|
|
env = neon_env_builder.init_start()
|
|
env.neon_cli.create_branch("test_neon_extension_compatibility")
|
|
|
|
endpoint_main = env.endpoints.create("test_neon_extension_compatibility")
|
|
# don't skip pg_catalog updates - it runs CREATE EXTENSION neon
|
|
endpoint_main.respec(skip_pg_catalog_updates=False)
|
|
endpoint_main.start()
|
|
|
|
with closing(endpoint_main.connect()) as conn:
|
|
with conn.cursor() as cur:
|
|
all_versions = ["1.3", "1.2", "1.1", "1.0"]
|
|
current_version = "1.3"
|
|
for idx, begin_version in enumerate(all_versions):
|
|
for target_version in all_versions[idx + 1 :]:
|
|
if current_version != begin_version:
|
|
cur.execute(
|
|
f"ALTER EXTENSION neon UPDATE TO '{begin_version}'; -- {current_version}->{begin_version}"
|
|
)
|
|
current_version = begin_version
|
|
# downgrade
|
|
cur.execute(
|
|
f"ALTER EXTENSION neon UPDATE TO '{target_version}'; -- {begin_version}->{target_version}"
|
|
)
|
|
# upgrade
|
|
cur.execute(
|
|
f"ALTER EXTENSION neon UPDATE TO '{begin_version}'; -- {target_version}->{begin_version}"
|
|
)
|