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

stack commented on HBASE-880:
-----------------------------

I took a look at this patch with J-D as Virgil.

I need to study it more.  We have to be real careful making fundamental changes 
to our API -- as is this patch -- to make sure we get it right.  On my first 
drive through, it strikes me that it needs to be more elegant than it is at 
flush blush.

Meantime, here a few remarks.

Is below intentional:

{code}
Index: src/java/org/apache/hadoop/hbase/client/HConnectionManager.java
===================================================================
--- src/java/org/apache/hadoop/hbase/client/HConnectionManager.java     
(revision 696049)
+++ src/java/org/apache/hadoop/hbase/client/HConnectionManager.java     
(working copy)
@@ -860,10 +860,12 @@
           }
           exceptions.add(t);
           if (tries == numRetries - 1) {
+            t.printStackTrace();
             throw new RetriesExhaustedException(callable.getServerName(),
                 callable.getRegionName(), callable.getRow(), tries, 
exceptions);
           }
           if (LOG.isDebugEnabled()) {
+            t.printStackTrace();
             LOG.debug("reloading table servers because: " + t.getMessage());
{code}

Could add the exception as argument if wanted rather than printStackTrace.

Don't touch whats under v5.  Thats migration stuff.  Move what it needs under 
v5 if you want to change BatchUpdate, etc., or just leave them in place till 
actual removal and we can worry about how to migrate then.

Below is synopsis of J-D/Stack back and forth:

{code}
[12:33] <st^ack>        jdcryans: RowGet doesn't have a constructor to set 
number of versions?
[12:34] <jdcryans>      st^ack: I wish that we don't have to change the API at 
each new feature
[12:34] <jdcryans>      so keeping a small constructor is, I think, the way to 
go
[12:34] <jdcryans>      for the rest, setters
[12:35] <st^ack>        Immutables are nice.
[12:35] <st^ack>        You have to add setter/getter every time you add a new 
feature.
[12:36] <st^ack>        The worry is that the constructor will grow madly?
[12:36] <jdcryans>      st^ack: yeah
[12:36] <jdcryans>      and that we have to have every combination for every 
feature set
[12:43] <st^ack>        but we have to add a getter/setter for each new 
attribute, right?
[12:44] <st^ack>        Why is RowDelete different from RowUpdate?
[12:45] <jdcryans>      st^ack: yes, new getter/setter, that's what I think is 
better instead of g/s + all contructors
[12:46] <jdcryans>      RowDelete is for deleteAll and deleteFamily, does not 
have a list of batchoperations
[12:46] <jdcryans>      if you think it's bad, I would say that a=b=c so 
current is bad too
[12:46] <jdcryans>      current API*
[12:48] <st^ack>        deleteAll breaks things. usually the operation contains 
the rows to operate on. when deleteAll, the operation doesn't supply columns -- 
presumtpion is all columns.
[12:48] <st^ack>        Current API doesn't scale, true.
[12:48] <st^ack>        How do we do write-if-not-modified using this changed 
API?
[12:49] <st^ack>        you know, the feature where we only update a value if 
it hasn't been changed
[12:49] <jdcryans>      yeah yeah I was in that conversation
[12:49] <st^ack>        i.e. take out a lock on row, look at value, then 
withing same row lock do update if not changed.
[12:50] <jdcryans>      that would be another operation I guess
[12:51] <st^ack>        jdcryans: I don't think I like the fact that our RPC is 
having primitive types replaced by more compound types
[12:51] <jdcryans>      at least that would make another bunch of methods in 
HTable
[12:51] <st^ack>        let me read more
[12:52] <jdcryans>      then it will be hard to batch gets
[12:52] <st^ack>        sort of.
[12:52] <st^ack>        Could be row [][]
[12:53] <st^ack>        column and timestamp same for all
[12:53] <st^ack>        let me read more
[12:53] <jdcryans>      st^ack: yeah but's limiting
[12:53] <jdcryans>      public RowResult getRow(final byte [][] row, final byte 
[][][] columns, final long[] ts, final RowLock[] rl) would be ugly too
[12:59] <st^ack>        On the pattern of setters vs. constructor args, I kinda 
feel we should do one or the other. Odd spanning both.
[13:00] <jdcryans>      st^ack: y
[13:00] <st^ack>        Regards expanding constructor, is it not the case that 
it won't be as bad once the extra args have been moved out of HTable method 
names instead into Operation construction.
[13:01] <jdcryans>      st^ack: won't be as bad, true
[13:02] <st^ack>        I suppose adding a new feature, you'll have to fix the 
baseline Operation class and then all of its derivatives. That'll be a bit 
messy.
[13:02] <jdcryans>      st^ack: you mean the constructors?
[13:02] <st^ack>        Yeah, constructors
[13:03] <jdcryans>      yes that's something I saw too, having to recopy all of 
them
[13:03] <jdcryans>      part of why I prefer to keep g/s (but forgot about it 
since now :P)
[13:04] <st^ack>        Whats a constructor now? column(s), start-timestamp, 
end-timestamp, versions
[13:04] <st^ack>        Does lock belong inside an Operation?
[13:04] <st^ack>        Shouldn't lock be outside an operation?
[13:06] <jdcryans>      st^ack: same goal, remove overloads
[13:06] <jdcryans>      I see that as one new feature, got the same treatment
[13:07] <st^ack>        locks span operations though?
[13:07] <st^ack>        row locks span row operations
[13:07] <st^ack>        Its different that timestamp, etc.
[13:07] <jdcryans>      proposed design does not prevent that
[13:09] <jdcryans>      would have to bundle lock with every operation, pretty 
much in the same way as if it was another parameter
[13:12] <st^ack>        To lock across a set of Operations, you suggest 
bundling the lock with each Operation -- setting it into each Operation?
[13:12] <jdcryans>      yes
[13:12] <st^ack>        What if user included an Operation in a set for a row 
that did not include the lock.
[13:12] <st^ack>        How should that run over on the server.
[13:13] <st^ack>        What is difference between RowDelete and RowUpdate (or 
do you want me to read the code -- smile)
[13:13] <jdcryans>      garbage in garbage out for that user
[13:14] <jdcryans>      I don't copy that last question
[13:14] <st^ack>        If lock was a distinct param on a method in HTable, 
then we'd have to have two versions of every method -- one with lock and one 
without?
[13:15] <st^ack>        as we do now.
[13:15] <st^ack>        I want to know how RowUpdate and RowDelete differ. Why 
couldn't I just pass a RowUpdate to a deleteAll?
[13:15] <jdcryans>      yes
[13:17] <jdcryans>      deleteAll wouldn't know which column to take
[13:17] <jdcryans>      if RowUpdate has many BatchOperations
[13:18] <jdcryans>      RowUpdate == BatchUpdate
[13:20] <st^ack>        Sorry, I don't follow. I need to study this patch more.
{code}


> Improve the current client API by creating new container classes
> ----------------------------------------------------------------
>
>                 Key: HBASE-880
>                 URL: https://issues.apache.org/jira/browse/HBASE-880
>             Project: Hadoop HBase
>          Issue Type: Improvement
>          Components: client
>            Reporter: Jean-Daniel Cryans
>            Assignee: Jean-Daniel Cryans
>             Fix For: 0.19.0
>
>         Attachments: hbase-880-v1.patch
>
>
> The current API does not scale very well. For each new feature, we have to 
> add many methods to take care of all the overloads. Also, the need to batch 
> row operations (gets, inserts, deletes) implies that we have to manage some 
> "entities" like we are able to do with BatchUpdate but not with the other 
> operations. The RowLock should be an attribute of such an entity.
> The scope of this jira is only to replace current API with another 
> feature-compatible one, other methods will be added in other issues.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to