From 6cb5f25914acce284a74319e4368eaee94ce1804 Mon Sep 17 00:00:00 2001 From: Elliott Clark Date: Fri, 14 Dec 2012 15:13:25 -0800 Subject: [PATCH] Add multiget to RemoteHTable to 0.94 --- .../hadoop/hbase/rest/client/RemoteHTable.java | 104 +++++++++++++++----- .../hadoop/hbase/rest/client/TestRemoteTable.java | 39 ++++++++ 2 files changed, 119 insertions(+), 24 deletions(-) diff --git src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java index 52e57ba..45c41bd 100644 --- src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java +++ src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java @@ -142,6 +142,29 @@ public class RemoteHTable implements HTableInterface { return sb.toString(); } + protected String buildMultiRowSpec(final byte[][] rows, int maxVersions) { + StringBuilder sb = new StringBuilder(); + sb.append('/'); + sb.append(Bytes.toStringBinary(name)); + sb.append("/multiget/"); + if (rows == null || rows.length == 0) { + return sb.toString(); + } + sb.append("?"); + for(int i=0; i 0) { + if (results.length > 1) { + LOG.warn("too many results for get (" + results.length + ")"); + } + return results[0]; + } else { + return new Result(); + } + } + + public Result[] get(List gets) throws IOException { + byte[][] rows = new byte[gets.size()][]; + int maxVersions = 1; + int count = 0; + + for (Get g : gets) { + + if (count == 0) { + maxVersions = g.getMaxVersions(); + } else if (g.getMaxVersions() != maxVersions) { + LOG.warn("MaxVersions on Gets do not match, using the first in the list (" + + maxVersions +")"); + } + + if (g.getFilter() != null) { + LOG.warn("filters not supported on gets"); + } + + rows[count] = g.getRow(); + count++; + } + + String spec = buildMultiRowSpec(rows, maxVersions); + + return getResults(spec); + } + + private Result[] getResults(String spec) throws IOException { for (int i = 0; i < maxRetries; i++) { Response response = client.get(spec, Constants.MIMETYPE_PROTOBUF); int code = response.getCode(); switch (code) { - case 200: - CellSetModel model = new CellSetModel(); - model.getObjectFromMessage(response.getBody()); - Result[] results = buildResultFromModel(model); - if (results.length > 0) { - if (results.length > 1) { - LOG.warn("too many results for get (" + results.length + ")"); + case 200: + CellSetModel model = new CellSetModel(); + model.getObjectFromMessage(response.getBody()); + Result[] results = buildResultFromModel(model); + if (results.length > 0) { + return results; } - return results[0]; - } - // fall through - case 404: - return new Result(); - case 509: - try { - Thread.sleep(sleepTime); - } catch (InterruptedException e) { } - break; - default: - throw new IOException("get request returned " + code); + // fall through + case 404: + return new Result[0]; + + case 509: + try { + Thread.sleep(sleepTime); + } catch (InterruptedException e) { + } + break; + default: + throw new IOException("get request returned " + code); } } throw new IOException("get request timed out"); @@ -696,11 +757,6 @@ public class RemoteHTable implements HTableInterface { } @Override - public Result[] get(List gets) throws IOException { - throw new IOException("get(List) not supported"); - } - - @Override public T coprocessorProxy(Class protocol, byte[] row) { throw new diff --git src/test/java/org/apache/hadoop/hbase/rest/client/TestRemoteTable.java src/test/java/org/apache/hadoop/hbase/rest/client/TestRemoteTable.java index 7b7a670..f6265ac 100644 --- src/test/java/org/apache/hadoop/hbase/rest/client/TestRemoteTable.java +++ src/test/java/org/apache/hadoop/hbase/rest/client/TestRemoteTable.java @@ -222,6 +222,45 @@ public class TestRemoteTable { } @Test + public void testMultiGet() throws Exception { + ArrayList gets = new ArrayList(); + gets.add(new Get(ROW_1)); + gets.add(new Get(ROW_2)); + Result[] results = remoteTable.get(gets); + assertNotNull(results); + assertEquals(2, results.length); + assertEquals(1, results[0].size()); + assertEquals(2, results[1].size()); + + //Test Versions + gets = new ArrayList(); + Get g = new Get(ROW_1); + g.setMaxVersions(3); + gets.add(g); + gets.add(new Get(ROW_2)); + results = remoteTable.get(gets); + assertNotNull(results); + assertEquals(2, results.length); + assertEquals(1, results[0].size()); + assertEquals(3, results[1].size()); + + //404 + gets = new ArrayList(); + gets.add(new Get(Bytes.toBytes("RESALLYREALLYNOTTHERE"))); + results = remoteTable.get(gets); + assertNotNull(results); + assertEquals(0, results.length); + + gets = new ArrayList(); + gets.add(new Get(Bytes.toBytes("RESALLYREALLYNOTTHERE"))); + gets.add(new Get(ROW_1)); + gets.add(new Get(ROW_2)); + results = remoteTable.get(gets); + assertNotNull(results); + assertEquals(0, results.length); + } + + @Test public void testPut() throws IOException { Put put = new Put(ROW_3); put.add(COLUMN_1, QUALIFIER_1, VALUE_1); -- 1.7.10.2 (Apple Git-33)