Re: [PATCH] Refactor SLRU to always use long file names

From: Aleksander Alekseev <aleksander(at)timescale(dot)com>
To: PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>
Cc: Michael Paquier <michael(at)paquier(dot)xyz>
Subject: Re: [PATCH] Refactor SLRU to always use long file names
Date: 2025-01-06 13:23:33
Message-ID: CAJ7c6TMAuQCeYu+qvONafChgEiZq2RWfoqtE3tr=QVAivqSWyQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

> For the record, Michael and I had a brief discussion about this
> offlist and decided to abandon the idea of adding TAP tests, relying
> only on buildfarm. Also I will check if we have a clear error message
> in case when a user forgot to run pg_upgrade and running new slru.c
> with old filenames. If the user doesn't get such an error message I
> will see if it's possible to add it somewhere in slru.c without
> introducing much performance overhead.
>
> Also I'm going to submit precise steps to test this migration manually
> for the reviewers convenience.

Here is an updated patch. The steps to test it manually are as follows.

Compile and install PostgreSQL from the REL_17_STABLE branch:

```
git checkout REL_17_STABLE
git fetch origin
git rebase -i origin/REL_17_STABLE
git clean -dfx
meson setup --buildtype debug -Dcassert=true -Dtap_tests=enabled
-Dprefix=/home/eax/pginstall-17 build
ninja -C build
meson install -C build
~/pginstall-17/bin/initdb --data-checksums -D ~/pginstall-17/data
~/pginstall-17/bin/pg_ctl -D ~/pginstall-17/data -l
~/pginstall-17/data/logfile start
~/pginstall-17/bin/createdb $(whoami)

# fill DB (or even better - use a copy of an existing one), e.g:
~/pginstall-17/bin/pgbench -i -s 100
~/pginstall-17/bin/pgbench -j 16 -c 16 -T 10 -P 5

# should see 4-digit SLRU segment filenames, more files is better
ls -la ~/pginstall-17/data/pg_xact/ \
~/pginstall-17/data/pg_commit_ts/ \
~/pginstall-17/data/pg_multixact/members/ \
~/pginstall-17/data/pg_multixact/offsets/ \
~/pginstall-17/data/pg_subtrans/ \
~/pginstall-17/data/pg_serial/

~/pginstall-17/bin/pg_ctl -D ~/pginstall-17/data stop
```

Apply the patch to the `master` branch, recompile PostgreSQL, install
to the different location:

```
git checkout slru_pg_upgrade_v2
git clean -dfx
meson setup --buildtype debug -Dcassert=true -Dtap_tests=enabled
-Dprefix=/home/eax/pginstall-18 build
ninja -C build
meson install -C build
```

Try to start PostgreSQL without running pg_upgrade:

```
cp -r ~/pginstall-17/data ~/pginstall-18/data
~/pginstall-18/bin/pg_ctl -D ~/pginstall-18/data -l
~/pginstall-18/data/logfile start
```

You should get:

```
waiting for server to start.... stopped waiting
pg_ctl: could not start server
Examine the log output.

$ tail ~/pginstall-18/data/logfile

FATAL: database files are incompatible with server
DETAIL: The data directory was initialized by PostgreSQL version 17,
which is not compatible with this version 18devel
```

Run pg_upgrade:

```
rm -r ~/pginstall-18/data
~/pginstall-18/bin/initdb --data-checksums -D ~/pginstall-18/data
~/pginstall-18/bin/pg_upgrade
--old-datadir=/home/eax/pginstall-17/data
--new-datadir=/home/eax/pginstall-18/data
--old-bindir=/home/eax/pginstall-17/bin
--new-bindir=/home/eax/pginstall-18/bin
```

Make sure the output contains:

```
Renaming SLRU segments in pg_xact ok
Renaming SLRU segments in pg_commit_ts ok
Renaming SLRU segments in pg_multixact/offsets ok
Renaming SLRU segments in pg_multixact/members ok
Renaming SLRU segments in pg_subtrans ok
Renaming SLRU segments in pg_serial ok
```

Make sure PostgreSQL starts after the upgrade:

```
~/pginstall-18/bin/pg_ctl -D ~/pginstall-18/data -l
~/pginstall-18/data/logfile start
~/pginstall-18/bin/psql -c 'select count(*) from pgbench_accounts'
~/pginstall-18/bin/pg_ctl -D ~/pginstall-18/data stop

# should see 15-digit SLRU segment filenames
ls -la ~/pginstall-18/data/pg_xact/ \
~/pginstall-18/data/pg_commit_ts/ \
~/pginstall-18/data/pg_multixact/members/ \
~/pginstall-18/data/pg_multixact/offsets/ \
~/pginstall-18/data/pg_subtrans/ \
~/pginstall-18/data/pg_serial/
```

Make sure that the second run of pg_upgrade doesn't produce "Renaming
SLRU segments" messages:

```
mv ~/pginstall-18/data ~/pginstall-18/data.bak
~/pginstall-18/bin/initdb --data-checksums -D ~/pginstall-18/data
~/pginstall-18/bin/pg_upgrade
--old-datadir=/home/eax/pginstall-18/data.bak
--new-datadir=/home/eax/pginstall-18/data
--old-bindir=/home/eax/pginstall-18/bin
--new-bindir=/home/eax/pginstall-18/bin
```

As always, your feedback and suggestions are most welcomed.

--
Best regards,
Aleksander Alekseev

Attachment Content-Type Size
v2-0001-Always-use-long-SLRU-segment-file-names.patch application/octet-stream 14.9 KB

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Michail Nikolaev 2025-01-06 13:36:00 Re: Revisiting {CREATE INDEX, REINDEX} CONCURRENTLY improvements
Previous Message David Rowley 2025-01-06 13:18:38 Re: Some ExecSeqScan optimizations