innodb buffer pool管理--flush list
原创
©著作权归作者所有:来自51CTO博客作者yzs的专栏的原创作品,请联系作者获取转载授权,否则将追究法律责任
//在mtr_commit时,将脏页添加到flush list头部。
mtr_commit
if (mtr->modifications && mtr->n_log_recs) {
mtr_log_reserve_and_write(mtr);->
mtr_add_dirtied_pages_to_flush_list(mtr);->
}
mtr_add_dirtied_pages_to_flush_list
log_flush_order_mutex_enter();
mutex_exit(&(log_sys->mutex));
mtr_memo_note_modifications(mtr);-> buf_flush_note_modification(block, mtr);->
mutex_enter(&block->mutex);
buf_flush_list_mutex_enter(buf_pool);
block->page.oldest_modification = mtr->start_lsn;
if (!block->page.oldest_modification) {
UT_LIST_ADD_FIRST(list, buf_pool->flush_list, &block->page);
}
buf_flush_list_mutex_exit(buf_pool);
mutex_exit(&block->mutex);
log_flush_order_mutex_exit();
1、 先申请log_sys->log_flush_order_mutex
2、 申请完就释放log_sys->mutex。为了减少log_sys->mutex的持有时间,减少竞争,采用先申请log_flush_order_mutex来保证脏页插入flush list的顺序。
3、 申请页的mutex、申请flush listmutex
4、 得到脏页的oldest_modification,以便在真正刷时写入到页内
5、 如果该脏页已经在flushlist里面,则不需要插入,否则将脏页插入到flush list
6、 释放flush listmutex、脏页的mutex、log_sys->log_flush_order_mutex