Re: Parallell hashjoin sometimes ignores temp_tablespaces - Mailing list pgsql-hackers

From Tom Lane
Subject Re: Parallell hashjoin sometimes ignores temp_tablespaces
Date
Msg-id 964290.1593795962@sss.pgh.pa.us
Whole thread Raw
In response to Re: Parallell hashjoin sometimes ignores temp_tablespaces  (Magnus Hagander <magnus@hagander.net>)
Responses Re: Parallell hashjoin sometimes ignores temp_tablespaces
List pgsql-hackers
Magnus Hagander <magnus@hagander.net> writes:
> On Fri, Jul 3, 2020 at 6:12 PM Tom Lane <tgl@sss.pgh.pa.us> wrote:
>> The lack of documentation seems to be my fault, so I'm willing to pick
>> this up unless somebody else wants it.

> If the comments I included in that patch are enough, I can just commit
> those along with it. Otherwise, please do :)

Being once burned, I had something more like the attached in mind.

BTW, looking at this, I'm kind of wondering about the other code path
in SharedFileSetInit:

    if (fileset->ntablespaces == 0)
    {
        fileset->tablespaces[0] = DEFAULTTABLESPACE_OID;
        fileset->ntablespaces = 1;
    }

Shouldn't that be inserting MyDatabaseTableSpace?  I see no other places
anywhere that are forcing temp stuff into pg_default like this.

            regards, tom lane

diff --git a/src/backend/commands/tablespace.c b/src/backend/commands/tablespace.c
index f887ee9857..2c3b9050b2 100644
--- a/src/backend/commands/tablespace.c
+++ b/src/backend/commands/tablespace.c
@@ -1183,6 +1183,7 @@ GetDefaultTablespace(char relpersistence, bool partitioned)

 typedef struct
 {
+    /* Array of OIDs to be passed to SetTempTablespaces() */
     int            numSpcs;
     Oid            tblSpcs[FLEXIBLE_ARRAY_MEMBER];
 } temp_tablespaces_extra;
@@ -1232,6 +1233,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;
             }
@@ -1258,6 +1260,7 @@ check_temp_tablespaces(char **newval, void **extra, GucSource source)
              */
             if (curoid == MyDatabaseTableSpace)
             {
+                /* InvalidOid signifies database's default tablespace */
                 tblSpcs[numSpcs++] = InvalidOid;
                 continue;
             }
@@ -1368,6 +1371,7 @@ PrepareTempTablespaces(void)
         /* Allow an empty string (signifying database default) */
         if (curname[0] == '\0')
         {
+            /* InvalidOid signifies database's default tablespace */
             tblSpcs[numSpcs++] = InvalidOid;
             continue;
         }
@@ -1386,7 +1390,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 7dc6dd2f15..5f6420efb2 100644
--- a/src/backend/storage/file/fd.c
+++ b/src/backend/storage/file/fd.c
@@ -264,8 +264,10 @@ static int    numExternalFDs = 0;
 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;
@@ -2779,6 +2781,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)
@@ -2818,7 +2823,10 @@ TempTablespacesAreSet(void)
  * GetTempTablespaces
  *
  * Populate an array with the OIDs of the tablespaces that should be used for
- * temporary files.  Return the number that were copied into the output array.
+ * temporary files.  (Some entries may be InvalidOid, indicating that the
+ * current database's default tablespace should be used.)  At most numSpaces
+ * entries will be filled.
+ * Returns the number of OIDs that were copied into the output array.
  */
 int
 GetTempTablespaces(Oid *tableSpaces, int numSpaces)
diff --git a/src/backend/storage/file/sharedfileset.c b/src/backend/storage/file/sharedfileset.c
index f7206c9175..0f65210476 100644
--- a/src/backend/storage/file/sharedfileset.c
+++ b/src/backend/storage/file/sharedfileset.c
@@ -66,6 +66,21 @@ SharedFileSetInit(SharedFileSet *fileset, dsm_segment *seg)
         fileset->tablespaces[0] = DEFAULTTABLESPACE_OID;
         fileset->ntablespaces = 1;
     }
+    else
+    {
+        int            i;
+
+        /*
+         * An entry of InvalidOid means use the default tablespace for the
+         * current database.  Replace that now, to be sure that all users of
+         * the SharedFileSet agree on what to do.
+         */
+        for (i = 0; i < fileset->ntablespaces; i++)
+        {
+            if (fileset->tablespaces[i] == InvalidOid)
+                fileset->tablespaces[i] = MyDatabaseTableSpace;
+        }
+    }

     /* Register our cleanup callback. */
     on_dsm_detach(seg, SharedFileSetOnDetach, PointerGetDatum(fileset));

pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: POC: rational number type (fractions)
Next
From: Magnus Hagander
Date:
Subject: Re: Parallell hashjoin sometimes ignores temp_tablespaces