postgres.git / summary / log / commit / refs

commit    948a3dfbb79a7e63e3bf31253837fa723f36d8c0
Author:   Alvaro Herrera <alvherre@alvh.no-ip.org>
Date:     Thu Jan 02 21:17:29 2014 +0000
First released in: 9.4.0, 9.3.3

    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 0ac5ad5134f 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.


src/backend/access/transam/slru.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/backend/access/transam/slru.c b/src/backend/access/transam/slru.c index 9dc566e1622..af249022476 100644 --- a/src/backend/access/transam/slru.c +++ b/src/backend/access/transam/slru.c @@ -1293,8 +1293,12 @@ SlruScanDirectory(SlruCtl ctl, SlruScanCallback callback, void *data) cldir = AllocateDir(ctl->Dir); while ((clde = ReadDir(cldir, ctl->Dir)) != NULL) { - if (strlen(clde->d_name) == 4 && - strspn(clde->d_name, "0123456789ABCDEF") == 4) + size_t len; + + len = strlen(clde->d_name); + + if ((len == 4 || len == 5) && + strspn(clde->d_name, "0123456789ABCDEF") == len) { segno = (int) strtol(clde->d_name, NULL, 16); segpage = segno * SLRU_PAGES_PER_SEGMENT; [parent: 03db7945961c]