[ 
https://issues.apache.org/jira/browse/HBASE-4199?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13087302#comment-13087302
 ] 

stack commented on HBASE-4199:
------------------------------

Here's some feedback.

This is very nice funcionality.  Thanks for adding it.

The constructor that takes no args has empty javadoc.  Remove it or fill it in 
(perhaps note this method is for deserializing only)

No need to assign "" to table and columnfamily on declaration?  Let a NPE out 
if this class ill-initialized

You are inconsistent w/ lines separating methods.  Looks sloppy (Usually we put 
a single line between methods)

Whats up with this BlockCacheSummaryEntry?  Its a summary or is it an entry?  
If a summary, its odd that I can set things like blocks and heapSize post 
construction and even table and columnfamily.  Maybe this should be an 
immmutable object where you pass in all variables on construction?

I suppose its a summary for the passed table and cf?  Hmm.  Thats what you say 
in the class javadoc so strike the above rumination on class name (the whether 
it should be immutable comment stands).

+    this.heapSize = this.heapSize + heapSize; is usually written this.heapSize 
+= heapSize... but no biggie.

In the below
{code}
+  public void readFields(DataInput arg0) throws IOException {
{code}

'arg0' is a bad name for a param (Same on the write).

In hashCode you do:

{code}
+    final int prime = 31;
+    int result = 1;
+    result = prime * result
...
{code}

Why the 'int result = 1' at all?  Why not 'int result = prime + ....'

I like your equals implementation.

In your toString, why include name of this class?

Should we throw exception if path does not have four elements in it?

Would suggest you add the stuff you have in comments down in 
createFromStoreFilePath up into the javadoc; would help clarify the kinda path 
we are expecting.

You are inconsistent with spacings below:

{code}
+      String table = s[ s.length - 4];  // 4th from the end
+      String cf = s[ s.length - 2];     // 2nd from the end
{code}

Be careful w/ line lengths.  Usually < 80.

How often is getBlockCacheSummary called?  For each invocation we do inspection 
of all under hbase.rootdir?  This seems like a pretty costly operation.

Looking at getTableStoreFilePathMap, we should make a storefiles filter.  Seems 
like it'd get used more than once (but thats for another JIRA).

This comment looks wrong?  " Under each of these, should be one file only."

Why do this:

{code}
+    BlockCacheSummaryEntry e2 = new BlockCacheSummaryEntry();
+    e2.setTable(e.getTable());
+    e2.setColumnFamily(e.getColumnFamily());
+    return e2;
{code}

Why not do return BlockCacheSummaryEntry(e.getTable(), e.getColumnFamily());

The below should be a Set?

{code}
+    Map<BlockCacheSummaryEntry, BlockCacheSummaryEntry> bcs = 
+      new HashMap<BlockCacheSummaryEntry, BlockCacheSummaryEntry>();
{code}

Or, strike that... I see how you are using it.  Its a little unusual that 
equality is on only two of the datamembers.  Nothing wrong with this but I'd 
call this out in the class comment for this class, that two instances are 
compared the same if table+cf agree (though counts differ).

I like doing if (s.length <= 0) continue rather than below.

{code}
+      if (s.length > 0) {
{code}

Advantage of former is that save an indentation.  Similar for the if (path != 
null).. I'd rather do if (path == null) continue;

In javadoc should you should say that getBlockCacheSummary returns a list 
sorted by table name + cf (or you don't want to have sort in contract for this 
method?)

Why do this:

{code}
+    BlockCacheSummaryEntry[] ar = new BlockCacheSummaryEntry[list.size()];
+    for (int i = 0; i < list.size(); i++) {
+      ar[i]=list.get(i);
+    }
+    return ar;
{code}

Why not return the List?  (In future, doing something like above, you can use 
http://download.oracle.com/javase/6/docs/api/java/util/List.html#toArray(T[]))

I see now that this is a feature use with low frequency so the fact that it is 
heavyweight should be fine.  You might add this to javadoc though that it 
includes scan of fs

Why the double javadoc?  You have 'Performs block cache summary' but then you 
also have @Override (we will pick up the javadoc from the interface so the 
extra stuff in here from HREgionServer is not needed).

Tests look good.

Just remove the below:

{code}
+  public void setUp()  {
+  }
{code}

Remove javadoc w/ nothing in it.  Looks bad.

Good stuff Doug.



> blockCache summary - backend
> ----------------------------
>
>                 Key: HBASE-4199
>                 URL: https://issues.apache.org/jira/browse/HBASE-4199
>             Project: HBase
>          Issue Type: Sub-task
>            Reporter: Doug Meil
>            Assignee: Doug Meil
>            Priority: Minor
>         Attachments: java_HBASE_4199.patch, java_HBASE_4199_v2.patch, 
> java_HBASE_4199_v3.patch
>
>
> This is the backend work for the blockCache summary.  Change to BlockCache 
> interface, Summarization in LruBlockCache, BlockCacheSummaryEntry, addition 
> to HRegionInterface, and HRegionServer.
> This will NOT include any of the web UI or anything else like that.  That is 
> for another sub-task.

--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to