postgres.git / summary / log / commit / refs

commit    57e978a622f0d9ce0e1a1d22d3e04fc2901ef5d7
Author:   Tom Lane <tgl@sss.pgh.pa.us>
Date:     Fri Jul 03 21:01:35 2020 +0000
First released in: 14.0, 9.5.23, 9.6.19, 10.14, 11.9, 12.4, 13.0

    Fix temporary tablespaces for shared filesets some more.
    
    Commit ecd9e9f0b fixed the problem in the wrong place, causing unwanted
    side-effects on the behavior of GetNextTempTableSpace().  Instead,
    let's make SharedFileSetInit() responsible for subbing in the value
    of MyDatabaseTableSpace when the default tablespace is called for.
    
    The convention about what is in the tempTableSpaces[] array is
    evidently insufficiently documented, so try to improve that.
    
    It also looks like SharedFileSetInit() is doing the wrong thing in the
    case where temp_tablespaces is empty.  It was hard-wiring use of the
    pg_default tablespace, but it seems like using MyDatabaseTableSpace
    is more consistent with what happens for other temp files.
    
    Back-patch the reversion of PrepareTempTablespaces()'s behavior to
    9.5, as ecd9e9f0b was.  The changes in SharedFileSetInit() go back
    to v11 where that was introduced.  (Note there is net zero code change
    before v11 from these two patch sets, so nothing to release-note.)
    
    Magnus Hagander and Tom Lane
    
    Discussion: https://postgr.es/m/CABUevExg5YEsOvqMxrjoNvb3ApVyH+9jggWGKwTDFyFCVWczGQ@mail.gmail.com


src/backend/commands/tablespace.c | 7 ++++++- src/backend/storage/file/fd.c | 9 +++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c index 49a8610654b..2cfe5f20b8c 100644 --- a/src/backend/commands/tablespace.c +++ b/src/backend/commands/tablespace.c @@ -1153,6 +1153,7 @@ GetDefaultTablespace(char relpersistence) typedef struct { + /* Array of OIDs to be passed to SetTempTablespaces() */ int numSpcs; Oid tblSpcs[FLEXIBLE_ARRAY_MEMBER]; } temp_tablespaces_extra; @@ -1202,6 +1203,7 @@ check_temp_tablespaces(char **newval, void **extra, GucSource source) /* Allow an empty string (signifying database default) */ if (curname[0] == '\0') { + /* InvalidOid signifies database's default tablespace */ tblSpcs[numSpcs++] = InvalidOid; continue; } @@ -1228,6 +1230,7 @@ check_temp_tablespaces(char **newval, void **extra, GucSource source) */ if (curoid == MyDatabaseTableSpace) { + /* InvalidOid signifies database's default tablespace */ tblSpcs[numSpcs++] = InvalidOid; continue; } @@ -1338,6 +1341,7 @@ PrepareTempTablespaces(void) /* Allow an empty string (signifying database default) */ if (curname[0] == '\0') { + /* InvalidOid signifies database's default tablespace */ tblSpcs[numSpcs++] = InvalidOid; continue; } @@ -1356,7 +1360,8 @@ PrepareTempTablespaces(void) */ if (curoid == MyDatabaseTableSpace) { - tblSpcs[numSpcs++] = curoid; + /* InvalidOid signifies database's default tablespace */ + tblSpcs[numSpcs++] = InvalidOid; continue; } diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index ba7f3d96ae0..8cda9667957 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -246,8 +246,10 @@ static AllocateDesc *allocatedDescs = NULL; static long tempFileCounter = 0; /* - * Array of OIDs of temp tablespaces. When numTempTableSpaces is -1, - * this has not been set in the current transaction. + * Array of OIDs of temp tablespaces. (Some entries may be InvalidOid, + * indicating that the current database's default tablespace should be used.) + * When numTempTableSpaces is -1, this has not been set in the current + * transaction. */ static Oid *tempTableSpaces = NULL; static int numTempTableSpaces = -1; @@ -2301,6 +2303,9 @@ closeAllVfds(void) * unless this function is called again before then. It is caller's * responsibility that the passed-in array has adequate lifespan (typically * it'd be allocated in TopTransactionContext). + * + * Some entries of the array may be InvalidOid, indicating that the current + * database's default tablespace should be used. */ void SetTempTablespaces(Oid *tableSpaces, int numSpaces) [parent: 8ac0eb51f7bf]