[ https://issues.apache.org/jira/browse/HBASE-26567?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17468998#comment-17468998 ]
chenglei commented on HBASE-26567: ---------------------------------- [~zhangduo],thank you very much for help code review. > Remove IndexType from ChunkCreator > ---------------------------------- > > Key: HBASE-26567 > URL: https://issues.apache.org/jira/browse/HBASE-26567 > Project: HBase > Issue Type: Improvement > Components: in-memory-compaction > Affects Versions: 3.0.0-alpha-1, 2.4.8 > Reporter: chenglei > Assignee: chenglei > Priority: Major > Fix For: 2.5.0, 3.0.0-alpha-3 > > > For {{CellChunkImmutableSegment}}, cells in data chunks is indexed in index > chunks by chunk id ,index chunks use chunk id to locate the data chunk by > look up chunk id in {{ChunkCreator.chunkIdMap}} . Whether or not the > {{ChunkCreator}} put the data chunk in {{ChunkCreator.chunkIdMap}} depends on > the data chunk is pooled or the index type is {{IndexType.CHUNK_MAP}}. So > when we call {{ChunkCreator.getChunk}}, it is very important to specify the > IndexType. {{ChunkCreator}} has following package-visible method, which does > not require the {{IndexType}} parameter and use {{IndexType.ARRAY_MAP}}. > {code:java} > Chunk getChunk(ChunkType chunkType) { > return getChunk(CompactingMemStore.IndexType.ARRAY_MAP, chunkType); > } > {code} > This method is used by following line 363 in > {{MemStoreLABImpl.getNewExternalChunk}} now, which is used by > {{CellChunkImmutableSegment.copyCellIntoMSLAB}} which index type is > {{IndexType.CHUNK_MAP}} to force copy a big cell into {{MemStoreLAB}}, which > should allocate a new not-pooled chunk. > {code:java} > 359 public Chunk getNewExternalChunk(ChunkCreator.ChunkType chunkType) { > 360 switch (chunkType) { > 361 case INDEX_CHUNK: > 362 case DATA_CHUNK: > 363 Chunk c = this.chunkCreator.getChunk(chunkType); > 364 chunks.add(c.getId()); > 365 return c; > 366 case JUMBO_CHUNK: // a jumbo chunk doesn't have a fixed size > 367 default: > 368 return null; > 369 } > 370 } > {code} > Even though fortunately this {{IndexType}} mismatch does not cause bug now > because {{MemStoreLABImpl.getNewExternalChunk}} in fact is not invoked by > {{CellChunkImmutableSegment.copyCellIntoMSLAB}} when the cell is bigger than > chunkSize,but I think it is dangerous to not specify the {{IndexType}} if we > want to refactor or add new functionalities in the future. We would better to > specify the {{IndexType}} explicitly when we use {{ChunkCreator.getChunk}}. > When thinking this problem more, I think we could remove the {{IndexType}} > from {{ChunkCreator}} completely to simplify the code, because when use > {{MemStoreLABImpl}}, the {{IndexType}} could only be {{IndexType.CHUNK_MAP}} > ,just as following line 106 in {{MemStoreLABImpl}} ctor. > {code:java} > 96 public MemStoreLABImpl(Configuration conf) { > 97 dataChunkSize = conf.getInt(CHUNK_SIZE_KEY, CHUNK_SIZE_DEFAULT); > 98 maxAlloc = conf.getInt(MAX_ALLOC_KEY, MAX_ALLOC_DEFAULT); > 99 this.chunkCreator = ChunkCreator.getInstance(); > 100 // if we don't exclude allocations >CHUNK_SIZE, we'd infiniteloop on > one! > 101 Preconditions.checkArgument(maxAlloc <= dataChunkSize, > 102 MAX_ALLOC_KEY + " must be less than " + CHUNK_SIZE_KEY); > 103 > 104 // if user requested to work with MSLABs (whether on- or off-heap), > then the > 105 // immutable segments are going to use CellChunkMap as their index > 106 idxType = CompactingMemStore.IndexType.CHUNK_MAP; > 107 } > {code} > And because the get {{chunk}} from {{ChunkCreator}} is only used by > {{MemStoreLABImpl}}, and only when we not use {{MemStoreLABImpl}} we could > use {{IndexType.ARRAY_MAP}}, we can remove the {{IndexType}} from > {{ChunkCreator}} completely. -- This message was sent by Atlassian Jira (v8.20.1#820001)