Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Reset ALTER TABLE lock levels to AccessExclusiveLock in all cases.
authorSimon Riggs <simon@2ndQuadrant.com>
Mon, 4 Jul 2011 08:31:40 +0000 (09:31 +0100)
committerSimon Riggs <simon@2ndQuadrant.com>
Mon, 4 Jul 2011 08:31:40 +0000 (09:31 +0100)
Locks on inheritance parent remain at lower level, as they were before.
Remove entry from 9.1 release notes.

doc/src/sgml/release-9.1.sgml
src/backend/commands/tablecmds.c

index 9dfca1c7866776d366a71a0b10639c91c1698d86..914464eb6c38e37689879b60ed1d37dd076dbd8a 100644 (file)
 
       <listitem>
        <para>
-        Add functions to control streaming replication replay (Simon
-        Riggs)
+        Add functions to control streaming replication replay (Simon Riggs)
        </para>
 
        <para>
        </para>
       </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>
 
     </sect4>
index a3a99d28806c0902cb407144a79b03ba01768204..22864de957bed885b63e8997aacdf151e5f59cdb 100644 (file)
@@ -2578,6 +2578,31 @@ AlterTableInternal(Oid relid, List *cmds, bool recurse)
 LOCKMODE
 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;
    LOCKMODE    lockmode = ShareUpdateExclusiveLock;
 
@@ -2726,6 +2751,9 @@ AlterTableGetLockLevel(List *cmds)
        if (cmd_lockmode > lockmode)
            lockmode = cmd_lockmode;
    }
+#else
+   LOCKMODE    lockmode = AccessExclusiveLock;
+#endif
 
    return lockmode;
 }