刷臟的種類
- 批量刷臟
- 單頁刷臟操作
批量刷臟是后臺線程發(fā)起酷窥,單頁刷臟操作是用戶線程發(fā)起。
批量刷臟中的同步刷臟是Redo空間不足引發(fā)的,單頁刷臟是沒有free的page引發(fā)的别瞭。
批量刷臟
批量刷臟的場景
http://www.reibang.com/p/4e20c13027f4
正常刷臟場景下FlushPages數(shù)量計算方法
http://www.reibang.com/p/60d532156264
批量刷臟線程實(shí)現(xiàn)
批量刷臟的具體執(zhí)行
http://www.reibang.com/p/4d981ec20ca6
Hazard Pointer的設(shè)計與實(shí)現(xiàn)
http://www.reibang.com/p/4b982c3b5013
單頁刷臟
單頁刷臟的具體實(shí)現(xiàn)
http://www.reibang.com/p/080056afa842
刷臟后的邏輯
是否從lru和flus里面刪除
所以在page cleaner thread 執(zhí)行flush 操作以后, 在寫IO 完成以后, 是否會把page 同時從flush_list, LRU list 同時刪除, 還是只是將oldest_modification lsn 設(shè)置成0 就可以了?
這里分兩種場景考慮:
如果這個page 是從flush_list 上面寫IO 完成, 那么就不需要從flush_list上面刪除, 因?yàn)閺膄lush list 上面刪除要完成的操作是刷臟,既然只是為了刷臟, 那么就沒必要讓他從lru list 上面刪除, 有可能這個page 被刷臟了, 還是一個熱page 是需要訪問的
如果這個page 是從lru_list 上面寫IO 完成, 那就需要從lru list 上面刪除
原因: 從lru_list 上面刪除的page 肯定說明這個page 不是hot page 了,更大的原因可能是buffer pool 空間不夠, 需要從lru list 上面淘汰一些page了, 既然這些page 是要從lru list 上面淘汰的, 那么肯定就需要從LRU list 上面移除
具體代碼在buf_page_io_complete() 中
buf_page_io_complete{
case BUF_IO_WRITE:
/* Write means a flush operation: call the completion
routine in the flush system */
buf_flush_write_complete(bpage);
if (uncompressed) {
rw_lock_sx_unlock_gen(&((buf_block_t*) bpage)->lock,
BUF_IO_WRITE);
}
buf_pool->stat.n_pages_written++;
/* We decide whether or not to evict the page from the
LRU list based on the flush_type.
* BUF_FLUSH_LIST: don't evict
* BUF_FLUSH_LRU: always evict
* BUF_FLUSH_SINGLE_PAGE: eviction preference is passed
by the caller explicitly. */
if (buf_page_get_flush_type(bpage) == BUF_FLUSH_LRU) {
evict = true;
}
if (evict) {
mutex_exit(buf_page_get_mutex(bpage));
buf_LRU_free_page(bpage, true);
} else {
mutex_exit(buf_page_get_mutex(bpage));
}
break;
}