BUG #8697: checkpoint cann't flush unlogged table's dirty page to disk. - Mailing list pgsql-bugs

From digoal@126.com
Subject BUG #8697: checkpoint cann't flush unlogged table's dirty page to disk.
Date
Msg-id E1Vv20Z-0005H0-QA@wrigleys.postgresql.org
Whole thread Raw
Responses Re: BUG #8697: checkpoint cann't flush unlogged table's dirty page to disk.  (Andres Freund <andres@2ndquadrant.com>)
List pgsql-bugs
The following bug has been logged on the website:

Bug reference:      8697
Logged by:          digoal.zhou
Email address:      digoal@126.com
PostgreSQL version: 9.3.2
Operating system:   CentOS 5.x x64
Description:

checkpoint cann't flush unlogged table's dirty page to disk.
digoal=# create table u(id int);
CREATE TABLE
-- update table u to unlogged table
-- and insert some data
digoal=# update pg_class set relpersistence ='u' where relname='u';
UPDATE 1
digoal=# insert into u select generate_series(1,100000);
INSERT 0 100000
-- then query the file stats.
digoal=# select * from pg_stat_file(pg_relation_filepath('u')),
pg_relation_filepath('u');
  size   |         access         |      modification      |         change
       | creation | isdir | pg_relation_filepath

---------+------------------------+------------------------+------------------------+----------+-------+----------------------
 3629056 | 2013-12-23 17:36:54+08 | 2013-12-23 17:37:02+08 | 2013-12-23
17:37:02+08 |          | f     | base/16399/122891
(1 row)
-- then checkpoint,
digoal=# checkpoint;
CHECKPOINT
-- and then query the file stats ,
-- we can see the stats no change.
-- so checkpoint cann't flush unlogged table's dirty page.
digoal=# select * from pg_stat_file(pg_relation_filepath('u')),
pg_relation_filepath('u');
  size   |         access         |      modification      |         change
       | creation | isdir | pg_relation_filepath

---------+------------------------+------------------------+------------------------+----------+-------+----------------------
 3629056 | 2013-12-23 17:36:54+08 | 2013-12-23 17:37:02+08 | 2013-12-23
17:37:02+08 |          | f     | base/16399/122891
(1 row)
-- then change table u to normal table
digoal=# update pg_class set relpersistence ='p' where relname='u';
UPDATE 1
-- then insert some data to u
digoal=# insert into u select generate_series(1,100000);
INSERT 0 100000
-- and then checkpoint
digoal=# checkpoint;
CHECKPOINT
-- we can see checkpoint flush the normal table's dirty page to disk
digoal=# select * from pg_stat_file(pg_relation_filepath('u')),
pg_relation_filepath('u');
  size   |         access         |      modification      |         change
       | creation | isdir | pg_relation_filepath

---------+------------------------+------------------------+------------------------+----------+-------+----------------------
 7249920 | 2013-12-23 17:36:54+08 | 2013-12-23 17:37:29+08 | 2013-12-23
17:37:29+08 |          | f     | base/16399/122891
(1 row)
-- or use this method , change the table to logged table after insert data
digoal=# update pg_class set relpersistence ='u' where relname='u';
UPDATE 1
digoal=# insert into u select generate_series(1,100000);
INSERT 0 100000
digoal=# update pg_class set relpersistence ='p' where relname='u';
UPDATE 1
digoal=# checkpoint;
CHECKPOINT
digoal=# select * from pg_stat_file(pg_relation_filepath('u')),
pg_relation_filepath('u');
   size   |         access         |      modification      |         change
        | creation | isdir | pg_relation_filepath

----------+------------------------+------------------------+------------------------+----------+-------+----------------------
 10878976 | 2013-12-23 17:36:54+08 | 2013-12-23 17:40:16+08 | 2013-12-23
17:40:16+08 |          | f     | base/16399/122891
(1 row)

pgsql-bugs by date:

Previous
From: Brett Neumeier
Date:
Subject: Re: BUG #8684: Tables with custom range domain type cannot be analyzed
Next
From: "Sylvester, Peter A."
Date:
Subject: Re: BUG #8687: HashAggregate runs out of memory