Failure to repack a table with all columns with PLAIN storage
vmarkovtsev opened this issue · comments
I've got this table:
CREATE TABLE github.node_ref (
name text,
prefix text,
acc_id bigint NOT NULL,
associated_pull_requests_ecnt bigint,
graph_id bigint NOT NULL,
repository_id bigint,
target_id bigint
);
ALTER TABLE ONLY github.node_ref ALTER COLUMN name SET STORAGE PLAIN;
ALTER TABLE ONLY github.node_ref ALTER COLUMN prefix SET STORAGE PLAIN;
ALTER TABLE ONLY github.node_ref
ADD CONSTRAINT node_ref_pkey PRIMARY KEY (acc_id, graph_id);
Therefore, the two text
columns should not get TOAST-ed.
pg_repack
fails with the following log:
06:41:03 [repack github.node_ref] 06:41:03 repack jobs: 1 06:41:03 validating connection 06:41:05 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:41:05 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:41:05 LOG: (query) select repack.version(), repack.version_sql() 06:41:05 LOG: (query) SET statement_timeout = 0 06:41:05 LOG: (query) SET search_path = pg_catalog, pg_temp, public 06:41:05 LOG: (query) SET client_min_messages = warning 06:41:05 LOG: (query) SELECT r FROM (VALUES ($1)) AS given_t(r) WHERE NOT EXISTS( SELECT FROM repack.tables WHERE relid=to_regclass(given_t.r) ) 06:41:05 LOG: (param:0) = github.node_ref 06:41:05 LOG: (query) SELECT t.*, coalesce(v.tablespace, t.tablespace_orig) as tablespace_dest FROM repack.tables t, (VALUES (quote_ident($1::text))) as v (tablespace) WHERE (relid = $2::regclass) ORDER BY t.relname, t.schemaname 06:41:05 LOG: (param:0) = (null) 06:41:05 LOG: (param:1) = github.node_ref 06:41:05 INFO: repacking table "github.node_ref" 06:41:05 LOG: (query) SELECT pg_try_advisory_lock($1, CAST(-2147483648 + $2::bigint AS integer)) 06:41:05 LOG: (param:0) = 16185446 06:41:05 LOG: (param:1) = 17808 06:41:05 LOG: (query) BEGIN ISOLATION LEVEL READ COMMITTED 06:41:05 LOG: (query) SET LOCAL statement_timeout = 100 06:41:05 LOG: (query) LOCK TABLE github.node_ref IN ACCESS EXCLUSIVE MODE 06:41:05 LOG: (query) RESET statement_timeout 06:41:05 LOG: (query) SELECT pg_get_indexdef(indexrelid) FROM pg_index WHERE indrelid = $1 AND NOT indisvalid 06:41:05 LOG: (param:0) = 17808 06:41:05 LOG: (query) SELECT indexrelid, repack.repack_indexdef(indexrelid, indrelid, $2, FALSE) FROM pg_index WHERE indrelid = $1 AND indisvalid 06:41:05 LOG: (param:0) = 17808 06:41:05 LOG: (param:1) = (null) 06:41:05 LOG: (query) SELECT repack.conflicted_triggers($1) 06:41:05 LOG: (param:0) = 17808 06:41:05 LOG: (query) CREATE TYPE repack.pk_17808 AS (acc_id bigint, graph_id bigint) 06:41:05 LOG: (query) CREATE TABLE repack.log_17808 (id bigserial PRIMARY KEY, pk repack.pk_17808, row github.node_ref) 06:41:05 LOG: (query) CREATE TRIGGER repack_trigger AFTER INSERT OR DELETE OR UPDATE ON github.node_ref FOR EACH ROW EXECUTE PROCEDURE repack.repack_trigger('INSERT INTO repack.log_17808(pk, row) VALUES( CASE WHEN $1 IS NULL THEN NULL ELSE (ROW($1.acc_id, $1.graph_id)::repack.pk_17808) END, $2)') 06:41:05 LOG: (query) ALTER TABLE github.node_ref ENABLE ALWAYS TRIGGER repack_trigger 06:41:05 LOG: (query) SELECT repack.disable_autovacuum('repack.log_17808') 06:41:05 LOG: (query) BEGIN ISOLATION LEVEL READ COMMITTED 06:41:05 LOG: (query) SELECT pg_backend_pid() 06:41:05 LOG: (query) SELECT pid FROM pg_locks WHERE locktype = 'relation' AND granted = false AND relation = 17808 AND mode = 'AccessExclusiveLock' AND pid <> pg_backend_pid() 06:41:05 LOG: (query) COMMIT 06:41:05 LOG: (query) BEGIN ISOLATION LEVEL SERIALIZABLE 06:41:05 LOG: (query) SELECT set_config('work_mem', current_setting('maintenance_work_mem'), true) 06:41:05 LOG: (query) SELECT coalesce(array_agg(l.virtualtransaction), '{}') FROM pg_locks AS l LEFT JOIN pg_stat_activity AS a ON l.pid = a.pid LEFT JOIN pg_database AS d ON a.datid = d.oid WHERE l.locktype = 'virtualxid' AND l.pid NOT IN (pg_backend_pid(), $1) AND (l.virtualxid, l.virtualtransaction) <> ('1/1', '-1/0') AND (a.application_name IS NULL OR a.application_name <> $2) AND a.query !~* E'^\\s*vacuum\\s+' AND a.query !~ E'^autovacuum: ' AND ((d.datname IS NULL OR d.datname = current_database()) OR l.database = 0) 06:41:05 LOG: (param:0) = 3150353 06:41:05 LOG: (param:1) = pg_repack 06:41:05 LOG: (query) DELETE FROM repack.log_17808 06:41:05 LOG: (query) SELECT pid FROM pg_locks WHERE locktype = 'relation' AND granted = false AND relation = 17808 AND mode = 'AccessExclusiveLock' AND pid <> pg_backend_pid() 06:41:05 LOG: (query) SET LOCAL statement_timeout = 100 06:41:05 LOG: (query) LOCK TABLE github.node_ref IN ACCESS SHARE MODE 06:41:05 LOG: (query) RESET statement_timeout 06:41:05 LOG: (query) CREATE TABLE repack.table_17808 WITH (autovacuum_vacuum_scale_factor=0, autovacuum_vacuum_threshold=10000, autovacuum_analyze_scale_factor=0, autovacuum_analyze_threshold=10000, oids = false) TABLESPACE pg_default AS SELECT name,prefix,acc_id,associated_pull_requests_ecnt,graph_id,repository_id,target_id FROM ONLY github.node_ref WITH NO DATA 06:41:05 LOG: (query) ALTER TABLE repack.table_17808 ALTER name SET STORAGE PLAIN, ALTER prefix SET STORAGE PLAIN 06:41:05 LOG: (query) INSERT INTO repack.table_17808 SELECT name,prefix,acc_id,associated_pull_requests_ecnt,graph_id,repository_id,target_id FROM ONLY github.node_ref 06:41:05 LOG: (query) SELECT repack.disable_autovacuum('repack.table_17808') 06:41:05 LOG: (query) COMMIT 06:41:05 LOG: (query) CREATE UNIQUE INDEX index_422393 ON repack.table_17808 USING btree (acc_id, graph_id) 06:41:05 LOG: (query) CREATE INDEX index_23326246 ON repack.table_17808 USING btree (acc_id, prefix, repository_id) 06:41:05 LOG: (query) CREATE INDEX index_66278009 ON repack.table_17808 USING btree (acc_id, repository_id) WHERE (prefix = 'refs/tags/'::text) 06:41:05 LOG: (query) SELECT repack.repack_apply($1, $2, $3, $4, $5, $6) 06:41:05 LOG: (param:0) = SELECT * FROM repack.log_17808 ORDER BY id LIMIT $1 06:41:05 LOG: (param:1) = INSERT INTO repack.table_17808 VALUES ($1.*) 06:41:05 LOG: (param:2) = DELETE FROM repack.table_17808 WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:41:05 LOG: (param:3) = UPDATE repack.table_17808 SET (name, prefix, acc_id, associated_pull_requests_ecnt, graph_id, repository_id, target_id) = ($2.name, $2.prefix, $2.acc_id, $2.associated_pull_requests_ecnt, $2.graph_id, $2.repository_id, $2.target_id) WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:41:05 LOG: (param:4) = DELETE FROM repack.log_17808 WHERE id IN ( 06:41:05 LOG: (param:5) = 1000 06:41:05 LOG: (query) SELECT pid FROM pg_locks WHERE locktype = 'virtualxid' AND pid <> pg_backend_pid() AND virtualtransaction = ANY($1) 06:41:05 LOG: (param:0) = {} 06:41:05 LOG: (query) SAVEPOINT repack_sp1 06:41:05 LOG: (query) SET LOCAL statement_timeout = 100 06:41:05 LOG: (query) LOCK TABLE github.node_ref IN ACCESS EXCLUSIVE MODE 06:41:05 LOG: (query) RESET statement_timeout 06:41:05 LOG: (query) SELECT repack.repack_apply($1, $2, $3, $4, $5, $6) 06:41:05 LOG: (param:0) = SELECT * FROM repack.log_17808 ORDER BY id LIMIT $1 06:41:05 LOG: (param:1) = INSERT INTO repack.table_17808 VALUES ($1.*) 06:41:05 LOG: (param:2) = DELETE FROM repack.table_17808 WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:41:05 LOG: (param:3) = UPDATE repack.table_17808 SET (name, prefix, acc_id, associated_pull_requests_ecnt, graph_id, repository_id, target_id) = ($2.name, $2.prefix, $2.acc_id, $2.associated_pull_requests_ecnt, $2.graph_id, $2.repository_id, $2.target_id) WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:41:05 LOG: (param:4) = DELETE FROM repack.log_17808 WHERE id IN ( 06:41:05 LOG: (param:5) = 0 06:41:05 LOG: (query) SELECT repack.repack_swap($1) 06:41:05 LOG: (param:0) = 17808 06:41:05 ERROR: query failed: ERROR: repack_swap : unexpected toast relations (T1=0, I1=0, T2=68003910, I2=68003912 06:41:05 DETAIL: query was: SELECT repack.repack_swap($1) 06:41:05 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:41:05 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:41:05 LOG: (query) SELECT repack.repack_drop($1, $2) 06:41:05 LOG: (param:0) = 17808 06:41:05 LOG: (param:1) = 4 06:41:05 repack retry 1 06:42:13 validating connection 06:42:13 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:42:13 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:42:13 LOG: (query) select repack.version(), repack.version_sql() 06:42:13 LOG: (query) SET statement_timeout = 0 06:42:13 LOG: (query) SET search_path = pg_catalog, pg_temp, public 06:42:13 LOG: (query) SET client_min_messages = warning 06:42:13 LOG: (query) SELECT r FROM (VALUES ($1)) AS given_t(r) WHERE NOT EXISTS( SELECT FROM repack.tables WHERE relid=to_regclass(given_t.r) ) 06:42:13 LOG: (param:0) = github.node_ref 06:42:13 LOG: (query) SELECT t.*, coalesce(v.tablespace, t.tablespace_orig) as tablespace_dest FROM repack.tables t, (VALUES (quote_ident($1::text))) as v (tablespace) WHERE (relid = $2::regclass) ORDER BY t.relname, t.schemaname 06:42:13 LOG: (param:0) = (null) 06:42:13 LOG: (param:1) = github.node_ref 06:42:13 INFO: repacking table "github.node_ref" 06:42:13 LOG: (query) SELECT pg_try_advisory_lock($1, CAST(-2147483648 + $2::bigint AS integer)) 06:42:13 LOG: (param:0) = 16185446 06:42:13 LOG: (param:1) = 17808 06:42:13 LOG: (query) BEGIN ISOLATION LEVEL READ COMMITTED 06:42:13 LOG: (query) SET LOCAL statement_timeout = 100 06:42:13 LOG: (query) LOCK TABLE github.node_ref IN ACCESS EXCLUSIVE MODE 06:42:13 LOG: (query) RESET statement_timeout 06:42:13 LOG: (query) SELECT pg_get_indexdef(indexrelid) FROM pg_index WHERE indrelid = $1 AND NOT indisvalid 06:42:13 LOG: (param:0) = 17808 06:42:13 LOG: (query) SELECT indexrelid, repack.repack_indexdef(indexrelid, indrelid, $2, FALSE) FROM pg_index WHERE indrelid = $1 AND indisvalid 06:42:13 LOG: (param:0) = 17808 06:42:13 LOG: (param:1) = (null) 06:42:13 LOG: (query) SELECT repack.conflicted_triggers($1) 06:42:13 LOG: (param:0) = 17808 06:42:13 LOG: (query) CREATE TYPE repack.pk_17808 AS (acc_id bigint, graph_id bigint) 06:42:13 LOG: (query) CREATE TABLE repack.log_17808 (id bigserial PRIMARY KEY, pk repack.pk_17808, row github.node_ref) 06:42:13 LOG: (query) CREATE TRIGGER repack_trigger AFTER INSERT OR DELETE OR UPDATE ON github.node_ref FOR EACH ROW EXECUTE PROCEDURE repack.repack_trigger('INSERT INTO repack.log_17808(pk, row) VALUES( CASE WHEN $1 IS NULL THEN NULL ELSE (ROW($1.acc_id, $1.graph_id)::repack.pk_17808) END, $2)') 06:42:13 LOG: (query) ALTER TABLE github.node_ref ENABLE ALWAYS TRIGGER repack_trigger 06:42:13 LOG: (query) SELECT repack.disable_autovacuum('repack.log_17808') 06:42:13 LOG: (query) BEGIN ISOLATION LEVEL READ COMMITTED 06:42:13 LOG: (query) SELECT pg_backend_pid() 06:42:13 LOG: (query) SELECT pid FROM pg_locks WHERE locktype = 'relation' AND granted = false AND relation = 17808 AND mode = 'AccessExclusiveLock' AND pid <> pg_backend_pid() 06:42:13 LOG: (query) COMMIT 06:42:13 LOG: (query) BEGIN ISOLATION LEVEL SERIALIZABLE 06:42:13 LOG: (query) SELECT set_config('work_mem', current_setting('maintenance_work_mem'), true) 06:42:13 LOG: (query) SELECT coalesce(array_agg(l.virtualtransaction), '{}') FROM pg_locks AS l LEFT JOIN pg_stat_activity AS a ON l.pid = a.pid LEFT JOIN pg_database AS d ON a.datid = d.oid WHERE l.locktype = 'virtualxid' AND l.pid NOT IN (pg_backend_pid(), $1) AND (l.virtualxid, l.virtualtransaction) <> ('1/1', '-1/0') AND (a.application_name IS NULL OR a.application_name <> $2) AND a.query !~* E'^\\s*vacuum\\s+' AND a.query !~ E'^autovacuum: ' AND ((d.datname IS NULL OR d.datname = current_database()) OR l.database = 0) 06:42:13 LOG: (param:0) = 3150416 06:42:13 LOG: (param:1) = pg_repack 06:42:13 LOG: (query) DELETE FROM repack.log_17808 06:42:13 LOG: (query) SELECT pid FROM pg_locks WHERE locktype = 'relation' AND granted = false AND relation = 17808 AND mode = 'AccessExclusiveLock' AND pid <> pg_backend_pid() 06:42:13 LOG: (query) SET LOCAL statement_timeout = 100 06:42:13 LOG: (query) LOCK TABLE github.node_ref IN ACCESS SHARE MODE 06:42:13 LOG: (query) RESET statement_timeout 06:42:13 LOG: (query) CREATE TABLE repack.table_17808 WITH (autovacuum_vacuum_scale_factor=0, autovacuum_vacuum_threshold=10000, autovacuum_analyze_scale_factor=0, autovacuum_analyze_threshold=10000, oids = false) TABLESPACE pg_default AS SELECT name,prefix,acc_id,associated_pull_requests_ecnt,graph_id,repository_id,target_id FROM ONLY github.node_ref WITH NO DATA 06:42:13 LOG: (query) ALTER TABLE repack.table_17808 ALTER name SET STORAGE PLAIN, ALTER prefix SET STORAGE PLAIN 06:42:13 LOG: (query) INSERT INTO repack.table_17808 SELECT name,prefix,acc_id,associated_pull_requests_ecnt,graph_id,repository_id,target_id FROM ONLY github.node_ref 06:42:13 LOG: (query) SELECT repack.disable_autovacuum('repack.table_17808') 06:42:13 LOG: (query) COMMIT 06:42:13 LOG: (query) CREATE UNIQUE INDEX index_422393 ON repack.table_17808 USING btree (acc_id, graph_id) 06:42:13 LOG: (query) CREATE INDEX index_23326246 ON repack.table_17808 USING btree (acc_id, prefix, repository_id) 06:42:13 LOG: (query) CREATE INDEX index_66278009 ON repack.table_17808 USING btree (acc_id, repository_id) WHERE (prefix = 'refs/tags/'::text) 06:42:13 LOG: (query) SELECT repack.repack_apply($1, $2, $3, $4, $5, $6) 06:42:13 LOG: (param:0) = SELECT * FROM repack.log_17808 ORDER BY id LIMIT $1 06:42:13 LOG: (param:1) = INSERT INTO repack.table_17808 VALUES ($1.*) 06:42:13 LOG: (param:2) = DELETE FROM repack.table_17808 WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:42:13 LOG: (param:3) = UPDATE repack.table_17808 SET (name, prefix, acc_id, associated_pull_requests_ecnt, graph_id, repository_id, target_id) = ($2.name, $2.prefix, $2.acc_id, $2.associated_pull_requests_ecnt, $2.graph_id, $2.repository_id, $2.target_id) WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:42:13 LOG: (param:4) = DELETE FROM repack.log_17808 WHERE id IN ( 06:42:13 LOG: (param:5) = 1000 06:42:13 LOG: (query) SELECT pid FROM pg_locks WHERE locktype = 'virtualxid' AND pid <> pg_backend_pid() AND virtualtransaction = ANY($1) 06:42:13 LOG: (param:0) = {} 06:42:13 LOG: (query) SAVEPOINT repack_sp1 06:42:13 LOG: (query) SET LOCAL statement_timeout = 100 06:42:13 LOG: (query) LOCK TABLE github.node_ref IN ACCESS EXCLUSIVE MODE 06:42:13 LOG: (query) RESET statement_timeout 06:42:13 LOG: (query) SELECT repack.repack_apply($1, $2, $3, $4, $5, $6) 06:42:13 LOG: (param:0) = SELECT * FROM repack.log_17808 ORDER BY id LIMIT $1 06:42:13 LOG: (param:1) = INSERT INTO repack.table_17808 VALUES ($1.*) 06:42:13 LOG: (param:2) = DELETE FROM repack.table_17808 WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:42:13 LOG: (param:3) = UPDATE repack.table_17808 SET (name, prefix, acc_id, associated_pull_requests_ecnt, graph_id, repository_id, target_id) = ($2.name, $2.prefix, $2.acc_id, $2.associated_pull_requests_ecnt, $2.graph_id, $2.repository_id, $2.target_id) WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:42:13 LOG: (param:4) = DELETE FROM repack.log_17808 WHERE id IN ( 06:42:13 LOG: (param:5) = 0 06:42:13 LOG: (query) SELECT repack.repack_swap($1) 06:42:13 LOG: (param:0) = 17808 06:42:13 ERROR: query failed: ERROR: repack_swap : unexpected toast relations (T1=0, I1=0, T2=68003934, I2=68003936 06:42:13 DETAIL: query was: SELECT repack.repack_swap($1) 06:42:13 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:42:13 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:42:13 LOG: (query) SELECT repack.repack_drop($1, $2) 06:42:13 LOG: (param:0) = 17808 06:42:13 LOG: (param:1) = 4 06:42:13 repack retry 2 06:43:09 validating connection 06:43:10 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:43:10 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:43:10 LOG: (query) select repack.version(), repack.version_sql() 06:43:10 LOG: (query) SET statement_timeout = 0 06:43:10 LOG: (query) SET search_path = pg_catalog, pg_temp, public 06:43:10 LOG: (query) SET client_min_messages = warning 06:43:10 LOG: (query) SELECT r FROM (VALUES ($1)) AS given_t(r) WHERE NOT EXISTS( SELECT FROM repack.tables WHERE relid=to_regclass(given_t.r) ) 06:43:10 LOG: (param:0) = github.node_ref 06:43:10 LOG: (query) SELECT t.*, coalesce(v.tablespace, t.tablespace_orig) as tablespace_dest FROM repack.tables t, (VALUES (quote_ident($1::text))) as v (tablespace) WHERE (relid = $2::regclass) ORDER BY t.relname, t.schemaname 06:43:10 LOG: (param:0) = (null) 06:43:10 LOG: (param:1) = github.node_ref 06:43:10 INFO: repacking table "github.node_ref" 06:43:10 LOG: (query) SELECT pg_try_advisory_lock($1, CAST(-2147483648 + $2::bigint AS integer)) 06:43:10 LOG: (param:0) = 16185446 06:43:10 LOG: (param:1) = 17808 06:43:10 LOG: (query) BEGIN ISOLATION LEVEL READ COMMITTED 06:43:10 LOG: (query) SET LOCAL statement_timeout = 100 06:43:10 LOG: (query) LOCK TABLE github.node_ref IN ACCESS EXCLUSIVE MODE 06:43:10 LOG: (query) RESET statement_timeout 06:43:10 LOG: (query) SELECT pg_get_indexdef(indexrelid) FROM pg_index WHERE indrelid = $1 AND NOT indisvalid 06:43:10 LOG: (param:0) = 17808 06:43:10 LOG: (query) SELECT indexrelid, repack.repack_indexdef(indexrelid, indrelid, $2, FALSE) FROM pg_index WHERE indrelid = $1 AND indisvalid 06:43:10 LOG: (param:0) = 17808 06:43:10 LOG: (param:1) = (null) 06:43:10 LOG: (query) SELECT repack.conflicted_triggers($1) 06:43:10 LOG: (param:0) = 17808 06:43:10 LOG: (query) CREATE TYPE repack.pk_17808 AS (acc_id bigint, graph_id bigint) 06:43:10 LOG: (query) CREATE TABLE repack.log_17808 (id bigserial PRIMARY KEY, pk repack.pk_17808, row github.node_ref) 06:43:10 LOG: (query) CREATE TRIGGER repack_trigger AFTER INSERT OR DELETE OR UPDATE ON github.node_ref FOR EACH ROW EXECUTE PROCEDURE repack.repack_trigger('INSERT INTO repack.log_17808(pk, row) VALUES( CASE WHEN $1 IS NULL THEN NULL ELSE (ROW($1.acc_id, $1.graph_id)::repack.pk_17808) END, $2)') 06:43:10 LOG: (query) ALTER TABLE github.node_ref ENABLE ALWAYS TRIGGER repack_trigger 06:43:10 LOG: (query) SELECT repack.disable_autovacuum('repack.log_17808') 06:43:10 LOG: (query) BEGIN ISOLATION LEVEL READ COMMITTED 06:43:10 LOG: (query) SELECT pg_backend_pid() 06:43:10 LOG: (query) SELECT pid FROM pg_locks WHERE locktype = 'relation' AND granted = false AND relation = 17808 AND mode = 'AccessExclusiveLock' AND pid <> pg_backend_pid() 06:43:10 LOG: (query) COMMIT 06:43:10 LOG: (query) BEGIN ISOLATION LEVEL SERIALIZABLE 06:43:10 LOG: (query) SELECT set_config('work_mem', current_setting('maintenance_work_mem'), true) 06:43:10 LOG: (query) SELECT coalesce(array_agg(l.virtualtransaction), '{}') FROM pg_locks AS l LEFT JOIN pg_stat_activity AS a ON l.pid = a.pid LEFT JOIN pg_database AS d ON a.datid = d.oid WHERE l.locktype = 'virtualxid' AND l.pid NOT IN (pg_backend_pid(), $1) AND (l.virtualxid, l.virtualtransaction) <> ('1/1', '-1/0') AND (a.application_name IS NULL OR a.application_name <> $2) AND a.query !~* E'^\\s*vacuum\\s+' AND a.query !~ E'^autovacuum: ' AND ((d.datname IS NULL OR d.datname = current_database()) OR l.database = 0) 06:43:10 LOG: (param:0) = 3150478 06:43:10 LOG: (param:1) = pg_repack 06:43:10 LOG: (query) DELETE FROM repack.log_17808 06:43:10 LOG: (query) SELECT pid FROM pg_locks WHERE locktype = 'relation' AND granted = false AND relation = 17808 AND mode = 'AccessExclusiveLock' AND pid <> pg_backend_pid() 06:43:10 LOG: (query) SET LOCAL statement_timeout = 100 06:43:10 LOG: (query) LOCK TABLE github.node_ref IN ACCESS SHARE MODE 06:43:10 LOG: (query) RESET statement_timeout 06:43:10 LOG: (query) CREATE TABLE repack.table_17808 WITH (autovacuum_vacuum_scale_factor=0, autovacuum_vacuum_threshold=10000, autovacuum_analyze_scale_factor=0, autovacuum_analyze_threshold=10000, oids = false) TABLESPACE pg_default AS SELECT name,prefix,acc_id,associated_pull_requests_ecnt,graph_id,repository_id,target_id FROM ONLY github.node_ref WITH NO DATA 06:43:10 LOG: (query) ALTER TABLE repack.table_17808 ALTER name SET STORAGE PLAIN, ALTER prefix SET STORAGE PLAIN 06:43:10 LOG: (query) INSERT INTO repack.table_17808 SELECT name,prefix,acc_id,associated_pull_requests_ecnt,graph_id,repository_id,target_id FROM ONLY github.node_ref 06:43:10 LOG: (query) SELECT repack.disable_autovacuum('repack.table_17808') 06:43:10 LOG: (query) COMMIT 06:43:10 LOG: (query) CREATE UNIQUE INDEX index_422393 ON repack.table_17808 USING btree (acc_id, graph_id) 06:43:10 LOG: (query) CREATE INDEX index_23326246 ON repack.table_17808 USING btree (acc_id, prefix, repository_id) 06:43:10 LOG: (query) CREATE INDEX index_66278009 ON repack.table_17808 USING btree (acc_id, repository_id) WHERE (prefix = 'refs/tags/'::text) 06:43:10 LOG: (query) SELECT repack.repack_apply($1, $2, $3, $4, $5, $6) 06:43:10 LOG: (param:0) = SELECT * FROM repack.log_17808 ORDER BY id LIMIT $1 06:43:10 LOG: (param:1) = INSERT INTO repack.table_17808 VALUES ($1.*) 06:43:10 LOG: (param:2) = DELETE FROM repack.table_17808 WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:43:10 LOG: (param:3) = UPDATE repack.table_17808 SET (name, prefix, acc_id, associated_pull_requests_ecnt, graph_id, repository_id, target_id) = ($2.name, $2.prefix, $2.acc_id, $2.associated_pull_requests_ecnt, $2.graph_id, $2.repository_id, $2.target_id) WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:43:10 LOG: (param:4) = DELETE FROM repack.log_17808 WHERE id IN ( 06:43:10 LOG: (param:5) = 1000 06:43:10 LOG: (query) SELECT pid FROM pg_locks WHERE locktype = 'virtualxid' AND pid <> pg_backend_pid() AND virtualtransaction = ANY($1) 06:43:10 LOG: (param:0) = {} 06:43:10 LOG: (query) SAVEPOINT repack_sp1 06:43:10 LOG: (query) SET LOCAL statement_timeout = 100 06:43:10 LOG: (query) LOCK TABLE github.node_ref IN ACCESS EXCLUSIVE MODE 06:43:10 LOG: (query) RESET statement_timeout 06:43:10 LOG: (query) SELECT repack.repack_apply($1, $2, $3, $4, $5, $6) 06:43:10 LOG: (param:0) = SELECT * FROM repack.log_17808 ORDER BY id LIMIT $1 06:43:10 LOG: (param:1) = INSERT INTO repack.table_17808 VALUES ($1.*) 06:43:10 LOG: (param:2) = DELETE FROM repack.table_17808 WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:43:10 LOG: (param:3) = UPDATE repack.table_17808 SET (name, prefix, acc_id, associated_pull_requests_ecnt, graph_id, repository_id, target_id) = ($2.name, $2.prefix, $2.acc_id, $2.associated_pull_requests_ecnt, $2.graph_id, $2.repository_id, $2.target_id) WHERE (acc_id, graph_id) = ($1.acc_id, $1.graph_id) 06:43:10 LOG: (param:4) = DELETE FROM repack.log_17808 WHERE id IN ( 06:43:10 LOG: (param:5) = 0 06:43:10 LOG: (query) SELECT repack.repack_swap($1) 06:43:10 LOG: (param:0) = 17808 06:43:10 ERROR: query failed: ERROR: repack_swap : unexpected toast relations (T1=0, I1=0, T2=68003958, I2=68003960 06:43:10 DETAIL: query was: SELECT repack.repack_swap($1) 06:43:10 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:43:10 LOG: (query) SET search_path TO pg_catalog, pg_temp, public 06:43:10 LOG: (query) SELECT repack.repack_drop($1, $2) 06:43:10 LOG: (param:0) = 17808 06:43:10 LOG: (param:1) = 4 06:43:10 repack timeout after 3 retry attempts
SELECT repack.repack_swap($1)
ERROR: query failed: ERROR: repack_swap : unexpected toast relations (T1=0, I1=0, T2=68003958, I2=68003960
Everything works normally if I don't override the column storage.
Hello!
Also encountered this problem and managed to reproduce:
create table tab (id int primary key, name text);
alter table tab alter name set storage plain;
\d+ tab
Table "public.tab"
Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description
--------+---------+-----------+----------+---------+---------+-------------+--------------+-------------
id | integer | | not null | | plain | | |
name | text | | | | plain | | |
Indexes:
"tab_pkey" PRIMARY KEY, btree (id)
Access method: heap
SELECT oid::regclass AS table_name, relfilenode AS table_oid, reltoastrelid::regclass, reltoastrelid AS toast_oid, pg_relation_size(reltoastrelid) AS toast_size FROM pg_class WHERE oid = ( SELECT 'tab'::regclass::oid ) ;
table_name | table_oid | reltoastrelid | toast_oid | toast_size
------------+-----------+-------------------------+-----------+------------
tab | 26484 | pg_toast.pg_toast_26484 | 26487 | 0
pg_repack -U postgres -h localhost -d test -t tab
INFO: repacking table "public.tab"
vacuum FULL tab ;
VACUUM
SELECT oid::regclass AS table_name, relfilenode AS table_oid, reltoastrelid::regclass, reltoastrelid AS toast_oid, pg_relation_size(reltoastrelid) AS toast_size FROM pg_class WHERE oid = ( SELECT 'tab'::regclass::oid ) ;
table_name | table_oid | reltoastrelid | toast_oid | toast_size
------------+-----------+---------------+-----------+------------
tab | 26545 | - | 0 |
(1 row)
pg_repack -U postgres -h localhost -d test -t tab
INFO: repacking table "public.tab"
ERROR: query failed: ERROR: repack_swap : unexpected toast relations (T1=0, I1=0, T2=26565, I2=26566
DETAIL: query was: SELECT repack.repack_swap($1)
So, Vacuum FULL delete toast table, but pg_repack create it when makes copy.
Hey everyone ,
I came to know this issue very late.
This error will happen because all columns of table have storage PLAIN and once a VACUUM FULL ran on table.
Then the repack.tables view will have 0 in both reltoastrelid and reltoastidxid.
and when we run repack on that table - the function repack_swap() will check for the reltoastrelid and reltoastidxid in repack.tables view and faills it by saying
ERROR: query failed: ERROR: repack_swap : unexpected toast relations (T1=0, I1=0, T2=68003958, I2=68003960
So i wrote a function is_allplainstorage()
and make few changes to let pg_repack know if a table have all columns storage PLAIN and 0 for realtoastrelid and reltoastidxid should not fail.
but why we should make this ?
we know PLAIN type doesn't need any toast tables but pg_repack looking it (I don't know why ).
Please find the updated code repo below which solve this issue and use it.
https://github.com/chanukyasds/pg_repack
Thanks.
@dvarrazzo @Melkij hey 👋
When you have time, could you help review the solution #337?
Fixed in #337