Reset ALTER TABLE lock levels to AccessExclusiveLock in all cases.

Locks on inheritance parent remain at lower level, as they were before.
Remove entry from 9.1 release notes.
REL9_1_STABLE
Simon Riggs 15 years ago
parent 3569e02c98
commit 1f70560997
  1. 17
      doc/src/sgml/release-9.1.sgml
  2. 28
      src/backend/commands/tablecmds.c

@ -846,8 +846,7 @@
<listitem> <listitem>
<para> <para>
Add functions to control streaming replication replay (Simon Add functions to control streaming replication replay (Simon Riggs)
Riggs)
</para> </para>
<para> <para>
@ -1742,20 +1741,6 @@
</para> </para>
</listitem> </listitem>
<listitem>
<para>
Minimize lock levels for <link
linkend="SQL-CREATETRIGGER"><command>CREATE TRIGGER</></link>
and many <link linkend="SQL-ALTERTABLE"><command>ALTER
TABLE</></link> and <link linkend="SQL-CREATERULE"><command>CREATE
RULE</></link> operations (Simon Riggs)
</para>
<para>
This improves database availability when altering active databases.
</para>
</listitem>
</itemizedlist> </itemizedlist>
</sect4> </sect4>

@ -2573,6 +2573,31 @@ AlterTableInternal(Oid relid, List *cmds, bool recurse)
LOCKMODE LOCKMODE
AlterTableGetLockLevel(List *cmds) AlterTableGetLockLevel(List *cmds)
{ {
/*
* Late in 9.1 dev cycle a number of issues were uncovered with access
* to catalog relations, leading to the decision to re-enforce all DDL
* at AccessExclusiveLock level by default.
*
* The issues are that there is a pervasive assumption in the code that
* the catalogs will not be read unless an AccessExclusiveLock is held.
* If that rule is relaxed, we must protect against a number of potential
* effects - infrequent, but proven possible with test cases where
* multiple DDL operations occur in a stream against frequently accessed
* tables.
*
* 1. Catalog tables are read using SnapshotNow, which has a race bug
* that allows a scan to return no valid rows even when one is present
* in the case of a commit of a concurrent update of the catalog table.
* SnapshotNow also ignores transactions in progress, so takes the
* latest committed version without waiting for the latest changes.
*
* 2. Relcache needs to be internally consistent, so unless we lock the
* definition during reads we have no way to guarantee that.
*
* 3. Catcache access isn't coordinated at all so refreshes can occur at
* any time.
*/
#ifdef REDUCED_ALTER_TABLE_LOCK_LEVELS
ListCell *lcmd; ListCell *lcmd;
LOCKMODE lockmode = ShareUpdateExclusiveLock; LOCKMODE lockmode = ShareUpdateExclusiveLock;
@ -2721,6 +2746,9 @@ AlterTableGetLockLevel(List *cmds)
if (cmd_lockmode > lockmode) if (cmd_lockmode > lockmode)
lockmode = cmd_lockmode; lockmode = cmd_lockmode;
} }
#else
LOCKMODE lockmode = AccessExclusiveLock;
#endif
return lockmode; return lockmode;
} }

Loading…
Cancel
Save