关键点
KeyValue类中有long mvcc的变量,感觉此处可以跟踪。
MultiVersionConsistencyControl在一个Region有一个。
MultiVersionConsistencyControl{
memstoreRead:能够读取的序列号。
memstoreWrite:写操作的序列号。
writeQueue:写操作队列}
问题点
就是需要去回答的问题,这些问题十分有助于思考这个大问题
读取是版本的选择
在org.apache.hadoop.hbase.regionserver.MemStore.MemStoreScanner.getNext(Iterator
it) L777中判断了曲出来的KeyValue是否到了可以读的范围(v.getMvccVersion() <= this.readPoint)。否则掠过 在构造scanner时会将readpoint传入到scanner,说明能读到的版本在构造开始就定好了。
写的时候的版本
w = mvcc.beginMemstoreInsert();
申请一个写操作的序列号,使用的变量是memstoreWrite
mvcc.completeMemstoreInsert(w);
标记操作结束,尽量更新memstoreRead,并且通知readWriters(在compaction和flush时会用到,因为这时需要将那时的版本都等待写完才能操作)。
等待到此操作完成
回滚memstore的时候版本的控制
回滚操作时找kv有版本比较MemStore.java L334。并且会滚后再执行mvcc.completeMemstoreInsert(w);
ps:long org.apache.hadoop.hbase.regionserver.HRegion.getReadpoint(IsolationLevel isolationLevel) L1115用了一个隔离级别。之后写一篇隔离级别的小文,加深理解。