innodb purge协调线程

分为3个阶段

第一阶段:while循环中调用rseg_history_len= srv_do_purge(srv_n_purge_threads, &n_total_purged);

       while退出循环的条件

      1)srv_purge_should_exit(n_total_purged)确定:

                 Shutdown时退出。当innodb_fast_shutdown!=0或者上次purge的page数为0,返回TRUE。反过来,当innodb_fast_shutdown==0并且上次purge的page数不为0,返回FALSE,表示不退出循环,因为当fastshutdown为0时,需要做完所有purge操作才会结束线程任务。

                 关注innodb_fast_shutdown参数的意义。

      2)如果srv_shutdown_state== SRV_SHUTDOWN_NONE并且

                  (purge_sys->state== PURGE_STATE_STOP ||n_total_purged == 0)会把coordinate thread挂起。那么什么时候将purge_sys->state置为PURGE_STATE_STOP状态呢?


第二阶段:确认innodb_fast_shutdown==0时,所有的记录都被purge掉了。可以避免在退出上述循环后,有新的记录加入。这里已经不再使用work线程了。(第一个入参是      1)

          while(srv_fast_shutdown == 0 && n_pages_purged > 0) {

                    n_pages_purged = trx_purge(1,srv_purge_batch_size, false);

           }

           注:哪种情况会有新记录加入呢?如果innodb_

你可能感兴趣的:(MySQL源码分析,MySQL源码研究)