• Michael Paquier's avatar
    Restrict the use of temporary namespace in two-phase transactions · c5660e0a
    Michael Paquier authored
    Attempting to use a temporary table within a two-phase transaction is
    forbidden for ages.  However, there have been uncovered grounds for
    a couple of other object types and commands which work on temporary
    objects with two-phase commit.  In short, trying to create, lock or drop
    an object on a temporary schema should not be authorized within a
    two-phase transaction, as it would cause its state to create
    dependencies with other sessions, causing all sorts of side effects with
    the existing session or other sessions spawned later on trying to use
    the same temporary schema name.
    
    Regression tests are added to cover all the grounds found, the original
    report mentioned function creation, but monitoring closer there are many
    other patterns with LOCK, DROP or CREATE EXTENSION which are involved.
    One of the symptoms resulting in combining both is that the session
    which used the temporary schema is not able to shut down completely,
    waiting for being able to drop the temporary schema, something that it
    cannot complete because of the two-phase transaction involved with
    temporary objects.  In this case the client is able to disconnect but
    the session remains alive on the backend-side, potentially blocking
    connection backend slots from being used.  Other problems reported could
    also involve server crashes.
    
    This is back-patched down to v10, which is where 9b013dc2 has introduced
    MyXactFlags, something that this patch relies on.
    
    Reported-by: Alexey Bashtanov
    Author: Michael Paquier
    Reviewed-by: Masahiko Sawada
    Discussion: https://postgr.es/m/5d910e2e-0db8-ec06-dd5f-baec420513c3@imap.cc
    Backpatch-through: 10
    c5660e0a
temp.out 9.71 KB