Re: [HACKERS] SELECT blocking on ALTER TABLE ADD FOREIGN KEY

2003-06-16 Thread Jim C. Nasby
On Thu, Jun 12, 2003 at 06:23:12PM -0400, Tom Lane wrote:
 Jim C. Nasby [EMAIL PROTECTED] writes:
  Is there any ALTER that would require blocking selects?
 
 DROP INDEX, for certain.

Sure, but that's usually trivially fast.

  Even stuff like
  drop and rename should be protected by versioning, no?
 
 No.  System-catalog changes are always READ COMMITTED mode.
 
Yeah, so the catalog changes shouldn't be visible to anyone until after
the ALTER is complete, right? Even if a transaction is set to read
uncommitted, I assume it will always read only committed data from the
catalogs...
-- 
Jim C. Nasby (aka Decibel!)[EMAIL PROTECTED]
Member: Triangle Fraternity, Sports Car Club of America
Give your computer some brain candy! www.distributed.net Team #1828

Windows: Where do you want to go today?
Linux: Where do you want to go tomorrow?
FreeBSD: Are you guys coming, or what?

---(end of broadcast)---
TIP 5: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faqs/FAQ.html


Re: [HACKERS] SELECT blocking on ALTER TABLE ADD FOREIGN KEY

2003-06-16 Thread Bruno Wolff III
On Mon, Jun 16, 2003 at 01:17:38 -0500,
  Jim C. Nasby [EMAIL PROTECTED] wrote:
  
 Yeah, so the catalog changes shouldn't be visible to anyone until after
 the ALTER is complete, right? Even if a transaction is set to read
 uncommitted, I assume it will always read only committed data from the
 catalogs...

Postgres doesn't have a read uncommitted mode for transactions.

---(end of broadcast)---
TIP 8: explain analyze is your friend


Re: [HACKERS] SELECT blocking on ALTER TABLE ADD FOREIGN KEY

2003-06-16 Thread Tom Lane
Jim C. Nasby [EMAIL PROTECTED] writes:
 On Thu, Jun 12, 2003 at 06:23:12PM -0400, Tom Lane wrote:
 Even stuff like
 drop and rename should be protected by versioning, no?
 
 No.  System-catalog changes are always READ COMMITTED mode.
 
 Yeah, so the catalog changes shouldn't be visible to anyone until after
 the ALTER is complete, right?

The point is that they become visible *immediately* when the ALTER
commits; if the other transaction is in the midst of some operation on
the table, it's likely to fail badly.  Locking is what we have to do
to prevent that.

An example of the sort of problem I'm afraid of is that any change in
the tuple descriptor of a table (adding or renaming a column, flipping
the NOT NULL constraint, etc) will cause replacement of the tuple
descriptor in the table's relcache entry as soon as the other backend
notices the cache-inval message from the altering backend.  This would
break any code that has a pointer to the tuple descriptor.  Now with
sufficiently draconian programming rules we could probably avoid holding
references to cached tuple descriptors anywhere ... but it would be
mighty fragile, and mistakes would lead to failures that would be nigh
impossible to replicate or debug.  Right now the rule is you can use a
relcache entry as long as you have some kind of lock on the relation.
This is relatively easy to ensure.

regards, tom lane

---(end of broadcast)---
TIP 4: Don't 'kill -9' the postmaster


Re: [HACKERS] SELECT blocking on ALTER TABLE ADD FOREIGN KEY

2003-06-12 Thread Jim C. Nasby
On Wed, Jun 11, 2003 at 03:19:14PM -0400, Tom Lane wrote:
 Jim C. Nasby [EMAIL PROTECTED] writes:
  Is it really necessary to block reads on a table that is affected by
  adding a foreign key constraint?
 
 It's trickier than you seem to think.  The command is adding an index,
 which at some point is going to affect plans for SELECTs on the table.
 It might be safe --- I don't think other processes can see the index
 until the ALTER commits --- but in general we do not risk doing schema
 modifications on tables with less than exclusive lock.
 
 You'd also have to think about whether this wouldn't increase the risk
 of deadlocks.  For example, if you are doing several ALTERs in a
 transaction, what happens when a later ALTER of the same table *does*
 need exclusive lock?  Upgrading a lock is a sure ticket to deadlock
 problems.

Is there any ALTER that would require blocking selects? Even stuff like
drop and rename should be protected by versioning, no?
-- 
Jim C. Nasby (aka Decibel!)[EMAIL PROTECTED]
Member: Triangle Fraternity, Sports Car Club of America
Give your computer some brain candy! www.distributed.net Team #1828

Windows: Where do you want to go today?
Linux: Where do you want to go tomorrow?
FreeBSD: Are you guys coming, or what?

---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
(send unregister YourEmailAddressHere to [EMAIL PROTECTED])


Re: [HACKERS] SELECT blocking on ALTER TABLE ADD FOREIGN KEY

2003-06-12 Thread Tom Lane
Jim C. Nasby [EMAIL PROTECTED] writes:
 Is there any ALTER that would require blocking selects?

DROP INDEX, for certain.

 Even stuff like
 drop and rename should be protected by versioning, no?

No.  System-catalog changes are always READ COMMITTED mode.

regards, tom lane

---(end of broadcast)---
TIP 6: Have you searched our list archives?

http://archives.postgresql.org


[HACKERS] SELECT blocking on ALTER TABLE ADD FOREIGN KEY

2003-06-11 Thread Jim C. Nasby
Is it really necessary to block reads on a table that is affected by
adding a foreign key constraint? I can see why you wouldn't want UPDATES
or INSERTS on the child table or DELETEs on the parent, but select
should be fine on both tables, no?
-- 
Jim C. Nasby (aka Decibel!)[EMAIL PROTECTED]
Member: Triangle Fraternity, Sports Car Club of America
Give your computer some brain candy! www.distributed.net Team #1828

Windows: Where do you want to go today?
Linux: Where do you want to go tomorrow?
FreeBSD: Are you guys coming, or what?

---(end of broadcast)---
TIP 4: Don't 'kill -9' the postmaster


Re: [HACKERS] SELECT blocking on ALTER TABLE ADD FOREIGN KEY

2003-06-11 Thread Tom Lane
Jim C. Nasby [EMAIL PROTECTED] writes:
 Is it really necessary to block reads on a table that is affected by
 adding a foreign key constraint?

It's trickier than you seem to think.  The command is adding an index,
which at some point is going to affect plans for SELECTs on the table.
It might be safe --- I don't think other processes can see the index
until the ALTER commits --- but in general we do not risk doing schema
modifications on tables with less than exclusive lock.

You'd also have to think about whether this wouldn't increase the risk
of deadlocks.  For example, if you are doing several ALTERs in a
transaction, what happens when a later ALTER of the same table *does*
need exclusive lock?  Upgrading a lock is a sure ticket to deadlock
problems.

regards, tom lane

---(end of broadcast)---
TIP 2: you can get off all lists at once with the unregister command
(send unregister YourEmailAddressHere to [EMAIL PROTECTED])