openGauss源码#CSN(commit_sequence_

2021-01-04  本文已影响0人  upup果

CSNManager封装了全局唯一自动递增的数字逻辑。CSN(commit_sequence_number)用于识别提交记录的顺序。MOTstd::atomic<uint64_t> m_csn保存当前csn值.并提供了GetNextCSN和GetCurrentCSN来获取CSN,SetCSN可以为CSN赋值.SetCSN和GetCurrentCSN比较简单,主要介绍一下GetCurrentCSN的实现,其实也比较简单,见下面的源码注释:

uint64_t CSNManager::GetNextCSN()
{
    //数据恢复时不能CSN不能增长
    if (MOTEngine::GetInstance() && MOTEngine::GetInstance()->IsRecovering()) {
        MOT_LOG_DEBUG("CSN increment is not supported during recovery");
        return 0;
    } else {
        //初始化
        uint64_t current = 0;
        uint64_t next = 0; 
        do {
            current = m_csn; //赋值为当前m_csn
            next = current + 1; //增加1
        } while (!m_csn.compare_exchange_strong(current, next, std::memory_order_acq_rel));
        //上面while循环的条件,意思是:意思是如果当前的变
        //量this的值==expect值,则将this值改为desire,并返回true,否则,返回false,不进行修改
        return next;
    }
}
上一篇 下一篇

猜你喜欢

热点阅读