|
开始,在代码中加入调试信息。无关部分设省略。
bool
BgBufferSync(void)
{
……
int bufs_to_lap;
……
if (saved_info_valid)
{
//added by gaojian
fprintf(stderr,"saved_info_valid true\n");
int32 passes_delta = strategy_passes - prev_strategy_passes; strategy_delta = strategy_buf_id - prev_strategy_buf_id;
strategy_delta += (long) passes_delta *NBuffers;
......
if ((int32) (next_passes - strategy_passes) > 0)
{
fprintf(stderr,"next_pass > strategy_passes.\n");
/* we're one pass ahead of the strategy point */
bufs_to_lap = strategy_buf_id - next_to_clean;
……
}
else if (next_passes == strategy_passes &&
next_to_clean >= strategy_buf_id)
{
fprintf(stderr,"next_passes == strategy_passes.\n");
/* on same pass, but ahead or at least not behind */
bufs_to_lap = NBuffers - (next_to_clean - strategy_buf_id);
……
}
else
{
fprintf(stderr,"we are behind.\n");
/*
* We're behind, so skip forward to the strategy point and start
* cleaning from there.
*/
next_to_clean = strategy_buf_id;
next_passes = strategy_passes;
bufs_to_lap = NBuffers;
……
}
}
else
{
fprintf(stderr,"saved_info_valid false\n");
……
bufs_to_lap = NBuffers;
}
……
bufs_ahead = NBuffers - bufs_to_lap;
……
num_to_scan = bufs_to_lap;
......
/* Execute the LRU scan */
while (num_to_scan > 0 && reusable_buffers < upcoming_alloc_est)
{
//added by gaojian
fprintf(stderr,"num_to_scan is: %d \n",num_to_scan);
int buffer_state = SyncOneBuffer(next_to_clean, true);
if (++next_to_clean >= NBuffers)
{
next_to_clean = 0;
elog(INFO,"------------------next_passes++.\n");
next_passes++;
}
num_to_scan--;
……
}
……
new_strategy_delta = bufs_to_lap - num_to_scan;
new_recent_alloc = reusable_buffers - reusable_buffers_est;
if (new_strategy_delta > 0 && new_recent_alloc > 0)
{
scans_per_alloc = (float) new_strategy_delta / (float) new_recent_alloc;
smoothed_density += (scans_per_alloc - smoothed_density) /
smoothing_samples;
……
}
......
}
运行的结果会如何呢?
[postgres@localhost bin]$ ./postgres -D /usr/local/pgsql/data
LOG: database system was shut down at 2012-11-02 13:51:46 CST
saved_info_valid false.
LOG: autovacuum launcher started
LOG: database system is ready to accept connections
saved_info_valid true.
next_passes == strategy_passes.
saved_info_valid true.
next_passes == strategy_passes.
saved_info_valid true.
next_passes == strategy_passes.
saved_info_valid true.
next_passes == strategy_passes.
saved_info_valid true.
......
也就是说,一开始 saved_info_valid 是 false, 后来经过一次运行后,其值才发生转变,变成 true。
而之后, next_passes == startegy_passes (其实,一开始都是零)
结束 |
|