Katsuhiko Okano wrote:
> Since the cause was found and the provisional patch was made
> and solved about the CSStorm problem in previous mails, it reports.
(snip)
> (A) The algorithm which replaces a buffer is bad.
> A time stamp does not become new until swapout completes
> the swapout page.
> If access is during swap at other pages, the swapout page will be
> in the state where it is not used most,
> It is again chosen as the page for swapout.
> (When work load is high)
The following is the patch.
diff -cpr postgresql-8.1.4-orig/src/backend/access/transam/slru.c
postgresql-8.1.4-SlruSelectLRUPage-fix/src/backend/access/transam/slru.c
*** postgresql-8.1.4-orig/src/backend/access/transam/slru.c 2006-01-21
13:38:27.000000000 +0900
--- postgresql-8.1.4-SlruSelectLRUPage-fix/src/backend/access/transam/slru.c
2006-07-25 18:02:49.000000000 +0900
*************** SlruSelectLRUPage(SlruCtl ctl, int pagen
*** 703,710 ****
for (;;)
{
int slotno;
! int bestslot = 0;
unsigned int bestcount = 0;
/* See if page already has a buffer assigned */
for (slotno = 0; slotno < NUM_SLRU_BUFFERS; slotno++)
--- 703,712 ----
for (;;)
{
int slotno;
! int bestslot = -1;
! int betterslot = -1;
unsigned int bestcount = 0;
+ unsigned int bettercount = 0;
/* See if page already has a buffer assigned */
for (slotno = 0; slotno < NUM_SLRU_BUFFERS; slotno++)
*************** SlruSelectLRUPage(SlruCtl ctl, int pagen
*** 720,732 ****
*/
for (slotno = 0; slotno < NUM_SLRU_BUFFERS; slotno++)
{
! if (shared->page_status[slotno] == SLRU_PAGE_EMPTY)
! return slotno;
! if (shared->page_lru_count[slotno] > bestcount &&
! shared->page_number[slotno] !=
shared->latest_page_number)
! {
! bestslot = slotno;
! bestcount = shared->page_lru_count[slotno];
}
}
--- 722,746 ----
*/
for (slotno = 0; slotno < NUM_SLRU_BUFFERS; slotno++)
{
! switch (shared->page_status[slotno])
! {
! case SLRU_PAGE_EMPTY:
! return slotno;
! case SLRU_PAGE_READ_IN_PROGRESS:
! case SLRU_PAGE_WRITE_IN_PROGRESS:
! if (shared->page_lru_count[slotno] >
bettercount &&
! shared->page_number[slotno] !=
shared->latest_page_number)
! {
! betterslot = slotno;
! bettercount =
shared->page_lru_count[slotno];
! }
! default: /*
SLRU_PAGE_CLEAN,SLRU_PAGE_DIRTY */
! if (shared->page_lru_count[slotno] >
bestcount &&
! shared->page_number[slotno] !=
shared->latest_page_number)
! {
! bestslot = slotno;
! bestcount =
shared->page_lru_count[slotno];
! }
}
}
*************** SlruSelectLRUPage(SlruCtl ctl, int pagen
*** 736,741 ****
--- 750,758 ----
if (shared->page_status[bestslot] == SLRU_PAGE_CLEAN)
return bestslot;
+ if (bestslot == -1)
+ bestslot = betterslot;
+
/*
* We need to do I/O. Normal case is that we have to write it
out,
* but it's possible in the worst case to have selected a
read-busy
Regards,
--------
Katsuhiko Okano
okano katsuhiko _at_ oss ntt co jp
---------------------------(end of broadcast)---------------------------
TIP 1: if posting/reading through Usenet, please send an appropriate
subscribe-nomail command to [EMAIL PROTECTED] so that your
message can get through to the mailing list cleanly