Multiple pg_waldump --rmgr options

Heikki Linnakangas <hlinnaka@iki.fi>

From: Heikki Linnakangas <hlinnaka@iki.fi>
To: pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2021-05-18T13:50:31Z
Lists: pgsql-hackers

Attachments

I wanted to dump all heap WAL records with pg_waldump, so I did this:

> $ pg_waldump --rmgr=heap --rmgr=heap2 data/pg_wal/000000010000000000000001 --stat=record
> Type                                           N      (%)          Record size      (%)             FPI size      (%)        Combined size      (%)
> ----                                           -      ---          -----------      ---             --------      ---        -------------      ---
> Heap2/PRUNE                                  268 (  8.74)                18192 (  2.73)                    0 (  0.00)                18192 (  1.74)
> Heap2/VACUUM                                  55 (  1.79)                 4940 (  0.74)                    0 (  0.00)                 4940 (  0.47)
> Heap2/FREEZE_PAGE                            277 (  9.03)               186868 ( 28.03)                    0 (  0.00)               186868 ( 17.86)
> Heap2/VISIBLE                                467 ( 15.23)                27783 (  4.17)               376832 ( 99.34)               404615 ( 38.68)
> Heap2/MULTI_INSERT                          1944 ( 63.38)               354800 ( 53.21)                 2520 (  0.66)               357320 ( 34.16)
> Heap2/MULTI_INSERT+INIT                       56 (  1.83)                74152 ( 11.12)                    0 (  0.00)                74152 (  7.09)
>                                         --------                      --------                      --------                      --------
> Total                                       3067                        666735 [63.74%]               379352 [36.26%]              1046087 [100%]
> pg_waldump: fatal: error in WAL record at 0/1680118: invalid record length at 0/1680150: wanted 24, got 0

That didn't do what I wanted. It only printed the Heap2 records, not 
Heap, even though I specified both. The reason is that if you specify 
multiple --rmgr options, only the last one takes effect.

I propose the attached to allow selecting multiple rmgrs, by giving 
multiple --rmgr options. With that, it works the way I expected:

> $ pg_waldump --rmgr=heap --rmgr=heap2 data/pg_wal/000000010000000000000001 --stat=record
> Type                                           N      (%)          Record size      (%)             FPI size      (%)        Combined size      (%)
> ----                                           -      ---          -----------      ---             --------      ---        -------------      ---
> Heap2/PRUNE                                  268 (  1.77)                18192 (  0.71)                    0 (  0.00)                18192 (  0.55)
> Heap2/VACUUM                                  55 (  0.36)                 4940 (  0.19)                    0 (  0.00)                 4940 (  0.15)
> Heap2/FREEZE_PAGE                            277 (  1.83)               186868 (  7.33)                    0 (  0.00)               186868 (  5.67)
> Heap2/VISIBLE                                467 (  3.09)                27783 (  1.09)               376832 ( 50.37)               404615 ( 12.27)
> Heap2/MULTI_INSERT                          1944 ( 12.86)               354800 ( 13.91)                 2520 (  0.34)               357320 ( 10.83)
> Heap2/MULTI_INSERT+INIT                       56 (  0.37)                74152 (  2.91)                    0 (  0.00)                74152 (  2.25)
> Heap/INSERT                                 9948 ( 65.80)              1433891 ( 56.22)                 8612 (  1.15)              1442503 ( 43.73)
> Heap/DELETE                                  942 (  6.23)                50868 (  1.99)                    0 (  0.00)                50868 (  1.54)
> Heap/UPDATE                                  193 (  1.28)               101265 (  3.97)                 9556 (  1.28)               110821 (  3.36)
> Heap/HOT_UPDATE                              349 (  2.31)                36910 (  1.45)                 1300 (  0.17)                38210 (  1.16)
> Heap/LOCK                                    209 (  1.38)                11481 (  0.45)               316828 ( 42.35)               328309 (  9.95)
> Heap/INPLACE                                 212 (  1.40)                44279 (  1.74)                32444 (  4.34)                76723 (  2.33)
> Heap/INSERT+INIT                             184 (  1.22)               188803 (  7.40)                    0 (  0.00)               188803 (  5.72)
> Heap/UPDATE+INIT                              15 (  0.10)                16273 (  0.64)                    0 (  0.00)                16273 (  0.49)
>                                         --------                      --------                      --------                      --------
> Total                                      15119                       2550505 [77.32%]               748092 [22.68%]              3298597 [100%]
> pg_waldump: fatal: error in WAL record at 0/1680150: invalid record length at 0/16801C8: wanted 24, got 0

- Heikki

Commits

  1. Allow specifying pg_waldump --rmgr option multiple times.