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;
}
}