On 21/07/14 16:17, Tom Lane wrote:
>> > db=# select page_header(get_raw_page(2836::oid::regclass::text, 'fsm',
>> > 1));
>> > ERROR: block number 1 is out of range for relation "pg_toast_1255"
>> > db=# select pg_relation_size(2836::oid::regclass, 'fsm');
>> > pg_relation_size
>> > ------------------
>> > 24576
> That's bizarre. AFAICS, pg_relation_size() reduces to a stat() call,
> while the other error looks like it's coming from rawpage.c's check on
> RelationGetNumberOfBlocks() which depends on mdnblocks() which prefers
> to look at the result of lseek(SEEK_END). But both of those should
> surely get the same answer, if the file's not changing.
>
> Could you trace through it and see where the results diverge? Also,
> what's the actual size of the file on disk?
# select pg_relation_filepath(2836::oid::regclass);
pg_relation_filepath
----------------------
base/25317/11790
# ls -l data/base/25317/11790*
-rw------- 1 postgres postgres 8192 Jul 21 07:31 data/base/25317/11790
-rw------- 1 postgres postgres 24576 Jul 21 07:33 data/base/25317/11790_fsm
-rw------- 1 postgres postgres 8192 Jul 21 07:33 data/base/25317/11790_vm
You see, main and vm forks of the relation are one page. Only fsm is 3
pages.
After a fresh restart of the database I attached strace to the backend.
There are only 2 lines in the output that mention that relation:
open("base/25317/11790", O_RDWR) = 35
lseek(35, 0, SEEK_END) = 8192
This happened during this query:
select get_raw_page(2836::oid::regclass::text, 'fsm', 1);
Shouldn't it rather open 11790_fsm?
Or is there something that first checks the main fork to see if the fsm
page makes sense?
It seems so because here is the same query for a relation where it works:
open("base/25317/60966", O_RDWR) = 39
lseek(39, 0, SEEK_END) = 1490944
open("base/25317/60966_fsm", O_RDWR) = 40
lseek(40, 8192, SEEK_SET) = 8192
read(40, "\37\1\0\0\360\371\275\212\305\35\0\0\30\0\0 \0 \4
\0\0\0\0\0\0\0\0\372\372\0\372"..., 8192) = 8192
First it opens the main fork, then *_fsm where it reads a page at offset
8192.
Torsten