[LevelDB] 写批处理过程详解
leveldb的write代码初看瞎搞一堆,细看则实为短小精悍。 ? ?如上,A段代码定义一个Writer w,w的成员包括了batch信息,同时初始化了一个条件变量成员( 假设同时有w1,w2,w3,w4,w5,w6 并发请求写入。 B段代码让竞争到mutex资源的w1获取了锁。添加到writers队列里去,此时队列只有一个w1,从而其顺利的进行 继而w1进行log写入和memtable写入,之所以这里在无锁状况下时安全的,因为其它的写操作都不满足队首条件,进而不会进入log和memtable写入阶段。 当w1完成log和memtable写入后,进入d段代码,则mutex又锁住,这时B段代码中队列因为获取不到锁则队列不会修改。 进入E段代码后,w1被pop出来,由于reader==w,并且ready==last_writer,所以直接到F段代码,唤醒了此时处于队首的w3. w3唤醒时,发现自己是队首,可以顺利的进行进入 C段和D段间的代码将w3,w4整个的batch写入log和memtable. 到E段时,分别对w5,w4进行了一次cond signal.当判断到完w4 == lastwriter时,则退出E段代码。F段则对队首的w6唤醒,从而按上述步骤依次进行下去。 这样就形成了多个并发write 合并为一个batch写入log和memtable的机制。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |