//在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