reorg / pg_repack

Reorganize tables in PostgreSQL databases with minimal locks

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

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?