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 по дате отправления: