On Fri, Mar 24, 2017 at 3:44 PM, Ashutosh Sharma <ashu.coe...@gmail.com> wrote: > Agreed. Moreover, previous approach might even change the current > behaviour of functions like hash_page_items() and hash_page_stats() > basically when we pass UNUSED pages to these functions. Attached is > the newer version of patch.
This patch doesn't completely solve the problem: pgbench -i -s 40 alter table pgbench_accounts drop constraint pgbench_accounts_pkey; create index on pgbench_accounts using hash (aid); insert into pgbench_accounts select * from pgbench_accounts; select hash_page_type, min(n), max(n), count(*) from (select n, hash_page_type(get_raw_page('pgbench_accounts_aid_idx'::text, n)) from generate_series(0, (pg_relation_size('pgbench_accounts_aid_idx')/8192)::integer - 1) n) x group by 1; ERROR: index table contains zero page This happens because of the sparse allocation forced by _hash_alloc_buckets. Perhaps the real fix is to have that function initialize all of the pages instead of just the last one, but unless and until we decide to do that, we've got to cope with zero pages in the index. Actually, even if we did fix that I think we'd still need to do this, because the way relation extension works in general is that we first write a page of zeroes and then go back and fill in the data; an intervening crash can leave behind the intermediate state. A second problem is that the one page initialized by _hash_alloc_buckets needs to end up with a valid special space; otherwise, you get the same error Jeff complained about originally when you try to use hash_page_type() on it. I fixed those issues and committed this. -- Robert Haas EnterpriseDB: http://www.enterprisedb.com The Enterprise PostgreSQL Company -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers