mirror of
https://github.com/neondatabase/neon.git
synced 2026-05-30 19:40:39 +00:00
Handle VM and FSM truncation WAL records in the page server.
Fixes issue #190. Original patch by Konstantin Knizhnik.
This commit is contained in:
@@ -17,3 +17,29 @@ SELECT * FROM truncatetest;
|
||||
(0 rows)
|
||||
|
||||
DROP TABLE truncatetest;
|
||||
--
|
||||
-- Test that the FSM is truncated along with the table.
|
||||
--
|
||||
-- Create a test table and delete and vacuum away most of the rows.
|
||||
-- This leaves the FSM full of pages with plenty of space
|
||||
create table tt(i int);
|
||||
insert into tt select g from generate_series(1, 100000) g;
|
||||
delete from tt where i%100 != 0 and i > 10000;
|
||||
vacuum freeze tt;
|
||||
-- Delete the rest of the rows, and vacuum again. This truncates the
|
||||
-- heap to 0 blocks, and should also truncate the FSM.
|
||||
delete from tt;
|
||||
vacuum tt;
|
||||
-- This can be used to look at the FSM directly, if the 'pg_freespace' contrib module
|
||||
-- is installed
|
||||
--SELECT blkno, avail from generate_series(1, 450) blkno, pg_freespace('tt'::regclass, blkno) AS avail;
|
||||
-- Insert a row again. It should go on block #0. If the FSM was not truncated,
|
||||
-- the insertion would find a higher-numbered block in the FSM and use that instead.
|
||||
insert into tt values (0);
|
||||
select ctid, * from tt;
|
||||
ctid | i
|
||||
-------+---
|
||||
(0,1) | 0
|
||||
(1 row)
|
||||
|
||||
drop table tt;
|
||||
|
||||
@@ -16,3 +16,31 @@ VACUUM truncatetest;
|
||||
SELECT * FROM truncatetest;
|
||||
|
||||
DROP TABLE truncatetest;
|
||||
|
||||
|
||||
--
|
||||
-- Test that the FSM is truncated along with the table.
|
||||
--
|
||||
|
||||
-- Create a test table and delete and vacuum away most of the rows.
|
||||
-- This leaves the FSM full of pages with plenty of space
|
||||
create table tt(i int);
|
||||
insert into tt select g from generate_series(1, 100000) g;
|
||||
delete from tt where i%100 != 0 and i > 10000;
|
||||
vacuum freeze tt;
|
||||
|
||||
-- Delete the rest of the rows, and vacuum again. This truncates the
|
||||
-- heap to 0 blocks, and should also truncate the FSM.
|
||||
delete from tt;
|
||||
vacuum tt;
|
||||
|
||||
-- This can be used to look at the FSM directly, if the 'pg_freespace' contrib module
|
||||
-- is installed
|
||||
--SELECT blkno, avail from generate_series(1, 450) blkno, pg_freespace('tt'::regclass, blkno) AS avail;
|
||||
|
||||
-- Insert a row again. It should go on block #0. If the FSM was not truncated,
|
||||
-- the insertion would find a higher-numbered block in the FSM and use that instead.
|
||||
insert into tt values (0);
|
||||
select ctid, * from tt;
|
||||
|
||||
drop table tt;
|
||||
|
||||
Reference in New Issue
Block a user