c - Clock replacement algorithm to be replaced with LRU in postgres 8.2.19 .Any ideas? -
c - Clock replacement algorithm to be replaced with LRU in postgres 8.2.19 .Any ideas? -
in postgres code, code related alter nowadays in these places
~/src/backend/storage/buffer/buf_init.c ~/src/backend/storage/buffer/bufmgr.c ~/src/backend/storage/buffer/freelist.c
i tried alter code in freelist.c
has actual clock replacement algorithm logic. can 1 please help me of how proceed replacing clock replacement algorithm logic lru logic. related ideas welcomed! in advance.
here part of code of freelist.c
volatile bufferdesc * strategygetbuffer(void) { volatile bufferdesc *buf; int trycounter; lwlockacquire(buffreelistlock, lw_exclusive); /* * seek buffer freelist. note freenext fields * considered protected buffreelistlock not * individual buffer spinlocks, it's ok manipulate them without * holding spinlock. */ while (strategycontrol->firstfreebuffer >= 0) { buf = &bufferdescriptors[strategycontrol->firstfreebuffer]; assert(buf->freenext != freenext_not_in_list); /* unconditionally remove buffer freelist */ strategycontrol->firstfreebuffer = buf->freenext; buf->freenext = freenext_not_in_list; /* * if buffer pinned or has nonzero usage_count, cannot utilize * it; discard , retry. (this can happen if vacuum set * valid buffer in freelist , else used before * got it.) */ lockbufhdr(buf); if (buf->refcount == 0 && buf->usage_count == 0) homecoming buf; unlockbufhdr(buf); } /* nil on freelist, run "clock sweep" algorithm */ trycounter = nbuffers; (;;) { buf = &bufferdescriptors[strategycontrol->nextvictimbuffer]; if (++strategycontrol->nextvictimbuffer >= nbuffers) strategycontrol->nextvictimbuffer = 0; /* * if buffer pinned or has nonzero usage_count, cannot utilize * it; decrement usage_count , maintain scanning. */ lockbufhdr(buf); if (buf->refcount == 0 && buf->usage_count == 0) homecoming buf; if (buf->usage_count > 0) { buf->usage_count--; trycounter = nbuffers; } else if (--trycounter == 0) { /* * we've scanned buffers without making state changes, * buffers pinned (or when looked @ them). * hope free 1 eventually, it's * improve fail risk getting stuck in * infinite loop. */ unlockbufhdr(buf); elog(error, "no unpinned buffers available"); } unlockbufhdr(buf); } /* not reached */ homecoming null; }
c algorithm postgresql
Comments
Post a Comment