HBase源码系列之MVCC

关键点

​ KeyValue类中有long mvcc的变量,感觉此处可以跟踪。

​ MultiVersionConsistencyControl在一个Region有一个。

​ MultiVersionConsistencyControl{

​ memstoreRead:能够读取的序列号。

​ memstoreWrite:写操作的序列号。

​ writeQueue:写操作队列}

问题点

就是需要去回答的问题,这些问题十分有助于思考这个大问题

  1. 读取是版本的选择

    在org.apache.hadoop.hbase.regionserver.MemStore.MemStoreScanner.getNext(Iterator it) L777中判断了曲出来的KeyValue是否到了可以读的范围(v.getMvccVersion() <= this.readPoint)。否则掠过

    在构造scanner时会将readpoint传入到scanner,说明能读到的版本在构造开始就定好了。

  2. 写的时候的版本

    w = mvcc.beginMemstoreInsert();

    ​ 申请一个写操作的序列号,使用的变量是memstoreWrite

    mvcc.completeMemstoreInsert(w);

    ​ 标记操作结束,尽量更新memstoreRead,并且通知readWriters(在compaction和flush时会用到,因为这时需要将那时的版本都等待写完才能操作)。

    ​ 等待到此操作完成

  3. 回滚memstore的时候版本的控制

    回滚操作时找kv有版本比较MemStore.java L334。并且会滚后再执行mvcc.completeMemstoreInsert(w);

ps:long org.apache.hadoop.hbase.regionserver.HRegion.getReadpoint(IsolationLevel isolationLevel) L1115用了一个隔离级别。之后写一篇隔离级别的小文,加深理解。