HBASE-7197. Add multi get to RemoteHTable (Elliott Clark)
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1422143 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
778ab055a0
commit
c9a360e360
|
@ -148,6 +148,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<rows.length; i++) {
|
||||
byte[] rk = rows[i];
|
||||
if (i != 0) {
|
||||
sb.append('&');
|
||||
}
|
||||
sb.append("row=");
|
||||
sb.append(Bytes.toStringBinary(rk));
|
||||
}
|
||||
sb.append("&v=");
|
||||
sb.append(maxVersions);
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
|
||||
protected Result[] buildResultFromModel(final CellSetModel model) {
|
||||
List<Result> results = new ArrayList<Result>();
|
||||
for (RowModel row: model.getRows()) {
|
||||
|
@ -273,31 +296,66 @@ public class RemoteHTable implements HTableInterface {
|
|||
if (get.getFilter() != null) {
|
||||
LOG.warn("filters not supported on gets");
|
||||
}
|
||||
Result[] results = getResults(spec);
|
||||
if (results.length > 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<Get> 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();
|
||||
// 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);
|
||||
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");
|
||||
|
@ -708,11 +766,6 @@ public class RemoteHTable implements HTableInterface {
|
|||
throw new IOException("batchCallback not supported");
|
||||
}
|
||||
|
||||
@Override
|
||||
public Result[] get(List<Get> gets) throws IOException {
|
||||
throw new IOException("get(List<Get>) not supported");
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T extends CoprocessorProtocol> T coprocessorProxy(Class<T> protocol,
|
||||
byte[] row) {
|
||||
|
|
|
@ -216,6 +216,45 @@ public class TestRemoteTable {
|
|||
assertEquals(2, count);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testMultiGet() throws Exception {
|
||||
ArrayList<Get> gets = new ArrayList<Get>();
|
||||
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>();
|
||||
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<Get>();
|
||||
gets.add(new Get(Bytes.toBytes("RESALLYREALLYNOTTHERE")));
|
||||
results = remoteTable.get(gets);
|
||||
assertNotNull(results);
|
||||
assertEquals(0, results.length);
|
||||
|
||||
gets = new ArrayList<Get>();
|
||||
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);
|
||||
|
|
Loading…
Reference in New Issue