调用点:MemStoreFlusher,MemstoreFlusher有默认的2个FlushHandler,每个FlushHandler都是一个线程,监听MemStoreFlusher的事件,最终的刷写动作是由FlushHandler线程来处理的;
FLUSH具体实现步骤:
1、如果不是meta region并且region已经有过多的store files,则需要将本次flush操作delay;如果是meta Region或者没有那么多的storefiles,则进行刷写
2、从刷写队列中取出要刷写的FlushRegionEntry
3、获取memstore级别的读锁
4、调用region.flush进行真正的刷写操作
4.1、在HRegion中,首先获取region级别的读锁
4.2、为每个Store做snapshot
4.2.1、获取region级别的updates写锁
4.2.2、计算此次刷写完wal的flushedSeqId,并且将这条数据写进wal缓存
4.2.3、给每个store做snapshot
4.2.4、释放region级别的updates写锁
4.2.5、将此次刷写完的记录对应的wal落盘
4.3、将KVset指向新的内存,snapshot刷写到磁盘并生成StoreFile
4.3.1、调用flush.flushcache将snapshot刷写到磁盘,并生成storefile
4.3.1.1、将snapshot刷写到磁盘,首先创建snapshotscanner
4.3.1.2、将scanner数据逐一写入StoreFile.Writer
4.3.2、将落盘的snapshot生成对应的StoreFile文件
4.3.3、将storefile添加到storeCommittedFiles队列中,正式完成flush
4.3.4、写wal
4.4、最后释放region级别的读锁
5、判断是否要compact和split
6、释放memstore级别的读锁
