about BufferPoolBlowaway() - Mailing list pgsql-hackers

From Seung Hyun Jeong
Subject about BufferPoolBlowaway()
Date
Msg-id 000501c1cb4f$bdf0bbd0$15c65882@cs.man.ac.uk
Whole thread Raw
Responses Re: about BufferPoolBlowaway()  (Tom Lane <tgl@sss.pgh.pa.us>)
List pgsql-hackers
Hi, all.

I am experimenting on performance evaluation for some queries based on
PostgreSQL.
To give fair conditions to each queries, I try to clear buffer of PostgreSQL
before running each queries.
I think  the following function in .../backend/storage/buffer/bufmgr.c seems
to be designed
for such a purpose.
But the function seems to have a logical error in my opinion.

void BufferPoolBlowaway()
{
1:    int  i;

2:   BufferSync();
3:    for (i = 1; i <= NBuffers; i++)
4:   {
5:        if (BufferIsValid(i))
6:       {
7:           while (BufferIsValid(i))  ReleaseBuffer(i);
8:        }
9:       BufTableDelete(&BufferDescriptors[i - 1]);   }
}

The line 7 causes an infinite loop, I think.
So, what I did instead is the following:

void BufferPoolBlowaway()
{
1:    BufferDesc  *bufHdr;
2:    int  i;

3:    BufferSync();
4:    for (i = 1; i <= NBuffers; i++)
5:   {
6:       if (BufferIsValid(i))
7:      {
8:          bufHdr = &BufferDescriptors[i - 1];
9:          while (bufHdr->refcount > 0) ReleaseBuffer(i);
10:     }
11:     BufTableDelete(&BufferDescriptors[i - 1]);
12: }
}

Line 1, 8, and 9 are added instead of the original to release buffers.
It works without any infinite loop, but I am not quite sure that my
modification is reasonable.
Can anybody advise me about the modification?

In addition, I wonder that the disk read/write operations via buffer manager
in PostgreSQL
are free from linux system buffer cache.
If not, does anyone know how to flush and initialize the linux system buffer
cache?

Cheers.










pgsql-hackers by date:

Previous
From: Jean-Paul ARGUDO
Date:
Subject: Re: Pre-preparing / parsing SQL statements
Next
From: Turbo Fredriksson
Date:
Subject: 'Following' the Primary key