Re: [HACKERS] Transactional sequence stuff breaks pg_upgrade

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: [HACKERS] Transactional sequence stuff breaks pg_upgrade
Дата
Msg-id 16932.1497306664@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Re: [HACKERS] Transactional sequence stuff breaks pg_upgrade  (Andres Freund <andres@anarazel.de>)
Список pgsql-hackers
Andres Freund <andres@anarazel.de> writes:
> On 2017-06-12 17:35:37 -0400, Tom Lane wrote:
>> I thought about trying to insert an assert in GetNewOidWithIndex to
>> ensure that no type OIDs are selected automatically during upgrade,
>> but it seemed a bit too complicated.  Might be a good idea to figure
>> it out though, unless you have an idea for removing that requirement.

> I think the only type oids assigned during pg_upgrade are the oids for
> toast type types, right?

Perhaps that was a problem once, but it isn't now; see 
binary_upgrade_set_next_toast_pg_type_oid().

In fact, we get through the pg_upgrade regression test with the attached
patch, and I really think we ought to commit it.

Having said that, I wouldn't mind trying to reduce the catalog overhead
for toast tables in v11 or beyond.

> a) Do not create a corresponding composite type for toast tables. Not
>    super pretty, but I doubt it'd be a huge issue.

I suspect there are places that assume all tables have type OIDs.

> b) Use *one* composite type for all of the toast tables.  That'd not be
>    entirely trivial because of pg_type.typrelid.

That might work, with some klugery.  Peter might have some insight about
this --- I'm not sure whether the CREATE TABLE OF TYPE syntax shares
a type OID across all the tables.

            regards, tom lane

diff --git a/src/backend/catalog/catalog.c b/src/backend/catalog/catalog.c
index 11ee536..92d943c 100644
*** a/src/backend/catalog/catalog.c
--- b/src/backend/catalog/catalog.c
***************
*** 38,43 ****
--- 38,44 ----
  #include "catalog/pg_shseclabel.h"
  #include "catalog/pg_subscription.h"
  #include "catalog/pg_tablespace.h"
+ #include "catalog/pg_type.h"
  #include "catalog/toasting.h"
  #include "miscadmin.h"
  #include "storage/fd.h"
*************** GetNewOidWithIndex(Relation relation, Oi
*** 340,345 ****
--- 341,354 ----
      ScanKeyData key;
      bool        collides;

+     /*
+      * We should never be asked to generate a new pg_type OID during
+      * pg_upgrade; doing so would risk collisions with the OIDs it wants to
+      * assign.  Hitting this assert means there's some path where we failed to
+      * ensure that a type OID is determined by commands in the dump script.
+      */
+     Assert(!IsBinaryUpgrade || RelationGetRelid(relation) != TypeRelationId);
+
      InitDirtySnapshot(SnapshotDirty);

      /* Generate new OIDs until we find one not in the table */
*************** GetNewRelFileNode(Oid reltablespace, Rel
*** 391,396 ****
--- 400,412 ----
      bool        collides;
      BackendId    backend;

+     /*
+      * If we ever get here during pg_upgrade, there's something wrong; all
+      * relfilenode assignments during a binary-upgrade run should be
+      * determined by commands in the dump script.
+      */
+     Assert(!IsBinaryUpgrade);
+
      switch (relpersistence)
      {
          case RELPERSISTENCE_TEMP:

-- 
Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Andres Freund
Дата:
Сообщение: Re: [HACKERS] Transactional sequence stuff breaks pg_upgrade
Следующее
От: Andres Freund
Дата:
Сообщение: Re: [HACKERS] Relpartbound, toasting and pg_class