Handle 5-char filenames in SlruScanDirectory

Original users of slru.c were all producing 4-digit filenames, so that
was all that that code was prepared to handle.  Changes to multixact.c
in the course of commit 0ac5ad5134 made pg_multixact/members create
5-digit filenames once a certain threshold was reached, which
SlruScanDirectory wasn't prepared to deal with; in particular,
5-digit-name files were not removed during truncation.  Change that
routine to make it aware of those files, and have it process them just
like any others.

Right now, some pg_multixact/members directories will contain a mixture
of 4-char and 5-char filenames.  A future commit is expected fix things
so that each slru.c user declares the correct maximum width for the
files it produces, to avoid such unsightly mixtures.

Noticed while investigating bug #8673 reported by Serge Negodyuck.
This commit is contained in:
Alvaro Herrera 2014-01-02 18:17:29 -03:00
parent a50d976254
commit 638cf09e76

View File

@ -1293,8 +1293,12 @@ SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data)
cldir = AllocateDir(ctl->Dir); cldir = AllocateDir(ctl->Dir);
while ((clde = ReadDir(cldir, ctl->Dir)) != NULL) while ((clde = ReadDir(cldir, ctl->Dir)) != NULL)
{ {
if (strlen(clde->d_name) == 4 && size_t len;
strspn(clde->d_name, "0123456789ABCDEF") == 4)
len = strlen(clde->d_name);
if ((len == 4 || len == 5) &&
strspn(clde->d_name, "0123456789ABCDEF") == len)
{ {
segno = (int) strtol(clde->d_name, NULL, 16); segno = (int) strtol(clde->d_name, NULL, 16);
segpage = segno * SLRU_PAGES_PER_SEGMENT; segpage = segno * SLRU_PAGES_PER_SEGMENT;