[ https://issues.apache.org/jira/browse/HBASE-14921?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15223005#comment-15223005 ]
Anastasia Braginsky commented on HBASE-14921: --------------------------------------------- {quote} CellBlock createCellBlocks(Comparator<? super Cell> comparator, int min, int max, boolean descending); This is for making a sub set of original block. Can we have a better name pls? {quote} yes, I’ll change to createSubCellMap() bq. getCellFromIndex(int i) -> getCell (int index) Is this enough? yes, changed already bq. getValidIndex -> Name looks diff to understand what it does. Pls add some comments.. Other places wherever necessary added comments bq. HeapMemStoreLAB memStoreLAB -> WHy need the impl type here? We have MSLAB interface now. Unfortunately, Chunk is internal class of HeapMemStoreLAB, therefore interface MemStoreLAB can not help. The best solution is to move the Chunk outside of the HeapMemStoreLAB, but I didn’t want to do this refactoring as part of this JIRA. bq. HeapMemStoreLAB.Chunk[] chunks -> Do we need to keep Chunk refs? byte[] refs is enough? Or is this for return back to MSLAB pool after the DISK flush? This point was already discussed, but generally for off-heaping and re-usage. bq. Why this move of init to here immediately after the new Chunk is made? When multiple threads are at this point, there is a chance that more than one will do this init call make make byte[]. If it is after compareAndSet, it is sure abt the concurrency solution. First, this is for the case when ChunkPool is null and actually the entire code (as it is written now) doesn’t work if ChunkPool is null. The issue of ensuring that ChunkPool is never null was already discussed here. Second, if multiple threads run this code each thread is going to allocate and initiate its own chunk. bq. allocateChunk - Why is it needed when we have getOrMakeChunk? Who will guarantee thread safety here? allocateChunk() is a method of MemStoreChunkPool class and getOrMakeChunk() is a method of HeapMemStoreLAB class, so they do not intersect in their responsibilities. allocateChunk() is safe for multi-threading because it uses AtomicInteger, new-based allocation, ConcurrentHashMap, and finally each thread is going to initialize its own chunk (it is not shared memory yet). {quote} //org.junit.Assert.assertTrue("\n\n inside chunk initialization 3", false); pls remove commented code.. Some other cases also. {quote} surely will remove {quote} -reclaimedChunks.add(chunk); I can not see where we will be adding it as per the patch? The initial created chunks were added here. {quote} It was my bug, which is already found and already fixed. The call for reclaimedChunks.add(chunk) on pre-allocation is indeed missing here. bq. Smaller than 256 bytes? Yes. How'd you get 256 bytes? I didn't follow. Sorry. Just guessed that number for easier calculation. > Memory optimizations > -------------------- > > Key: HBASE-14921 > URL: https://issues.apache.org/jira/browse/HBASE-14921 > Project: HBase > Issue Type: Sub-task > Affects Versions: 2.0.0 > Reporter: Eshcar Hillel > Assignee: Anastasia Braginsky > Attachments: CellBlocksSegmentInMemStore.pdf, > CellBlocksSegmentinthecontextofMemStore(1).pdf, HBASE-14921-V01.patch, > HBASE-14921-V02.patch > > > Memory optimizations including compressed format representation and offheap > allocations -- This message was sent by Atlassian JIRA (v6.3.4#6332)