HBASE0.96 MVCC

写入的时候
每个Region包含一个Memstore,维护一个MultiVersionConsistencyControl对象

 w = mvcc.beginMemstoreInsert();...addedSize += applyFamilyMapToMemstore(familyMaps[i], w);

这里beginMemstoreInsert其实是生成一个带WriteNumber的WriteEntry,与之对应的是completeMemstoreInsert(WriteEntry e),当调用了这个方法之后WriteNumber这个才可见

public WriteEntry beginMemstoreInsert() {synchronized (writeQueue) {long nextWriteNumber = ++memstoreWrite;WriteEntry e = new WriteEntry(nextWriteNumber);writeQueue.add(e);return e;}}

applyFamilyMapToMemstore方法

  private long applyFamilyMapToMemstore(Map<byte[], List<Cell>> familyMap,MultiVersionConsistencyControl.WriteEntry localizedWriteEntry) {long size = 0;boolean freemvcc = false;try {if (localizedWriteEntry == null) {localizedWriteEntry = mvcc.beginMemstoreInsert();freemvcc = true;}for (Map.Entry<byte[], List<Cell>> e : familyMap.entrySet()) {byte[] family = e.getKey();List<Cell> cells = e.getValue();Store store = getStore(family);for (Cell cell: cells) {KeyValue kv = KeyValueUtil.ensureKeyValue(cell);kv.setMvccVersion(localizedWriteEntry.getWriteNumber());size += store.add(kv);}}} finally {if (freemvcc) {mvcc.completeMemstoreInsert(localizedWriteEntry);}}return size;}

这里每个kv都是带版本号的

KeyValue kv = KeyValueUtil.ensureKeyValue(cell);
kv.setMvccVersion(localizedWriteEntry.getWriteNumber());

completeMemstoreInsert更新可读位置的版本号memstoreRead,唤醒readWaiters.notifyAll();

public void completeMemstoreInsert(WriteEntry e) {advanceMemstore(e);waitForRead(e);
}

advanceMemstore(e);

  boolean advanceMemstore(WriteEntry e) {synchronized (writeQueue) {e.markCompleted();long nextReadValue = -1;boolean ranOnce=false;while (!writeQueue.isEmpty()) {ranOnce=true;WriteEntry queueFirst = writeQueue.getFirst();if (nextReadValue > 0) {if (nextReadValue+1 != queueFirst.getWriteNumber()) {throw new RuntimeException("invariant in completeMemstoreInsert violated, prev: "+ nextReadValue + " next: " + queueFirst.getWriteNumber());}}if (queueFirst.isCompleted()) {nextReadValue = queueFirst.getWriteNumber();writeQueue.removeFirst();} else {break;}}if (!ranOnce) {throw new RuntimeException("never was a first");}if (nextReadValue > 0) {synchronized (readWaiters) {memstoreRead = nextReadValue;readWaiters.notifyAll();}}if (memstoreRead >= e.getWriteNumber()) {return true;}return false;}}

waitForRead(e);

public void waitForRead(WriteEntry e) {
boolean interrupted = false;
synchronized (readWaiters) {while (memstoreRead < e.getWriteNumber()) {try {readWaiters.wait(0);} catch (InterruptedException ie) {// We were interrupted... finish the loop -- i.e. cleanup --and then// on our way out, reset the interrupt flag.interrupted = true;}}
}
if (interrupted) Thread.currentThread().interrupt();
}

转载于:https://www.cnblogs.com/donganwangshi/p/4202619.html

Hbase0.96 MVCC Lock 知识梳理相关推荐

  1. Flume-0.9.4数据插入HBase-0.96

    来自:http://blog.csdn.net/iam333/article/details/18770977 最近由于业务需要,需要将flume的数据插入HBase-0.96,利用flume的实时日 ...

  2. 插件化知识梳理(7) 类的动态加载入门

    一.前言 在 插件化知识梳理(6) - Small 源码分析之 Hook 原理 这一章的学习完成之后,下一步我们将进入插件化加载的精髓,动态加载类的学习,在此之前,我们需要先准备一些关于类加载的知识. ...

  3. 数据结构(C语言版) 第 八 章 排序 知识梳理 + 习题详解

    目录 一.归并排序 二.交换排序 1.快速排序 2.冒泡排序 三.插入排序 1.直接插入排序(基于顺序查找) 2.折半插入排序(基于折半查找) 3.希尔排序(基于逐趟缩小增量) 四.选择排序 0.直接 ...

  4. 数据结构(C语言版) 第 六 章 图 知识梳理 + 习题详解

    目录 一. 图的基本定义和术语 一.图的基本概念 1.度 2.连通 (1)连通图 (2)强连通/强连通图 3.回路 4.完全图 二.图的三种存储结构 1.邻接矩阵表示法 2.邻接表(链式)表示法 3. ...

  5. 数据结构(C语言版) 第 三 章 栈与队列 知识梳理 + 作业习题详解

    目录 一.栈 0.栈的基本概念 1.栈的实现 2.栈与递归 3.Hanoi塔问题 二.队列 0.队列的基本概念 1.队列的实现 2.循环队列 2.1循环队列的相关条件和公式: 3.链队列 4.链队列完 ...

  6. 数据结构(C语言版) 第二章 线性表 知识梳理+作业习题详解

    目录 一.线性表顺序存储结构(顺序表) 0.线性表的基本概念 1.样例引入:多项式相加 二.线性表链式存储结构(链表) 0.链表的基本概念 1.前插法代码实例 2.链表尾插法完整代码附带各种操作 三. ...

  7. Framework 源码解析知识梳理(5) startService 源码分析

    一.前言 最近在看关于插件化的知识,遇到了如何实现Service插件化的问题,因此,先学习一下Service内部的实现原理,这里面会涉及到应用进程和ActivityManagerService的通信, ...

  8. hadoop2.4.1结合hbase0.96.2

    接上:http://onlyoulinux.blog.51cto.com/7941460/1554951 上文说到用hadoop2.4.1分布式结合hase0.94.23出现大量的报错,没能解决,最后 ...

  9. Python基础知识梳理(一)

    Python基础知识梳理: 转载于:https://blog.51cto.com/10412806/2095116

最新文章

  1. codeforces round 421 div2 补题 CF 820 A-E
  2. 织梦后台不显示验证码的解决
  3. Solr学习总结(二)Solr的安装与配置
  4. cie计算机科学,爱德思IGCSE 计算机科学 edexcel computer science
  5. 停止从域服务器同步文件,域控制器不同步处理办法
  6. 数据分析中的统计概率_了解统计和概率:成为专家数据科学家
  7. Bootstrap 警告
  8. java 基础知识九 类与对象
  9. Oracle数据备份与恢复
  10. ue设置注释快捷键_UE编辑器快捷键大全 UltraEdit快捷键有哪些
  11. 【5G系列】MAC (Medium Access Control)协议详解
  12. 仿链家地图找房_愉快滴抓取链家地图找房中的商圈
  13. 弘辽科技:拼多多DSR动态评分有多么的重要
  14. dentity在Java里是什么意思_Function.identity()
  15. python学习之编写学员管理系统
  16. matlab 圣诞树,搞气氛!用MATLAB画一棵Bling Bling的圣诞树
  17. 原来Mysql索引要这么设计才能起飞
  18. asp.net mvc 中的部分视图
  19. 《卧底经济学》书中精髓:我们如何正确理解“稀缺”这件事儿?
  20. Hadoop 3.2.1 【 YARN 】源码分析 : DefaultContainerExecutor 浅析

热门文章

  1. 虚拟机不能上网以及无法ping通百度的解决方案
  2. android aes256加密算法,Android中AES256加密的实现
  3. python中0o10_Python中最常见的10个问题(列表)
  4. 如何使用cmd进入打印机选项_用命令添加打印机
  5. 2012.4.17总结(一)
  6. android中Sqlite数据库存储
  7. html如何转换成电子表,如何轻松将电子表格转换为HTML [快速提示] | MOS86
  8. linux qt自带例子无法,在Qt Creator中,错过了一些例子
  9. 八类网线和七类网线的区别_Cat8 八类网线与超五类网线、六类网线、超六类网线及七类/超七类网线的区别...
  10. 【数据库原理实验(openGauss)】创建数据库、表和索引