autovac-temp-REL9_4_STABLE.patch
text/x-diff
Filename: autovac-temp-REL9_4_STABLE.patch
Type: text/x-diff
Part: 0
Message:
Re: removal of dangling temp tables
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/catalog/namespace.c | 19 | 0 |
| src/backend/postmaster/autovacuum.c | 9 | 2 |
diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c
index 89df585b87..d6f3fd5436 100644
--- a/src/backend/catalog/namespace.c
+++ b/src/backend/catalog/namespace.c
@@ -3835,12 +3835,31 @@ RemoveTempRelationsCallback(int code, Datum arg)
/*
* Remove all temp tables from the temporary namespace.
+ *
+ * If we haven't set up one yet, but one exists from a previous crashed
+ * backend, clean that one; but only do this once in a session's life.
*/
void
ResetTempTableNamespace(void)
{
+ static bool TempNamespaceCleaned = false;
+
if (OidIsValid(myTempNamespace))
RemoveTempRelations(myTempNamespace);
+ else if (MyBackendId != InvalidBackendId && !RecoveryInProgress() &&
+ !TempNamespaceCleaned)
+ {
+ char namespaceName[NAMEDATALEN];
+ Oid namespaceId;
+
+ snprintf(namespaceName, sizeof(namespaceName), "pg_temp_%d",
+ MyBackendId);
+ namespaceId = get_namespace_oid(namespaceName, true);
+ if (OidIsValid(namespaceId))
+ RemoveTempRelations(namespaceId);
+ }
+
+ TempNamespaceCleaned = true;
}
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index c18285d690..62a06add56 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -2108,11 +2108,18 @@ do_autovacuum(void)
if (classForm->relpersistence == RELPERSISTENCE_TEMP)
{
int backendID;
+ PGPROC *proc;
backendID = GetTempNamespaceBackendId(classForm->relnamespace);
- /* We just ignore it if the owning backend is still active */
- if (backendID == MyBackendId || BackendIdGetProc(backendID) == NULL)
+ /*
+ * We just ignore it if the owning backend is still active in the
+ * same database.
+ */
+ if (backendID != InvalidBackendId &&
+ (backendID == MyBackendId ||
+ (proc = BackendIdGetProc(backendID)) == NULL ||
+ proc->databaseId != MyDatabaseId))
{
/*
* We found an orphan temp table (which was probably left