mirror of https://github.com/citusdata/citus.git
Remove pg_depend entries from columnar metadata indexes to columnar-am
In the past, having columnar tables in the cluster was causing pg upgrades to fail when attempting to access columnar metadata. This is because, pg_dump doesn't see objects that we use for columnar-am related booking as the dependencies of the tables using columnar-am. To fix that; in #5456, we inserted some "normal dependency" edges (from those objects to columnar-am) into pg_depend. This helped us ensuring the existency of a class of metadata objects --such as columnar.storageid_seq-- and helped fixing #5437. However, the normal-dependency edges that we added for indexes on columnar metadata tables --such columnar.stripe_pkey-- didn't help at all because they were indeed causing dependency loops (#5510) and pg_dump was not able to take those dependency edges into the account. For this reason, this commit deletes those dependency edges so that pg_dump stops complaining about them. Note that it's not critical to delete those edges from pg_depend since they're not breaking pg upgrades but were triggering some warning messages. And given that backporting a sql change into older versions is hard a lot, we skip backporting this.pull/6628/head
parent
be0735a329
commit
9550ebd118
|
@ -1 +1,19 @@
|
||||||
-- citus_columnar--11.1-1--11.2-1
|
-- citus_columnar--11.1-1--11.2-1
|
||||||
|
|
||||||
|
#include "udfs/columnar_ensure_am_depends_catalog/11.2-1.sql"
|
||||||
|
|
||||||
|
DELETE FROM pg_depend
|
||||||
|
WHERE classid = 'pg_am'::regclass::oid
|
||||||
|
AND objid IN (select oid from pg_am where amname = 'columnar')
|
||||||
|
AND objsubid = 0
|
||||||
|
AND refclassid = 'pg_class'::regclass::oid
|
||||||
|
AND refobjid IN (
|
||||||
|
'columnar_internal.stripe_first_row_number_idx'::regclass::oid,
|
||||||
|
'columnar_internal.chunk_group_pkey'::regclass::oid,
|
||||||
|
'columnar_internal.chunk_pkey'::regclass::oid,
|
||||||
|
'columnar_internal.options_pkey'::regclass::oid,
|
||||||
|
'columnar_internal.stripe_first_row_number_idx'::regclass::oid,
|
||||||
|
'columnar_internal.stripe_pkey'::regclass::oid
|
||||||
|
)
|
||||||
|
AND refobjsubid = 0
|
||||||
|
AND deptype = 'n';
|
||||||
|
|
|
@ -1 +1,4 @@
|
||||||
-- citus_columnar--11.2-1--11.1-1
|
-- citus_columnar--11.2-1--11.1-1
|
||||||
|
|
||||||
|
-- Note that we intentionally do not re-insert the pg_depend records that we
|
||||||
|
-- deleted via citus_columnar--11.1-1--11.2-1.sql.
|
||||||
|
|
|
@ -0,0 +1,43 @@
|
||||||
|
CREATE OR REPLACE FUNCTION columnar_internal.columnar_ensure_am_depends_catalog()
|
||||||
|
RETURNS void
|
||||||
|
LANGUAGE plpgsql
|
||||||
|
SET search_path = pg_catalog
|
||||||
|
AS $func$
|
||||||
|
BEGIN
|
||||||
|
INSERT INTO pg_depend
|
||||||
|
WITH columnar_schema_members(relid) AS (
|
||||||
|
SELECT pg_class.oid AS relid FROM pg_class
|
||||||
|
WHERE relnamespace =
|
||||||
|
COALESCE(
|
||||||
|
(SELECT pg_namespace.oid FROM pg_namespace WHERE nspname = 'columnar_internal'),
|
||||||
|
(SELECT pg_namespace.oid FROM pg_namespace WHERE nspname = 'columnar')
|
||||||
|
)
|
||||||
|
AND relname IN ('chunk',
|
||||||
|
'chunk_group',
|
||||||
|
'options',
|
||||||
|
'storageid_seq',
|
||||||
|
'stripe')
|
||||||
|
)
|
||||||
|
SELECT -- Define a dependency edge from "columnar table access method" ..
|
||||||
|
'pg_am'::regclass::oid as classid,
|
||||||
|
(select oid from pg_am where amname = 'columnar') as objid,
|
||||||
|
0 as objsubid,
|
||||||
|
-- ... to some objects registered as regclass and that lives in
|
||||||
|
-- "columnar" schema. That contains catalog tables and the sequences
|
||||||
|
-- created in "columnar" schema.
|
||||||
|
--
|
||||||
|
-- Given the possibility of user might have created their own objects
|
||||||
|
-- in columnar schema, we explicitly specify list of objects that we
|
||||||
|
-- are interested in.
|
||||||
|
'pg_class'::regclass::oid as refclassid,
|
||||||
|
columnar_schema_members.relid as refobjid,
|
||||||
|
0 as refobjsubid,
|
||||||
|
'n' as deptype
|
||||||
|
FROM columnar_schema_members
|
||||||
|
-- Avoid inserting duplicate entries into pg_depend.
|
||||||
|
EXCEPT TABLE pg_depend;
|
||||||
|
END;
|
||||||
|
$func$;
|
||||||
|
COMMENT ON FUNCTION columnar_internal.columnar_ensure_am_depends_catalog()
|
||||||
|
IS 'internal function responsible for creating dependencies from columnar '
|
||||||
|
'table access method to the rel objects in columnar schema';
|
|
@ -1,4 +1,4 @@
|
||||||
CREATE OR REPLACE FUNCTION citus_internal.columnar_ensure_am_depends_catalog()
|
CREATE OR REPLACE FUNCTION columnar_internal.columnar_ensure_am_depends_catalog()
|
||||||
RETURNS void
|
RETURNS void
|
||||||
LANGUAGE plpgsql
|
LANGUAGE plpgsql
|
||||||
SET search_path = pg_catalog
|
SET search_path = pg_catalog
|
||||||
|
@ -14,22 +14,17 @@ BEGIN
|
||||||
)
|
)
|
||||||
AND relname IN ('chunk',
|
AND relname IN ('chunk',
|
||||||
'chunk_group',
|
'chunk_group',
|
||||||
'chunk_group_pkey',
|
|
||||||
'chunk_pkey',
|
|
||||||
'options',
|
'options',
|
||||||
'options_pkey',
|
|
||||||
'storageid_seq',
|
'storageid_seq',
|
||||||
'stripe',
|
'stripe')
|
||||||
'stripe_first_row_number_idx',
|
|
||||||
'stripe_pkey')
|
|
||||||
)
|
)
|
||||||
SELECT -- Define a dependency edge from "columnar table access method" ..
|
SELECT -- Define a dependency edge from "columnar table access method" ..
|
||||||
'pg_am'::regclass::oid as classid,
|
'pg_am'::regclass::oid as classid,
|
||||||
(select oid from pg_am where amname = 'columnar') as objid,
|
(select oid from pg_am where amname = 'columnar') as objid,
|
||||||
0 as objsubid,
|
0 as objsubid,
|
||||||
-- ... to each object that is registered to pg_class and that lives
|
-- ... to some objects registered as regclass and that lives in
|
||||||
-- in "columnar" schema. That contains catalog tables, indexes
|
-- "columnar" schema. That contains catalog tables and the sequences
|
||||||
-- created on them and the sequences created in "columnar" schema.
|
-- created in "columnar" schema.
|
||||||
--
|
--
|
||||||
-- Given the possibility of user might have created their own objects
|
-- Given the possibility of user might have created their own objects
|
||||||
-- in columnar schema, we explicitly specify list of objects that we
|
-- in columnar schema, we explicitly specify list of objects that we
|
||||||
|
@ -43,6 +38,6 @@ BEGIN
|
||||||
EXCEPT TABLE pg_depend;
|
EXCEPT TABLE pg_depend;
|
||||||
END;
|
END;
|
||||||
$func$;
|
$func$;
|
||||||
COMMENT ON FUNCTION citus_internal.columnar_ensure_am_depends_catalog()
|
COMMENT ON FUNCTION columnar_internal.columnar_ensure_am_depends_catalog()
|
||||||
IS 'internal function responsible for creating dependencies from columnar '
|
IS 'internal function responsible for creating dependencies from columnar '
|
||||||
'table access method to the rel objects in columnar schema';
|
'table access method to the rel objects in columnar schema';
|
||||||
|
|
|
@ -1258,6 +1258,43 @@ SELECT * FROM pg_dist_cleanup;
|
||||||
2 | 0 | 1 | table_with_orphaned_shards_102011 | 0 | 0
|
2 | 0 | 1 | table_with_orphaned_shards_102011 | 0 | 0
|
||||||
(2 rows)
|
(2 rows)
|
||||||
|
|
||||||
|
ALTER EXTENSION citus_columnar UPDATE TO '11.2-1';
|
||||||
|
-- Make sure that we defined dependencies from all rel objects (tables,
|
||||||
|
-- indexes, sequences ..) to columnar table access method ...
|
||||||
|
SELECT pg_class.oid INTO columnar_schema_members
|
||||||
|
FROM pg_class, pg_namespace
|
||||||
|
WHERE pg_namespace.oid=pg_class.relnamespace AND
|
||||||
|
pg_namespace.nspname='columnar_internal' AND
|
||||||
|
pg_class.relname NOT IN ('chunk_group_pkey',
|
||||||
|
'chunk_pkey',
|
||||||
|
'options_pkey',
|
||||||
|
'stripe_first_row_number_idx',
|
||||||
|
'stripe_pkey');
|
||||||
|
SELECT refobjid INTO columnar_schema_members_pg_depend
|
||||||
|
FROM pg_depend
|
||||||
|
WHERE classid = 'pg_am'::regclass::oid AND
|
||||||
|
objid = (select oid from pg_am where amname = 'columnar') AND
|
||||||
|
objsubid = 0 AND
|
||||||
|
refclassid = 'pg_class'::regclass::oid AND
|
||||||
|
refobjsubid = 0 AND
|
||||||
|
deptype = 'n';
|
||||||
|
-- ... , so this should be empty,
|
||||||
|
(TABLE columnar_schema_members EXCEPT TABLE columnar_schema_members_pg_depend)
|
||||||
|
UNION
|
||||||
|
(TABLE columnar_schema_members_pg_depend EXCEPT TABLE columnar_schema_members);
|
||||||
|
oid
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
(0 rows)
|
||||||
|
|
||||||
|
-- ... , and both columnar_schema_members_pg_depend & columnar_schema_members
|
||||||
|
-- should have 5 entries.
|
||||||
|
SELECT COUNT(*)=5 FROM columnar_schema_members_pg_depend;
|
||||||
|
?column?
|
||||||
|
---------------------------------------------------------------------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
DROP TABLE columnar_schema_members, columnar_schema_members_pg_depend;
|
||||||
-- error out as cleanup records remain
|
-- error out as cleanup records remain
|
||||||
ALTER EXTENSION citus UPDATE TO '11.0-4';
|
ALTER EXTENSION citus UPDATE TO '11.0-4';
|
||||||
ERROR: pg_dist_cleanup is introduced in Citus 11.1
|
ERROR: pg_dist_cleanup is introduced in Citus 11.1
|
||||||
|
|
|
@ -267,7 +267,12 @@ ROLLBACK;
|
||||||
SELECT pg_class.oid INTO columnar_schema_members
|
SELECT pg_class.oid INTO columnar_schema_members
|
||||||
FROM pg_class, pg_namespace
|
FROM pg_class, pg_namespace
|
||||||
WHERE pg_namespace.oid=pg_class.relnamespace AND
|
WHERE pg_namespace.oid=pg_class.relnamespace AND
|
||||||
pg_namespace.nspname='columnar_internal';
|
pg_namespace.nspname='columnar_internal' AND
|
||||||
|
pg_class.relname NOT IN ('chunk_group_pkey',
|
||||||
|
'chunk_pkey',
|
||||||
|
'options_pkey',
|
||||||
|
'stripe_first_row_number_idx',
|
||||||
|
'stripe_pkey');
|
||||||
SELECT refobjid INTO columnar_schema_members_pg_depend
|
SELECT refobjid INTO columnar_schema_members_pg_depend
|
||||||
FROM pg_depend
|
FROM pg_depend
|
||||||
WHERE classid = 'pg_am'::regclass::oid AND
|
WHERE classid = 'pg_am'::regclass::oid AND
|
||||||
|
@ -285,8 +290,8 @@ UNION
|
||||||
(0 rows)
|
(0 rows)
|
||||||
|
|
||||||
-- ... , and both columnar_schema_members_pg_depend & columnar_schema_members
|
-- ... , and both columnar_schema_members_pg_depend & columnar_schema_members
|
||||||
-- should have 10 entries.
|
-- should have 5 entries.
|
||||||
SELECT COUNT(*)=10 FROM columnar_schema_members_pg_depend;
|
SELECT COUNT(*)=5 FROM columnar_schema_members_pg_depend;
|
||||||
?column?
|
?column?
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
t
|
t
|
||||||
|
@ -299,7 +304,12 @@ $$
|
||||||
SELECT pg_class.oid INTO columnar_schema_members
|
SELECT pg_class.oid INTO columnar_schema_members
|
||||||
FROM pg_class, pg_namespace
|
FROM pg_class, pg_namespace
|
||||||
WHERE pg_namespace.oid=pg_class.relnamespace AND
|
WHERE pg_namespace.oid=pg_class.relnamespace AND
|
||||||
pg_namespace.nspname='columnar_internal';
|
pg_namespace.nspname='columnar_internal' AND
|
||||||
|
pg_class.relname NOT IN ('chunk_group_pkey',
|
||||||
|
'chunk_pkey',
|
||||||
|
'options_pkey',
|
||||||
|
'stripe_first_row_number_idx',
|
||||||
|
'stripe_pkey');
|
||||||
SELECT refobjid INTO columnar_schema_members_pg_depend
|
SELECT refobjid INTO columnar_schema_members_pg_depend
|
||||||
FROM pg_depend
|
FROM pg_depend
|
||||||
WHERE classid = 'pg_am'::regclass::oid AND
|
WHERE classid = 'pg_am'::regclass::oid AND
|
||||||
|
@ -312,8 +322,8 @@ $$
|
||||||
);
|
);
|
||||||
success | result
|
success | result
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
t | SELECT 10
|
t | SELECT 5
|
||||||
t | SELECT 10
|
t | SELECT 5
|
||||||
(2 rows)
|
(2 rows)
|
||||||
|
|
||||||
SELECT success, result FROM run_command_on_workers(
|
SELECT success, result FROM run_command_on_workers(
|
||||||
|
@ -331,7 +341,7 @@ $$
|
||||||
|
|
||||||
SELECT success, result FROM run_command_on_workers(
|
SELECT success, result FROM run_command_on_workers(
|
||||||
$$
|
$$
|
||||||
SELECT COUNT(*)=10 FROM columnar_schema_members_pg_depend;
|
SELECT COUNT(*)=5 FROM columnar_schema_members_pg_depend;
|
||||||
$$
|
$$
|
||||||
);
|
);
|
||||||
success | result
|
success | result
|
||||||
|
|
|
@ -556,6 +556,39 @@ ALTER EXTENSION citus UPDATE TO '11.2-1';
|
||||||
SELECT * FROM pg_dist_placement ORDER BY shardid;
|
SELECT * FROM pg_dist_placement ORDER BY shardid;
|
||||||
SELECT * FROM pg_dist_cleanup;
|
SELECT * FROM pg_dist_cleanup;
|
||||||
|
|
||||||
|
ALTER EXTENSION citus_columnar UPDATE TO '11.2-1';
|
||||||
|
|
||||||
|
-- Make sure that we defined dependencies from all rel objects (tables,
|
||||||
|
-- indexes, sequences ..) to columnar table access method ...
|
||||||
|
SELECT pg_class.oid INTO columnar_schema_members
|
||||||
|
FROM pg_class, pg_namespace
|
||||||
|
WHERE pg_namespace.oid=pg_class.relnamespace AND
|
||||||
|
pg_namespace.nspname='columnar_internal' AND
|
||||||
|
pg_class.relname NOT IN ('chunk_group_pkey',
|
||||||
|
'chunk_pkey',
|
||||||
|
'options_pkey',
|
||||||
|
'stripe_first_row_number_idx',
|
||||||
|
'stripe_pkey');
|
||||||
|
SELECT refobjid INTO columnar_schema_members_pg_depend
|
||||||
|
FROM pg_depend
|
||||||
|
WHERE classid = 'pg_am'::regclass::oid AND
|
||||||
|
objid = (select oid from pg_am where amname = 'columnar') AND
|
||||||
|
objsubid = 0 AND
|
||||||
|
refclassid = 'pg_class'::regclass::oid AND
|
||||||
|
refobjsubid = 0 AND
|
||||||
|
deptype = 'n';
|
||||||
|
|
||||||
|
-- ... , so this should be empty,
|
||||||
|
(TABLE columnar_schema_members EXCEPT TABLE columnar_schema_members_pg_depend)
|
||||||
|
UNION
|
||||||
|
(TABLE columnar_schema_members_pg_depend EXCEPT TABLE columnar_schema_members);
|
||||||
|
|
||||||
|
-- ... , and both columnar_schema_members_pg_depend & columnar_schema_members
|
||||||
|
-- should have 5 entries.
|
||||||
|
SELECT COUNT(*)=5 FROM columnar_schema_members_pg_depend;
|
||||||
|
|
||||||
|
DROP TABLE columnar_schema_members, columnar_schema_members_pg_depend;
|
||||||
|
|
||||||
-- error out as cleanup records remain
|
-- error out as cleanup records remain
|
||||||
ALTER EXTENSION citus UPDATE TO '11.0-4';
|
ALTER EXTENSION citus UPDATE TO '11.0-4';
|
||||||
|
|
||||||
|
|
|
@ -139,7 +139,12 @@ ROLLBACK;
|
||||||
SELECT pg_class.oid INTO columnar_schema_members
|
SELECT pg_class.oid INTO columnar_schema_members
|
||||||
FROM pg_class, pg_namespace
|
FROM pg_class, pg_namespace
|
||||||
WHERE pg_namespace.oid=pg_class.relnamespace AND
|
WHERE pg_namespace.oid=pg_class.relnamespace AND
|
||||||
pg_namespace.nspname='columnar_internal';
|
pg_namespace.nspname='columnar_internal' AND
|
||||||
|
pg_class.relname NOT IN ('chunk_group_pkey',
|
||||||
|
'chunk_pkey',
|
||||||
|
'options_pkey',
|
||||||
|
'stripe_first_row_number_idx',
|
||||||
|
'stripe_pkey');
|
||||||
SELECT refobjid INTO columnar_schema_members_pg_depend
|
SELECT refobjid INTO columnar_schema_members_pg_depend
|
||||||
FROM pg_depend
|
FROM pg_depend
|
||||||
WHERE classid = 'pg_am'::regclass::oid AND
|
WHERE classid = 'pg_am'::regclass::oid AND
|
||||||
|
@ -155,8 +160,8 @@ UNION
|
||||||
(TABLE columnar_schema_members_pg_depend EXCEPT TABLE columnar_schema_members);
|
(TABLE columnar_schema_members_pg_depend EXCEPT TABLE columnar_schema_members);
|
||||||
|
|
||||||
-- ... , and both columnar_schema_members_pg_depend & columnar_schema_members
|
-- ... , and both columnar_schema_members_pg_depend & columnar_schema_members
|
||||||
-- should have 10 entries.
|
-- should have 5 entries.
|
||||||
SELECT COUNT(*)=10 FROM columnar_schema_members_pg_depend;
|
SELECT COUNT(*)=5 FROM columnar_schema_members_pg_depend;
|
||||||
|
|
||||||
DROP TABLE columnar_schema_members, columnar_schema_members_pg_depend;
|
DROP TABLE columnar_schema_members, columnar_schema_members_pg_depend;
|
||||||
|
|
||||||
|
@ -167,7 +172,12 @@ $$
|
||||||
SELECT pg_class.oid INTO columnar_schema_members
|
SELECT pg_class.oid INTO columnar_schema_members
|
||||||
FROM pg_class, pg_namespace
|
FROM pg_class, pg_namespace
|
||||||
WHERE pg_namespace.oid=pg_class.relnamespace AND
|
WHERE pg_namespace.oid=pg_class.relnamespace AND
|
||||||
pg_namespace.nspname='columnar_internal';
|
pg_namespace.nspname='columnar_internal' AND
|
||||||
|
pg_class.relname NOT IN ('chunk_group_pkey',
|
||||||
|
'chunk_pkey',
|
||||||
|
'options_pkey',
|
||||||
|
'stripe_first_row_number_idx',
|
||||||
|
'stripe_pkey');
|
||||||
SELECT refobjid INTO columnar_schema_members_pg_depend
|
SELECT refobjid INTO columnar_schema_members_pg_depend
|
||||||
FROM pg_depend
|
FROM pg_depend
|
||||||
WHERE classid = 'pg_am'::regclass::oid AND
|
WHERE classid = 'pg_am'::regclass::oid AND
|
||||||
|
@ -189,7 +199,7 @@ $$
|
||||||
|
|
||||||
SELECT success, result FROM run_command_on_workers(
|
SELECT success, result FROM run_command_on_workers(
|
||||||
$$
|
$$
|
||||||
SELECT COUNT(*)=10 FROM columnar_schema_members_pg_depend;
|
SELECT COUNT(*)=5 FROM columnar_schema_members_pg_depend;
|
||||||
$$
|
$$
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue