Open Badb-Lee opened 3 months ago
func (lm levelManager) subcompact(it utils.Iterator, kr keyRange, cd compactDef, inflightBuilders utils.Throttle, res chan<- table) { for it.Valid() { key := it.Item().Entry().Key // 我感觉是这里做了处理, 不在这个key区间的, 直接退出; 虽然这个key区间是根据 bot[] 划分而来; if len(kr.right) > 0 && utils.CompareKeys(key, kr.right) >= 0 { break } // It was true that it.Valid() at least once in the loop above, which means we // called Add() at least once, and builder is not Empty(). if builder.empty() { // Cleanup builder resources: builder.finish() builder.Close() continue } if err := inflightBuilders.Do(); err != nil { // Can't return from here, until I decrRef all the tables that I built so far. break } // 充分发挥 ssd的并行 写入特性, 有疑问; go func(builder tableBuilder) { defer inflightBuilders.Done(nil) defer builder.Close() var tbl *table newFID := atomic.AddUint64(&lm.maxFID, 1) // compact的时候是没有memtable的,这里自增maxFID即可。 // TODO 这里的sst文件需要根据level大小变化 sstName := utils.FileNameSSTable(lm.opt.WorkDir, newFID) tbl = OpenTable(lm, sstName, builder) if tbl == nil { return } res <- tbl }(builder) } }
其实看到这里源码, 我也有一个新的问题: 这个压缩方法会在每一个keyRange区间最低生成一个sstTable, 根本不会将多个处在 不同keyRange的entry 合并到 同一个sstTable中; 假如keyRange1区间的entry只有几个,那么只要 对应的builder不为空,那么也就会创建新的sstTable, 不会跟下一个keyRange1区间的entry进行合并; 这样会不会导致 sstTable数量增多?
addSplits函数代码如下:
视频讲解当中有一个细节优化是在切片时,以key为粒度进行划分,目的是为了减少划分后table之间的key重叠,提高效率(我感觉除了l0层,应该也不会有key重叠),但是代码里面,for循环中还是以cd.bot中的table来进行遍历,这里感觉还是以table为粒度来进行划分,请问是这样的吗?