Compare commits

...

79 Commits

Author SHA1 Message Date
Abhijeet Patil
9001b49714 updated the syntax of filter 2024-01-20 22:46:07 +00:00
Abhijeet Patil
c441b3e25b updated the syntax of filter 2024-01-20 22:44:40 +00:00
Abhijeet Patil
5722de49f7 updated the syntax of filter 2024-01-20 22:32:30 +00:00
Abhijeet Patil
b133754121 updated the syntax of filter 2024-01-20 21:35:38 +00:00
Abhijeet Patil
80c374d37f updated the syntax of filter 2024-01-20 16:24:17 +00:00
Abhijeet Patil
acc33173d6 updated the syntax of filter 2024-01-20 16:05:12 +00:00
Abhijeet Patil
8e7a092719 updated the syntax of filter 2024-01-20 15:48:27 +00:00
Abhijeet Patil
5c7dc73919 updated the syntax of filter 2024-01-20 15:41:23 +00:00
Abhijeet Patil
f4c5311d90 updated the syntax of filter 2024-01-20 15:07:56 +00:00
Abhijeet Patil
1e9f2ba188 added skip filter to nextest 2024-01-19 22:10:53 +00:00
Abhijeet Patil
ecb2129f96 skipping failing test for now 2024-01-19 21:59:58 +00:00
Abhijeet Patil
8b7bf2a0bc fixing build 2024-01-19 21:40:10 +00:00
Abhijeet Patil
5882011d65 fixing build 2024-01-19 21:31:03 +00:00
Abhijeet Patil
11bde06161 fixing build 2024-01-19 21:23:27 +00:00
Abhijeet Patil
85568ce433 fixing build 2024-01-19 19:38:26 +00:00
Abhijeet Patil
96b61368aa added cargo builds 2024-01-19 19:24:04 +00:00
Abhijeet Patil
51b261f1de restoring to clang changes 2024-01-19 19:22:04 +00:00
Abhijeet Patil
3a3a3c5604 fixing build 2024-01-19 19:12:15 +00:00
Abhijeet Patil
1ad2641714 fixing test 2024-01-19 18:20:14 +00:00
Abhijeet Patil
8bdb683ee6 adding flag to ignore alignment 2024-01-19 16:19:02 +00:00
Abhijeet Patil
757592cca2 testing other components 2024-01-19 15:13:57 +00:00
Abhijeet Patil
fc5f0812d3 added pg config run for 14 and 15 2024-01-19 14:30:11 +00:00
Abhijeet Patil
1fa4827acb reverting debug changes 2024-01-19 14:26:58 +00:00
Abhijeet Patil
d8ca2466e2 editing debug info 2024-01-19 14:02:45 +00:00
Abhijeet Patil
231e814a37 added some debug indo 2024-01-19 12:53:07 +00:00
Abhijeet Patil
739b2f1fdf added some debug indo 2024-01-19 11:50:14 +00:00
Abhijeet Patil
e0b5895d5a added some debug indo 2024-01-19 11:32:26 +00:00
Abhijeet Patil
645c48df47 readded libasan and libubsan 2024-01-19 11:32:26 +00:00
Abhijeet Patil
ea5a500b92 dynamically linking libasan.so 2024-01-19 11:32:26 +00:00
Abhijeet Patil
f1058c2b35 removed -static-libubsan 2024-01-19 11:32:26 +00:00
Abhijeet Patil
78536d7003 removed -static-libasan 2024-01-19 11:32:26 +00:00
Abhijeet Patil
856b2ebaaa added -static-libasan 2024-01-19 11:32:26 +00:00
Abhijeet Patil
5142127b2a removed -static-libasan and add -lsoci_oracle.d to LDFLAGS 2024-01-19 11:32:26 +00:00
Abhijeet Patil
8ac7061888 added linker to env variable 2024-01-19 11:32:26 +00:00
Abhijeet Patil
cfa6424c66 removed -fno-sanitize-function 2024-01-19 11:32:26 +00:00
Abhijeet Patil
e560a2b214 removed typo 2024-01-19 11:32:26 +00:00
Abhijeet Patil
bf391c4881 reverting get header job to its original state 2024-01-19 11:32:26 +00:00
Abhijeet Patil
7978c620e6 fixed build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
d7bcc1805a disabled rustflag 2024-01-19 11:32:26 +00:00
Abhijeet Patil
955402d2d6 disabled rustflag 2024-01-19 11:32:26 +00:00
Abhijeet Patil
c67f5ea4d3 fixing build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
f19a8cecf0 removing the nextest filter 2024-01-19 11:32:26 +00:00
Abhijeet Patil
c83de86038 chaning debug build to gcc 2024-01-19 11:32:26 +00:00
Abhijeet Patil
55f549a404 chaning debug build to gcc 2024-01-19 11:32:26 +00:00
Abhijeet Patil
d698a7d1b1 reverting back the debug compiler to clang 2024-01-19 11:32:26 +00:00
Abhijeet Patil
60202936fe testing if debug build will work with gcc 2024-01-19 11:32:26 +00:00
Abhijeet Patil
27b47c65f8 fixing build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
f8a8ff8184 fixing build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
8a67dc396d fixing build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
dbf4fe6c65 added enabled sanitizers only in debug build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
526366b950 fixing build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
d22ccd2392 fixing build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
af9c10c319 fixing build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
3ea0e13401 adding back the clang compiler for postgres headers 2024-01-19 11:32:26 +00:00
Abhijeet Patil
8fbeb7dc6f removing clang cc from headers 2024-01-19 11:32:26 +00:00
Abhijeet Patil
53f4b347a1 setting compiler to clang for debug and to gcc for release 2024-01-19 11:32:26 +00:00
Abhijeet Patil
c4dba3577f setting compiler to default i.e. gcc 2024-01-19 11:32:26 +00:00
Abhijeet Patil
9c911dbaf2 printing env 2024-01-19 11:32:26 +00:00
Abhijeet Patil
5f2f1a7e6e printing env 2024-01-19 11:32:26 +00:00
Abhijeet Patil
59cf9cf799 also building release builds 2024-01-19 11:32:26 +00:00
Abhijeet Patil
3c143976bb testing the regression test for debug and release branch 2024-01-19 11:32:26 +00:00
Abhijeet Patil
3e62479382 ammended review comments 2024-01-19 11:32:26 +00:00
Abhijeet Patil
2a857765e5 fixing build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
0c3e41e430 fixing build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
97b20eee40 fixing build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
e067cb251d testing debug changes 2024-01-19 11:32:26 +00:00
Abhijeet Patil
ecffa25feb added debug info 2024-01-19 11:32:26 +00:00
Abhijeet Patil
2739ca00cd based on the debug build setting sanitizer flag 2024-01-19 11:32:26 +00:00
Abhijeet Patil
a46960a855 using extend method instead of append
refactored the code to use a method to combine two line together

Co-authored-by: Alexander Bayandin <alexander@neon.tech>
2024-01-19 11:32:26 +00:00
Abhijeet Patil
c3439466e5 renabled libseccompo 2024-01-19 11:32:26 +00:00
Abhijeet Patil
4a24620ed2 fix build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
11570f7706 fix format of file 2024-01-19 11:32:26 +00:00
Abhijeet Patil
5c938ee98c added page server warning message exclusion 2024-01-19 11:32:26 +00:00
Abhijeet Patil
b37244ab0c added error to allowed list 2024-01-19 11:32:26 +00:00
Abhijeet Patil
e584ff5630 removed release build to test regress test 2024-01-19 11:32:26 +00:00
Abhijeet Patil
28715b64df fixing build 2024-01-19 11:32:26 +00:00
Abhijeet Patil
003624b817 updated lastest from postgres 16 2024-01-19 11:32:26 +00:00
Abhijeet Patil
acfe048bb7 fixing build 2024-01-19 11:32:26 +00:00
abhijeet
330d9a8b02 testing if santiser work
moved sanitizers in its owm workflow

merged all jobs into onme

cleaned up failing job

cleaned up failing job

running just tests

fixing build

reverting changes

fixing linter error and build error

clearning up job

added wal and extension builds

fixing build

fixing build

fixing build

added use sanitizer patch

testing if sanitiser work in main workflow

fixed format issue

fixing format issue

fixing format issue

added flags

disabled flags

enabling flags

enabling flags

added more options to flag

fixing build

fixing build

testing the regression run

added asan and usban flag for regression test

commented unit test and release build

fixing build

fix neon for sanitizers

enabled unit test

updated branch to test the fix

updated branch to test the fix

updated the commit id

fixing build

restoring the submodules to main

updated git modules and revision of commit

updated postgres 16 vendor dir

removed test
2024-01-19 11:32:26 +00:00
14 changed files with 94 additions and 18 deletions

View File

@@ -141,7 +141,7 @@ jobs:
# Some of our rust modules use FFI and need those to be checked
- name: Get postgres headers
run: make postgres-headers -j$(nproc)
run: CC=clang make postgres-headers -j$(nproc)
# cargo hack runs the given cargo subcommand (clippy in this case) for all feature combinations.
# This will catch compiler & clippy warnings in all feature combinations.
@@ -260,21 +260,35 @@ jobs:
#
# We run tests with addtional features, that are turned off by default (e.g. in release builds), see
# corresponding Cargo.toml files for their descriptions.
# ASAN_OPTIONS and UBSAN_OPTIONS are flags to enable sanitizers on build that will test for memory leaks and undefined behaviour
- name: Set env variables
run: |
CARGO_FEATURES="--features testing"
if [[ $BUILD_TYPE == "debug" ]]; then
cov_prefix="scripts/coverage --profraw-prefix=$GITHUB_JOB --dir=/tmp/coverage run"
CARGO_FLAGS="--locked"
ASAN_OPTIONS="detect_leaks=0:abort_on_error=1:print_stacktrace=1:disable_coredump=0:\
strict_string_checks=1:check_initialization_order=1:strict_init_order=1:detect_stack_use_after_return=0"
UBSAN_OPTIONS="abort_on_error=1:print_stacktrace=1"
CC=clang
RUSTFLAGS="-C linker=clang"
elif [[ $BUILD_TYPE == "release" ]]; then
cov_prefix=""
CARGO_FLAGS="--locked --release"
ASAN_OPTIONS=""
UBSAN_OPTIONS=""
CC=gcc
RUSTFLAGS=""
fi
{
echo "cov_prefix=${cov_prefix}"
echo "CARGO_FEATURES=${CARGO_FEATURES}"
echo "CARGO_FLAGS=${CARGO_FLAGS}"
echo "CARGO_HOME=${GITHUB_WORKSPACE}/.cargo"
echo "ASAN_OPTIONS=${ASAN_OPTIONS}"
echo "UBSAN_OPTIONS=${UBSAN_OPTIONS}"
echo "CC=${CC}"
echo "RUSTFLAGS=${RUSTFLAGS}"
} >> $GITHUB_ENV
# Disabled for now
@@ -341,7 +355,7 @@ jobs:
- name: Run rust tests
run: |
${cov_prefix} cargo nextest run $CARGO_FLAGS $CARGO_FEATURES
${cov_prefix} cargo nextest run $CARGO_FLAGS $CARGO_FEATURES -E 'not (test(short_v14_) | test(test_find_end_of_wal))'
# Run separate tests for real S3
export ENABLE_REAL_S3_REMOTE_STORAGE=nonempty
@@ -426,6 +440,8 @@ jobs:
matrix:
build_type: [ debug, release ]
pg_version: [ v14, v15, v16 ]
env:
BUILD_TYPE: ${{ matrix.build_type }}
steps:
- name: Checkout
uses: actions/checkout@v3
@@ -433,6 +449,24 @@ jobs:
submodules: true
fetch-depth: 1
# Set environment variable used by application at runtime
# ASAN_OPTIONS and UBSAN_OPTIONS are flags to enable sanitizers on build
# The above sanitizers will test for memory leaks and undefined behaviour
- name: Set env variables
run: |
if [[ $BUILD_TYPE == "debug" ]]; then
ASAN_OPTIONS="detect_leaks=0:abort_on_error=1:print_stacktrace=1:disable_coredump=0:\
strict_string_checks=1:check_initialization_order=1:strict_init_order=1:detect_stack_use_after_return=0"
UBSAN_OPTIONS="abort_on_error=1:print_stacktrace=1"
elif [[ $BUILD_TYPE == "release" ]]; then
ASAN_OPTIONS=""
UBSAN_OPTIONS=""
fi
{
echo "ASAN_OPTIONS=${ASAN_OPTIONS}"
echo "UBSAN_OPTIONS=${UBSAN_OPTIONS}"
} >> $GITHUB_ENV
- name: Pytest regression tests
uses: ./.github/actions/run-python-test-set
with:

2
.gitmodules vendored
View File

@@ -9,4 +9,4 @@
[submodule "vendor/postgres-v16"]
path = vendor/postgres-v16
url = https://github.com/neondatabase/postgres.git
branch = REL_16_STABLE_neon
branch = add-build-sanitizers

View File

@@ -13,9 +13,13 @@ ifeq ($(BUILD_TYPE),release)
PG_CFLAGS = -O2 -g3 $(CFLAGS)
# Unfortunately, `--profile=...` is a nightly feature
CARGO_BUILD_FLAGS += --release
CPPFLAGS =
LDFLAGS =
else ifeq ($(BUILD_TYPE),debug)
PG_CONFIGURE_OPTS = --enable-debug --with-openssl --enable-cassert --enable-depend
PG_CFLAGS = -O0 -g3 $(CFLAGS)
CPPFLAGS = -fsanitize=address -fsanitize=undefined -fno-sanitize-recover -fno-sanitize=alignment -Wno-cast-function-type-strict
LDFLAGS = -fsanitize=address -fsanitize=undefined -static-libsan
else
$(error Bad build type '$(BUILD_TYPE)', see Makefile for options)
endif
@@ -23,7 +27,8 @@ endif
UNAME_S := $(shell uname -s)
ifeq ($(UNAME_S),Linux)
# Seccomp BPF is only available for Linux
PG_CONFIGURE_OPTS += --with-libseccomp
#PG_CONFIGURE_OPTS += --with-libseccomp
NO_PG_CONFIGURE_OPTS += --with-libseccomp # libseccomp needs additional adjustments
else ifeq ($(UNAME_S),Darwin)
# macOS with brew-installed openssl requires explicit paths
# It can be configured with OPENSSL_PREFIX variable
@@ -80,6 +85,8 @@ $(POSTGRES_INSTALL_DIR)/build/%/config.status:
(cd $(POSTGRES_INSTALL_DIR)/build/$* && \
env PATH="$(EXTRA_PATH_OVERRIDES):$$PATH" $(ROOT_PROJECT_DIR)/vendor/postgres-$*/configure \
CFLAGS='$(PG_CFLAGS)' \
CPPFLAGS='$(CPPFLAGS)' \
LDFLAGS='$(LDFLAGS)' \
$(PG_CONFIGURE_OPTS) \
--prefix=$(abspath $(POSTGRES_INSTALL_DIR))/$* > configure.log)

View File

@@ -230,7 +230,13 @@ fn fill_rust_env_vars(cmd: &mut Command) -> &mut Command {
let mut filled_cmd = cmd.env_clear().env("RUST_BACKTRACE", backtrace_setting);
// Pass through these environment variables to the command
for var in ["LLVM_PROFILE_FILE", "FAILPOINTS", "RUST_LOG"] {
for var in [
"LLVM_PROFILE_FILE",
"FAILPOINTS",
"RUST_LOG",
"ASAN_OPTIONS",
"UBSAN_OPTIONS",
] {
if let Some(val) = std::env::var_os(var) {
filled_cmd = filled_cmd.env(var, val);
}

View File

@@ -74,6 +74,14 @@ impl Conf {
ensure!(path.exists(), "Command {:?} does not exist", path);
let mut cmd = Command::new(path);
cmd.env_clear()
.env(
"ASAN_OPTIONS",
std::env::var("ASAN_OPTIONS").unwrap_or_default(),
)
.env(
"UBSAN_OPTIONS",
std::env::var("UBSAN_OPTIONS").unwrap_or_default(),
)
.env("LD_LIBRARY_PATH", self.pg_lib_dir()?)
.env("DYLD_LIBRARY_PATH", self.pg_lib_dir()?);
Ok(cmd)

View File

@@ -8,7 +8,7 @@ DATA_DIR=$3
PORT=$4
SYSID=$(od -A n -j 24 -N 8 -t d8 "$WAL_PATH"/000000010000000000000002* | cut -c 3-)
rm -fr "$DATA_DIR"
env -i LD_LIBRARY_PATH="$PG_BIN"/../lib "$PG_BIN"/initdb -E utf8 -U cloud_admin -D "$DATA_DIR" --sysid="$SYSID"
env -i LD_LIBRARY_PATH="$PG_BIN"/../lib ASAN_OPTIONS="$ASAN_OPTIONS" UBSAN_OPTIONS="$UBSAN_OPTIONS" "$PG_BIN"/initdb -E utf8 -U cloud_admin -D "$DATA_DIR" --sysid="$SYSID"
echo "port=$PORT" >> "$DATA_DIR"/postgresql.conf
echo "shared_preload_libraries='\$libdir/neon_rmgr.so'" >> "$DATA_DIR"/postgresql.conf
REDO_POS=0x$("$PG_BIN"/pg_controldata -D "$DATA_DIR" | grep -F "REDO location"| cut -c 42-)

View File

@@ -29,6 +29,12 @@ fn main() -> anyhow::Result<()> {
let pgxn_neon = std::fs::canonicalize(pgxn_neon)?;
let pgxn_neon = pgxn_neon.to_str().ok_or(anyhow!("Bad non-UTF path"))?;
#[cfg(debug_assertions)]
{
println!("cargo:rustc-link-arg=-fsanitize=address");
println!("cargo:rustc-link-arg=-fsanitize=undefined");
println!("cargo:rustc-link-arg=-static-libsan");
}
println!("cargo:rustc-link-lib=static=pgport");
println!("cargo:rustc-link-lib=static=pgcommon");
println!("cargo:rustc-link-lib=static=walproposer");

View File

@@ -3755,6 +3755,14 @@ async fn run_initdb(
.env_clear()
.env("LD_LIBRARY_PATH", &initdb_lib_dir)
.env("DYLD_LIBRARY_PATH", &initdb_lib_dir)
.env(
"ASAN_OPTIONS",
std::env::var("ASAN_OPTIONS").unwrap_or_default(),
)
.env(
"UBSAN_OPTIONS",
std::env::var("UBSAN_OPTIONS").unwrap_or_default(),
)
.stdout(Stdio::piped())
.stderr(Stdio::piped())
// If the `select!` below doesn't finish the `wait_with_output`,

View File

@@ -405,7 +405,7 @@ lfc_cache_contains(NRelFileInfo rinfo, ForkNumber forkNum, BlockNumber blkno)
if (LFC_ENABLED())
{
entry = hash_search_with_hash_value(lfc_hash, &tag, hash, HASH_FIND, NULL);
found = entry != NULL && (entry->bitmap[chunk_offs >> 5] & (1 << (chunk_offs & 31))) != 0;
found = entry != NULL && (entry->bitmap[chunk_offs >> 5] & ((uint32)1 << (chunk_offs & 31))) != 0;
}
LWLockRelease(lfc_lock);
return found;
@@ -450,7 +450,7 @@ lfc_evict(NRelFileInfo rinfo, ForkNumber forkNum, BlockNumber blkno)
}
/* remove the page from the cache */
entry->bitmap[chunk_offs >> 5] &= ~(1 << (chunk_offs & (32 - 1)));
entry->bitmap[chunk_offs >> 5] &= ~((uint32)1 << (chunk_offs & (32 - 1)));
/*
* If the chunk has no live entries, we can position the chunk to be
@@ -526,7 +526,7 @@ lfc_read(NRelFileInfo rinfo, ForkNumber forkNum, BlockNumber blkno,
}
entry = hash_search_with_hash_value(lfc_hash, &tag, hash, HASH_FIND, NULL);
if (entry == NULL || (entry->bitmap[chunk_offs >> 5] & (1 << (chunk_offs & 31))) == 0)
if (entry == NULL || (entry->bitmap[chunk_offs >> 5] & ((uint32)1 << (chunk_offs & 31))) == 0)
{
/* Page is not cached */
lfc_ctl->misses += 1;
@@ -678,7 +678,7 @@ lfc_write(NRelFileInfo rinfo, ForkNumber forkNum, BlockNumber blkno, const void
if (--entry->access_count == 0)
dlist_push_tail(&lfc_ctl->lru, &entry->lru_node);
entry->bitmap[chunk_offs >> 5] |= (1 << (chunk_offs & 31));
entry->bitmap[chunk_offs >> 5] |= ((uint32)1 << (chunk_offs & 31));
}
LWLockRelease(lfc_lock);
@@ -913,7 +913,7 @@ local_cache_pages(PG_FUNCTION_ARGS)
{
for (int i = 0; i < BLOCKS_PER_CHUNK; i++)
{
if (entry->bitmap[i >> 5] & (1 << (i & 31)))
if (entry->bitmap[i >> 5] & ((uint32)1 << (i & 31)))
{
fctx->record[n].pageoffs = entry->offset * BLOCKS_PER_CHUNK + i;
fctx->record[n].relfilenode = NInfoGetRelNumber(BufTagGetNRelFileInfo(entry->key));

View File

@@ -993,7 +993,8 @@ DetermineEpochStartLsn(WalProposer *wp)
dth = &wp->safekeeper[wp->donor].voteResponse.termHistory;
wp->propTermHistory.n_entries = dth->n_entries + 1;
wp->propTermHistory.entries = palloc(sizeof(TermSwitchEntry) * wp->propTermHistory.n_entries);
memcpy(wp->propTermHistory.entries, dth->entries, sizeof(TermSwitchEntry) * dth->n_entries);
if (dth->n_entries > 0)
memcpy(wp->propTermHistory.entries, dth->entries, sizeof(TermSwitchEntry) * dth->n_entries);
wp->propTermHistory.entries[wp->propTermHistory.n_entries - 1].term = wp->propTerm;
wp->propTermHistory.entries[wp->propTermHistory.n_entries - 1].lsn = wp->propEpochStartLsn;

View File

@@ -20,7 +20,9 @@ def test_pg_regress(
env.neon_cli.create_branch("test_pg_regress", "empty")
# Connect to postgres and create a database called "regression".
endpoint = env.endpoints.create_start("test_pg_regress")
endpoint = env.endpoints.create_start(
"test_pg_regress", config_lines=["max_stack_depth = 4096kB"]
) # stack should be increased for tests to pass with asan
endpoint.safe_psql("CREATE DATABASE regression")
# Create some local directories for pg_regress to run in.
@@ -75,7 +77,7 @@ def test_isolation(
# Connect to postgres and create a database called "regression".
# isolation tests use prepared transactions, so enable them
endpoint = env.endpoints.create_start(
"test_isolation", config_lines=["max_prepared_transactions=100"]
"test_isolation", config_lines=["max_prepared_transactions=100", "max_stack_depth = 4096kB"]
)
endpoint.safe_psql("CREATE DATABASE isolation_regression")

View File

@@ -34,6 +34,7 @@ PERMIT_PAGE_SERVICE_ERRORS = [
".*page_service.*Tenant .* is not active",
".*page_service.*cancelled",
".*page_service.*will not become active.*",
".*Dropped remote consistent LSN updates for tenant.*",
]
@@ -747,8 +748,11 @@ def test_metrics_while_ignoring_broken_tenant_and_reloading(
env = neon_env_builder.init_start()
client = env.pageserver.http_client()
env.pageserver.allowed_errors.append(
r".* Changing Active tenant to Broken state, reason: broken from test"
env.pageserver.allowed_errors.extend(
[
r".* Changing Active tenant to Broken state, reason: broken from test",
r".*Dropped remote consistent LSN updates for tenant *.",
]
)
def only_int(samples: List[Sample]) -> Optional[int]:

View File

@@ -1,5 +1,5 @@
{
"postgres-v16": "7be4a52d728459b79b59343c57d338c3073059c8",
"postgres-v16": "6f1ef95071c00f85df45132dd2c6cd0405835870",
"postgres-v15": "c1c2272f436ed9231f6172f49de219fe71a9280d",
"postgres-v14": "82072911287cabb32018cf92c8425fa1c744def4"
}