Re: Concurrent DROP TABLESPACE can miss a shared dependency

From: Ayush Tiwari <ayushtiwari(dot)slg01(at)gmail(dot)com>
To: Andrew Dunstan <andrew(at)dunslane(dot)net>
Cc: PostgreSQL Hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: Concurrent DROP TABLESPACE can miss a shared dependency
Date: 2026-09-08 13:58:51
Message-ID: CAJTYsWV+Y9amd+0d=1UPCAo7s0zYwL-tt+Mha56UTLDo6w1MpA@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi,

On Mon, 7 Sept 2026 at 23:28, Andrew Dunstan <andrew(at)dunslane(dot)net> wrote:
>
>
> On 2026-08-30 Su 4:05 PM, Ayush Tiwari wrote:
> > Hi,
> >
> > I found a race between DROP TABLESPACE and a concurrent command that adds a
> > shared dependency on the tablespace. Both commands can succeed, leaving an
> > object whose pg_class.reltablespace and pg_shdepend entries refer to a
> > tablespace that no longer exists.
> >
> > One way to reproduce this is:
> >
> > 1. One session updates the pg_tablespace row and keeps the transaction open.
> > 2. A second session runs DROP TABLESPACE. It finds no dependencies, then
> > waits while deleting the pg_tablespace tuple.
> > 3. A third session creates a partitioned table in the tablespace and commits.
> > 4. The first session aborts, allowing DROP TABLESPACE to finish using the
> > result of its earlier dependency check.
> >
> > ISTM the race is possible because shdepAddDependency() takes an
> > AccessShareLock on the referenced shared object and rechecks that it still
> > exists, but DropTableSpace() calls checkSharedDependencies() without first
> > taking the corresponding conflicting lock. DropRole() appears to follow
> > that protocol already.
> >
> > For a fix, my first thought was to have DROP TABLESPACE take an
> > AccessExclusiveLock before checking its shared dependencies. However,
> > doing only that seems to introduce a lock-order problem with commands that
> > update pg_tablespace without first locking the tablespace. Such a command
> > can hold the catalog tuple while DROP TABLESPACE holds the object lock, and
> > then try to acquire the object lock itself when the transaction records a
> > tablespace dependency.
> >
> > I went through the paths that update pg_tablespace, and I think ALTER
> > TABLESPACE RENAME/SET, DROP OWNED, and REASSIGN OWNED need to acquire an
> > AccessShareLock before updating the catalog tuple. Direct GRANT, REVOKE,
> > and ALTER OWNER appear to acquire an object lock already. The attached
> > 0002 contains those changes, separately from the DROP-side change in 0001.
> > (They likely need to be squashed once the patch looks fine).
> >
> > Does this AccessExclusiveLock/AccessShareLock protocol seem like the right
> > way to close the race? Also, have I missed another pg_tablespace update
> > path that should participate in the same protocol?
> >
> >
>
> Hi, I encountered this while working on cleaning up the ddl patches.
>
> 0002's deadlock analysis is correct. DROP
> TABLESPACE takes the AccessExclusiveLock and then blocks in
> CatalogTupleDelete on the uncommitted ALTER's row, while that same
> transaction's later CREATE TABLE ... TABLESPACE blocks on the
> AccessShareLock DROP already holds -- a real deadlock that 0001
> introduces and 0002 closes by taking the AccessShareLock before
> touching the catalog tuple in all four paths.
>
> On your open question: I don't think you've missed a path. I tested
> GRANT ON TABLESPACE and ALTER TABLESPACE ... OWNER TO the same way and
> neither deadlocks -- DROP blocks, then correctly errors once the
> transaction commits.

Thanks for confirming the deadlock analysis and for checking the GRANT and
ALTER OWNER paths.

> I think this should be applied as a single squashed commit,
> (soon so I can rely on it for the fixes I mentioned).

I have squashed the two changes into the attached v2.

> I think it should be backpatched - all live branches have the same problem.

Agreed that this should be backpatched to all live branches.

Regards,
Ayush

Attachment Content-Type Size
v2-0001-Prevent-orphaned-tablespace-dependencies.patch application/octet-stream 14.5 KB

In response to

Browse pgsql-hackers by date

  From Date Subject
Next Message Andrew Dunstan 2026-09-08 14:05:08 Re: Use C11 alignas instead of palloc/malloc for alignment
Previous Message Renaud Métrich 2026-09-08 13:50:40 Re: [PATCH v4] Add ssl_cert_files/ssl_key_files for multi-certificate support