[ https://issues.apache.org/jira/browse/HBASE-4027?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13070862#comment-13070862 ]
jirapos...@reviews.apache.org commented on HBASE-4027: ------------------------------------------------------ ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: https://reviews.apache.org/r/1191/#review1182 ----------------------------------------------------------- could do with some tests for MetaSlab. also some multi-threaded tests - see MultithreadedTestUtil, example usage in TestMemStoreLAB pom.xml <https://reviews.apache.org/r/1191/#comment2484> did you determine that this ConcurrentLinkedHashMap was different than the one in Guava? I thought it got incorporated into Guava, which we already depend on. src/main/java/org/apache/hadoop/hbase/io/hfile/DoubleBlockCache.java <https://reviews.apache.org/r/1191/#comment2485> punctuation wise, I think it would be easier to read if you hyphenated on-heap and off-heap. This applies to log messages below as well. src/main/java/org/apache/hadoop/hbase/io/hfile/DoubleBlockCache.java <https://reviews.apache.org/r/1191/#comment2486> No need to line-break here src/main/java/org/apache/hadoop/hbase/io/hfile/DoubleBlockCache.java <https://reviews.apache.org/r/1191/#comment2487> consider using StringUtils.humanReadableInt for these sizes. src/main/java/org/apache/hadoop/hbase/io/hfile/DoubleBlockCache.java <https://reviews.apache.org/r/1191/#comment2488> @Override src/main/java/org/apache/hadoop/hbase/io/hfile/DoubleBlockCache.java <https://reviews.apache.org/r/1191/#comment2489> when you're just overriding something from the superclass, no need for javadoc unless it says something new and exciting. If you feel like you want to put something there, you can use /** {@inheritDoc} */ to be explicit that you're inheriting from the superclass. src/main/java/org/apache/hadoop/hbase/io/hfile/DoubleBlockCache.java <https://reviews.apache.org/r/1191/#comment2490> I think you should only put-back into the on-heap cache in the case that the 'caching' parameter is true. src/main/java/org/apache/hadoop/hbase/io/hfile/DoubleBlockCache.java <https://reviews.apache.org/r/1191/#comment2491> hrm, the class javadoc says that the statistics should be cumulative, but this seems to just forward src/main/java/org/apache/hadoop/hbase/io/hfile/DoubleBlockCache.java <https://reviews.apache.org/r/1191/#comment2492> TODOs src/main/java/org/apache/hadoop/hbase/io/hfile/DoubleBlockCache.java <https://reviews.apache.org/r/1191/#comment2493> is this code used? seems like dead copy-paste code to me. src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java <https://reviews.apache.org/r/1191/#comment2497> extraneous debugging left in src/main/java/org/apache/hadoop/hbase/io/hfile/MetaSlab.java <https://reviews.apache.org/r/1191/#comment2498> I think this is usually called a "slab class" - I think that name would be less confusing, since "Meta" is already used in HBase to refer to .META. src/main/java/org/apache/hadoop/hbase/io/hfile/MetaSlab.java <https://reviews.apache.org/r/1191/#comment2499> unclear what the difference is between the two. Is "slabs" the list of 2GB buffers, and "buffers" is the list of actual items that will be allocated? I think the traditional names here are "slabs" and "items". where each slab holds some number of allocatable items Also, rather than // comments, use /** javadoc comments */ before the vars src/main/java/org/apache/hadoop/hbase/io/hfile/MetaSlab.java <https://reviews.apache.org/r/1191/#comment2500> these vars probably better called maxBlocksPerSlab and maxSlabSize, since they're upper bounds. src/main/java/org/apache/hadoop/hbase/io/hfile/MetaSlab.java <https://reviews.apache.org/r/1191/#comment2501> I think this code would be a little easier to understand if you split it into one loop for the full slabs, and an if statement for the partially full one. Something like: int numFullSlabs = numBlocks / maxBlocksPerSlab; boolean hasPartialSlab = (numBlocks % maxBlocksPerSlab) > 0; for (int i = 0; i < numFullSlabs; i++) { alloc one of maxSlabSize; addBuffersForSlab(slab); } if (hasPartialSlab) { alloc the partial one addBuffersForSlab(slab); } src/main/java/org/apache/hadoop/hbase/io/hfile/MetaSlab.java <https://reviews.apache.org/r/1191/#comment2502> should be a LOG.warn src/main/java/org/apache/hadoop/hbase/io/hfile/MetaSlab.java <https://reviews.apache.org/r/1191/#comment2503> shouldn't this class have an alloc() and free() method? src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2511> shouldn't this implement BlockCache? src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2504> no need to line-break src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2505> It seems dirty to reach back upwards to "master" here. Cyclical dependencies are a code smell... src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2508> I don't understand what purpose returnMap is serving here src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2506> add '@Override', then you don't need to copy-paste javadoc src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2507> this is where you would call backingStore.alloc() -- then buffers can be made into a private member and keep encapsulation src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2510> @Override, remove javadoc src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2509> this is super ugly, plus bad performance - throwing an exception is very expensive, since it has to construct a whole stack trace object, etc. Instead, check backingMap.get(key) against null src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2512> why does master need to know about this? src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2495> numBlocks isn't the size, is it? src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2496> missing space before "blocks" src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java <https://reviews.apache.org/r/1191/#comment2494> there are several identical copies of this floating around. Can they all use the same class? src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2513> overall note: I think we could move all of this to a new io.hfile.slab package src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2520> should this implement BlockCache? src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2515> since this is only modified during initialization, we can use an unsynchronized TreeMap which is probably more efficient src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2516> rename to statThreadPeriodSecs to indicate time unit. Though, since it's a constant, it probably should be STAT_THREAD_PERIOD. This should be configurable but we can address in a follow-up src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2525> you can set the thread factory to make daemon threads, then you don't need setDaemon(true) below src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2514> line breaks unnecessary src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2517> this stuff will have to be configurable too. but this is fine for now src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2518> should also note that it returns 0 for the case of an uncacheable object src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2519> this function is never used -- you should make it private, and then call it from cacheBlock below. src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2521> again this is no good. check for null instead of catching an exception src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2522> when would this be true? evicting something that doesn't have an entry in backingStore? src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2523> it seems like there's a loop in flow control here. src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2524> move this nice logging output to something like: slabstats.logUsage() src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2526> since you're using scheduleAtFixedRate, this should implement Runnable, not extend Thread src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2527> need to be public? src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2528> should be ALL_CAPS src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2529> ALSO_ALL_CAPS src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java <https://reviews.apache.org/r/1191/#comment2530> why boxed longs? src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java <https://reviews.apache.org/r/1191/#comment2531> for consistency, I think we should name these something like: hfile.block.cache.offheap.size hfile.block.cache.offheap.minblocksize also, is min block size really a min? isn't it more like expectedblocksize? src/test/java/org/apache/hadoop/hbase/io/hfile/TestSingleSlabCache.java <https://reviews.apache.org/r/1191/#comment2532> update this javadoc src/test/java/org/apache/hadoop/hbase/io/hfile/TestSingleSlabCache.java <https://reviews.apache.org/r/1191/#comment2533> should use JUnit 4 style tests in new code - i.e not inherit TestCase. src/test/java/org/apache/hadoop/hbase/io/hfile/TestSingleSlabCache.java <https://reviews.apache.org/r/1191/#comment2535> nowhere in this test does it actually verify that the data is valid src/test/java/org/apache/hadoop/hbase/io/hfile/TestSingleSlabCache.java <https://reviews.apache.org/r/1191/#comment2534> some javadoc would be nice... it seems this code is copy-pasted from TestLruBlockCache, but really doesn't make sense when applied to the SingleSlabCache src/test/java/org/apache/hadoop/hbase/io/hfile/TestSlabCache.java <https://reviews.apache.org/r/1191/#comment2536> see above. If you can refactor some of this code into something like BlockCacheTestUtils.testBasicCacheContract(BlockCache cache) that would be good... copy paste evil - Todd On 2011-07-25 22:55:56, Todd Lipcon wrote: bq. bq. ----------------------------------------------------------- bq. This is an automatically generated e-mail. To reply, visit: bq. https://reviews.apache.org/r/1191/ bq. ----------------------------------------------------------- bq. bq. (Updated 2011-07-25 22:55:56) bq. bq. bq. Review request for hbase and Todd Lipcon. bq. bq. bq. Summary bq. ------- bq. bq. Uploading slabcachepatchv4 to review for Li Pi. bq. bq. bq. This addresses bug HBASE-4027. bq. https://issues.apache.org/jira/browse/HBASE-4027 bq. bq. bq. Diffs bq. ----- bq. bq. conf/hbase-env.sh 2d55d27 bq. pom.xml 729dc37 bq. src/main/java/org/apache/hadoop/hbase/io/hfile/DoubleBlockCache.java PRE-CREATION bq. src/main/java/org/apache/hadoop/hbase/io/hfile/HFile.java 5963552 bq. src/main/java/org/apache/hadoop/hbase/io/hfile/MetaSlab.java PRE-CREATION bq. src/main/java/org/apache/hadoop/hbase/io/hfile/SingleSizeCache.java PRE-CREATION bq. src/main/java/org/apache/hadoop/hbase/io/hfile/SlabCache.java PRE-CREATION bq. src/main/java/org/apache/hadoop/hbase/regionserver/StoreFile.java b600020 bq. src/test/java/org/apache/hadoop/hbase/io/hfile/TestSingleSlabCache.java PRE-CREATION bq. src/test/java/org/apache/hadoop/hbase/io/hfile/TestSlabCache.java PRE-CREATION bq. bq. Diff: https://reviews.apache.org/r/1191/diff bq. bq. bq. Testing bq. ------- bq. bq. bq. Thanks, bq. bq. Todd bq. bq. > Enable direct byte buffers LruBlockCache > ---------------------------------------- > > Key: HBASE-4027 > URL: https://issues.apache.org/jira/browse/HBASE-4027 > Project: HBase > Issue Type: Improvement > Reporter: Jason Rutherglen > Assignee: Li Pi > Priority: Minor > Attachments: slabcachepatch.diff, slabcachepatchv2.diff, > slabcachepatchv3.1.diff, slabcachepatchv3.2.diff, slabcachepatchv3.diff, > slabcachepatchv4.diff > > > Java offers the creation of direct byte buffers which are allocated outside > of the heap. > They need to be manually free'd, which can be accomplished using an > documented {{clean}} method. > The feature will be optional. After implementing, we can benchmark for > differences in speed and garbage collection observances. -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira