> On 2010-09-14 21:08:10, stack wrote: > > src/main/java/org/apache/hadoop/hbase/client/Action.java, line 30 > > <http://review.cloudera.org/r/816/diff/2/?file=11429#file11429line30> > > > > On your overarching comment: > > > > + One patch is fine. > > + Should the key be the encoded region name rather than regionname for > > map of regions to protocols since the latter can be fat? > > > > I think I need some more illustration of how the calls will be made. > > Seems super awkward at moment. Keep using the ping coprocessor as example. > > Its basic. Basic is good for me. > > > > What you thinking for the batch calls? When you say "but this does not > > mesh well with the current client-side interface."... whats this mean? You > > want to change the client? > > Gary Helmling wrote: > Encoded region name makes sense. I can change in Action and related for > some savings. For the HTable.exec() methods returning Maps, encoded vs. > regionname probably doesn't make much difference. I could change those as > well, but if anything, it might be better to key those on HRegionInfo as long > as it doesn't incur any extra lookups. Will take a look at that. > > I'll expand on the ping examples a bit (or come up with something else), > but we'll also have a more realistic example when hooked in to coprocessors > at the region level. > > For the batch calls, it would be easy to add something like the following > to HTable: > > public Map<byte[],Object> exec(List<Exec>) > > using the HRegionServer.multi() support that I already modified. But I > think that winds up being awkward from the client standpoint as you'll have > to construct Exec instances with string method names or using reflection. > > Directly exposing the dynamic proxy up to the user/client level seems > like the most expressive way to do support arbitrary CoprocessorProtocol > interfaces. BatchCall accomplishes this, thought the Java anonymous class > mechanism is of course a bit clunky. > > The dynamic proxy used with BatchCall provides an easy way to capture the > invoked methods and arguments, but combined with the per-region invocation > doesn't make it easy to batch up what are essentially identical calls for all > the regions we know will be impacted. There's a bit of a chicken and egg > problem in that we don't know what's being invoked until the proxy methods > are called (per-region), but we do have overall region set as well to be able > to do a multi-call. Seems like we should be able to catch the first region's > invocation and do a single batch RPC for all the regions and share the > results between proxies. I'm just trying to figure out the least crappy way > of doing so. :) > > So by "current client-side interface", I just mean the exec(..., > BatchCall) interface I've exposed, which supports arbitrary calls easily, but > makes the RPC efficiency a little more complicated.
All sounds reasonable Gary. > On 2010-09-14 21:08:10, stack wrote: > > src/main/java/org/apache/hadoop/hbase/client/HTable.java, line 1296 > > <http://review.cloudera.org/r/816/diff/2/?file=11434#file11434line1296> > > > > What if the remote region does not have the configured protocol? Can > > that happen? How does remote region get freighted w/ the coprocessor? > > Gary Helmling wrote: > In this case an IOE gets thrown indicating that the requested protocol > was not found. I could add an UnknownProtocolException and include the > requested protocol class if that seems worth it. In any case, seems like I > should make sure this is a DoNotRetryIOException to avoid spinning our wheels > if the protocol handler isn't there. IOE is fine. DoNotRetryIOE seems like a good idea. One thing we've seen in the past is that setup of proxy has not timeout. Could that be an issue here? - stack ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: http://review.cloudera.org/r/816/#review1214 ----------------------------------------------------------- On 2010-10-04 16:28:39, Gary Helmling wrote: > > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > http://review.cloudera.org/r/816/ > ----------------------------------------------------------- > > (Updated 2010-10-04 16:28:39) > > > Review request for hbase, Andrew Purtell and Jonathan Gray. > > > Summary > ------- > > This is really two separate patches in one, though with some overlapping > changes. If necessary I can split them apart for separate review. Please > let me know if that would make review easier. > > Part 1: > ============== > Port over of HADOOP-6422 to the HBase RPC code. The goal of this change is > to allow alternate RPC client/server implementations to be enabled through a > simple configuration change. Ultimately I would like to use this to allow > secure RPC to be enabled through configuration, while not blocking normal > (current) RPC operation on non-secure Hadoop versions. > > This portion of the patch abstracts out two interfaces from the RPC code: > > RpcEngine: HBaseRPC uses this to obtain proxy instances for client calls and > server instances for HMaster and HRegionServer > RpcServer: this allows differing RPC server implementations, breaking the > dependency on HBaseServer > > The bulk of the current code from HBaseRPC is moved into WritableRpcEngine > and is unchanged other than the interface requirements. So the current call > path remains the same, other than the HBaseRPC.getProtocolEngine() > abstraction. > > > Part 2: > =============== > The remaining changes provide server-side hooks for registering new RPC > protocols/handlers (per-region to support coprocessors), and client side > hooks to support dynamic execution of the registered protocols. > > The new RPC protocol actions are constrained to > org.apache.hadoop.hbase.ipc.CoprocessorProtocol implementations (which > extends VersionedProtocol) to prevent arbitrary execution of methods against > HMasterInterface, HRegionInterface, etc. > > For protocol handler registration, HRegionServer provides a new method: > > public <T extends CoprocessorProtocol> boolean registerProtocol( > byte[] region, Class<T> protocol, T handler) > > which builds a Map of region name to protocol instances for dispatching > client calls. > > > Client invocations are performed through HTable, which adds the following > methods: > > > public <T extends CoprocessorProtocol> T proxy(Class<T> protocol, Row row) > > This directly returns a proxy instance to the CoprocessorProtocol > implementation registered for the region serving row "row". Any method calls > will be proxied to the region's server and invoked using the map of > registered region name -> handler instances. > > Calls directed against multiple rows are a bit more complicated. They are > supported with the methods: > > public <T extends CoprocessorProtocol, R> void exec( > Class<T> protocol, List<? extends Row> rows, > BatchCall<T,R> callable, BatchCallback<R> callback) > > public <T extends CoprocessorProtocol, R> void exec( > Class<T> protocol, RowRange range, > BatchCall<T,R> callable, BatchCallback<R> callback) > > where BatchCall and BatchCallback are simple interfaces defining the methods > to be called and a callback instance to be invoked for each result. > > For the sample CoprocessorProtocol interface: > > interface PingProtocol extends CoprocessorProtocol { > public String ping(); > public String hello(String name); > } > > a client invocation might look like: > > final Map<byte[],R> results = new TreeMap<byte[],R>(...) > List<Row> rows = ... > table.exec(PingProtocol.class, rows, > new HTable.BatchCall<PingProtocol,String>() { > public String call(PingProtocol instance) { > return instance.ping(); > } > }, > new BatchCallback<R>(){ > public void update(byte[] region, byte[] row, R value) { > results.put(region, value); > } > }); > > The BatchCall.call() method will be invoked for each row in the passed in > list, and the BatchCallback.update() method will be invoked for each return > value. However, currently the PingProtocol.ping() invocation will result in > a separate RPC call per row, which is less that ideal. > > Support is in place to make use of the HRegionServer.multi() invocations for > batched RPC (see the org.apache.hadoop.hbase.client.Exec class), but this > does not mesh well with the current client-side interface. > > In addition to standard code review, I'd appreciate any thoughts on the > client interactions in particular, and whether they would meet some of the > anticipated uses of coprocessors. > > > This addresses bug HBASE-2002. > http://issues.apache.org/jira/browse/HBASE-2002 > > > Diffs > ----- > > src/main/java/org/apache/hadoop/hbase/client/Action.java 556ea81 > src/main/java/org/apache/hadoop/hbase/client/Batch.java PRE-CREATION > src/main/java/org/apache/hadoop/hbase/client/Exec.java PRE-CREATION > src/main/java/org/apache/hadoop/hbase/client/ExecResult.java PRE-CREATION > src/main/java/org/apache/hadoop/hbase/client/HConnection.java 65f7618 > src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java > 866ba92 > src/main/java/org/apache/hadoop/hbase/client/HTable.java 0dbf263 > src/main/java/org/apache/hadoop/hbase/client/HTableInterface.java 74593bf > src/main/java/org/apache/hadoop/hbase/client/MultiAction.java c6ea838 > src/main/java/org/apache/hadoop/hbase/client/MultiResponse.java 91bd04b > src/main/java/org/apache/hadoop/hbase/client/RowRange.java PRE-CREATION > src/main/java/org/apache/hadoop/hbase/client/Scan.java 29b3cb0 > src/main/java/org/apache/hadoop/hbase/io/HbaseObjectWritable.java 83f623d > src/main/java/org/apache/hadoop/hbase/ipc/ConnectionHeader.java > PRE-CREATION > src/main/java/org/apache/hadoop/hbase/ipc/CoprocessorProtocol.java > PRE-CREATION > src/main/java/org/apache/hadoop/hbase/ipc/ExecRPCInvoker.java PRE-CREATION > src/main/java/org/apache/hadoop/hbase/ipc/HBaseClient.java 2b5eeb6 > src/main/java/org/apache/hadoop/hbase/ipc/HBaseRPC.java e23a629 > src/main/java/org/apache/hadoop/hbase/ipc/HBaseServer.java e4c356d > src/main/java/org/apache/hadoop/hbase/ipc/HRegionInterface.java ee5dd8f > src/main/java/org/apache/hadoop/hbase/ipc/Invocation.java PRE-CREATION > src/main/java/org/apache/hadoop/hbase/ipc/RpcEngine.java PRE-CREATION > src/main/java/org/apache/hadoop/hbase/ipc/RpcServer.java PRE-CREATION > src/main/java/org/apache/hadoop/hbase/ipc/WritableRpcEngine.java > PRE-CREATION > src/main/java/org/apache/hadoop/hbase/master/HMaster.java fb1e834 > src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java 0a4fbce > src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java > 89f499a > src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java d4166cf > src/main/resources/hbase-default.xml 5fafe65 > > src/test/java/org/apache/hadoop/hbase/regionserver/TestServerCustomProtocol.java > PRE-CREATION > > Diff: http://review.cloudera.org/r/816/diff > > > Testing > ------- > > > Thanks, > > Gary > >