You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by nd...@apache.org on 2013/09/18 23:23:57 UTC
svn commit: r1524576 - in /hbase/trunk/hbase-server/src:
main/java/org/apache/hadoop/hbase/rest/
main/java/org/apache/hadoop/hbase/rest/client/
test/java/org/apache/hadoop/hbase/rest/
test/java/org/apache/hadoop/hbase/rest/client/
Author: ndimiduk
Date: Wed Sep 18 21:23:57 2013
New Revision: 1524576
URL: http://svn.apache.org/r1524576
Log:
HBASE-9364 Get request with multiple columns returns partial results
Modified:
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowSpec.java
hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java
hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java
hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/rest/client/TestRemoteTable.java
Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java?rev=1524576&r1=1524575&r2=1524576&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java Wed Sep 18 21:23:57 2013
@@ -92,6 +92,7 @@ public class RowResource extends Resourc
ResultGenerator generator =
ResultGenerator.fromRowSpec(tableResource.getName(), rowspec, null);
if (!generator.hasNext()) {
+ servlet.getMetrics().incrementFailedGetRequests(1);
return Response.status(Response.Status.NOT_FOUND)
.type(MIMETYPE_TEXT).entity("Not found" + CRLF)
.build();
@@ -118,7 +119,7 @@ public class RowResource extends Resourc
servlet.getMetrics().incrementSucessfulGetRequests(1);
return Response.ok(model).build();
} catch (RuntimeException e) {
- servlet.getMetrics().incrementFailedPutRequests(1);
+ servlet.getMetrics().incrementFailedGetRequests(1);
if (e.getCause() instanceof TableNotFoundException) {
return Response.status(Response.Status.NOT_FOUND)
.type(MIMETYPE_TEXT).entity("Not found" + CRLF)
@@ -128,7 +129,7 @@ public class RowResource extends Resourc
.type(MIMETYPE_TEXT).entity("Bad request" + CRLF)
.build();
} catch (Exception e) {
- servlet.getMetrics().incrementFailedPutRequests(1);
+ servlet.getMetrics().incrementFailedGetRequests(1);
return Response.status(Response.Status.SERVICE_UNAVAILABLE)
.type(MIMETYPE_TEXT).entity("Unavailable" + CRLF)
.build();
@@ -153,6 +154,7 @@ public class RowResource extends Resourc
ResultGenerator generator =
ResultGenerator.fromRowSpec(tableResource.getName(), rowspec, null);
if (!generator.hasNext()) {
+ servlet.getMetrics().incrementFailedGetRequests(1);
return Response.status(Response.Status.NOT_FOUND)
.type(MIMETYPE_TEXT).entity("Not found" + CRLF)
.build();
Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowSpec.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowSpec.java?rev=1524576&r1=1524575&r2=1524576&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowSpec.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowSpec.java Wed Sep 18 21:23:57 2013
@@ -106,8 +106,7 @@ public class RowSpec {
return i;
}
- private int parseColumns(final String path, int i)
- throws IllegalArgumentException {
+ private int parseColumns(final String path, int i) throws IllegalArgumentException {
if (i >= path.length()) {
return i;
}
@@ -119,8 +118,7 @@ public class RowSpec {
if (column.length() < 1) {
throw new IllegalArgumentException("invalid path");
}
- String s = URLDecoder.decode(column.toString(),
- HConstants.UTF8_ENCODING);
+ String s = URLDecoder.decode(column.toString(), HConstants.UTF8_ENCODING);
this.columns.add(Bytes.toBytes(s));
column.setLength(0);
i++;
@@ -132,8 +130,7 @@ public class RowSpec {
i++;
// trailing list entry
if (column.length() > 0) {
- String s = URLDecoder.decode(column.toString(),
- HConstants.UTF8_ENCODING);
+ String s = URLDecoder.decode(column.toString(), HConstants.UTF8_ENCODING);
this.columns.add(Bytes.toBytes(s));
}
} catch (IndexOutOfBoundsException e) {
Modified: hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java?rev=1524576&r1=1524575&r2=1524576&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java (original)
+++ hbase/trunk/hbase-server/src/main/java/org/apache/hadoop/hbase/rest/client/RemoteHTable.java Wed Sep 18 21:23:57 2013
@@ -97,7 +97,10 @@ public class RemoteHTable implements HTa
while (i.hasNext()) {
Map.Entry e = (Map.Entry)i.next();
Collection quals = (Collection)e.getValue();
- if (quals != null && !quals.isEmpty()) {
+ if (quals == null || quals.isEmpty()) {
+ // this is an unqualified family. append the family name and NO ':'
+ sb.append(Bytes.toStringBinary((byte[])e.getKey()));
+ } else {
Iterator ii = quals.iterator();
while (ii.hasNext()) {
sb.append(Bytes.toStringBinary((byte[])e.getKey()));
@@ -115,9 +118,6 @@ public class RemoteHTable implements HTa
sb.append(',');
}
}
- } else {
- // this is an unqualified family. append the family name and NO ':'
- sb.append(Bytes.toStringBinary((byte[])e.getKey()));
}
if (i.hasNext()) {
sb.append(',');
Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java?rev=1524576&r1=1524575&r2=1524576&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java Wed Sep 18 21:23:57 2013
@@ -26,6 +26,7 @@ import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.net.URLEncoder;
+import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
@@ -66,6 +67,7 @@ public class TestRowResource {
private static final String CFB = "b";
private static final String COLUMN_1 = CFA + ":1";
private static final String COLUMN_2 = CFB + ":2";
+ private static final String COLUMN_3 = CFA + ":";
private static final String ROW_1 = "testrow1";
private static final String VALUE_1 = "testvalue1";
private static final String ROW_2 = "testrow2";
@@ -711,7 +713,7 @@ public class TestRowResource {
for (CellModel cell: rowModel.getCells()) {
assertEquals(COLUMN_1, Bytes.toString(cell.getColumn()));
assertEquals(values[i], Bytes.toString(cell.getValue()));
- }
+ }
}
for (String row : rows) {
response = deleteRow(TABLE, row);
@@ -764,5 +766,52 @@ public class TestRowResource {
assertEquals(response.getCode(), 200);
}
+ @Test
+ public void testMultiColumnGetXML() throws Exception {
+ String path = "/" + TABLE + "/fakerow";
+ CellSetModel cellSetModel = new CellSetModel();
+ RowModel rowModel = new RowModel(ROW_1);
+ rowModel.addCell(new CellModel(Bytes.toBytes(COLUMN_1), Bytes.toBytes(VALUE_1)));
+ rowModel.addCell(new CellModel(Bytes.toBytes(COLUMN_2), Bytes.toBytes(VALUE_2)));
+ rowModel.addCell(new CellModel(Bytes.toBytes(COLUMN_3), Bytes.toBytes(VALUE_2)));
+ cellSetModel.addRow(rowModel);
+ StringWriter writer = new StringWriter();
+ marshaller.marshal(cellSetModel, writer);
+
+ Response response = client.put(path, Constants.MIMETYPE_XML, Bytes.toBytes(writer.toString()));
+ Thread.yield();
+
+ // make sure the fake row was not actually created
+ response = client.get(path, Constants.MIMETYPE_XML);
+ assertEquals(response.getCode(), 404);
+
+ // Try getting all the column values at once.
+ path = "/" + TABLE + "/" + ROW_1 + "/" + COLUMN_1 + "," + COLUMN_2 + "," + COLUMN_3;
+ response = client.get(path, Constants.MIMETYPE_XML);
+ assertEquals(200, response.getCode());
+ CellSetModel cellSet = (CellSetModel) unmarshaller.unmarshal(new ByteArrayInputStream(response
+ .getBody()));
+ assertTrue(cellSet.getRows().size() == 1);
+ assertTrue(cellSet.getRows().get(0).getCells().size() == 3);
+ List<CellModel> cells = cellSet.getRows().get(0).getCells();
+
+ assertTrue(containsCellModel(cells, COLUMN_1, VALUE_1));
+ assertTrue(containsCellModel(cells, COLUMN_2, VALUE_2));
+ assertTrue(containsCellModel(cells, COLUMN_3, VALUE_2));
+ response = deleteRow(TABLE, ROW_1);
+ assertEquals(response.getCode(), 200);
+ }
+
+ private boolean containsCellModel(List<CellModel> cells, String column, String value) {
+ boolean contains = false;
+ for (CellModel cell : cells) {
+ if (Bytes.toString(cell.getColumn()).equals(column)
+ && Bytes.toString(cell.getValue()).equals(value)) {
+ contains = true;
+ return contains;
+ }
+ }
+ return contains;
+ }
}
Modified: hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/rest/client/TestRemoteTable.java
URL: http://svn.apache.org/viewvc/hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/rest/client/TestRemoteTable.java?rev=1524576&r1=1524575&r2=1524576&view=diff
==============================================================================
--- hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/rest/client/TestRemoteTable.java (original)
+++ hbase/trunk/hbase-server/src/test/java/org/apache/hadoop/hbase/rest/client/TestRemoteTable.java Wed Sep 18 21:23:57 2013
@@ -157,7 +157,7 @@ public class TestRemoteTable {
assertNull(value2);
get = new Get(ROW_2);
- result = remoteTable.get(get);
+ result = remoteTable.get(get);
value1 = result.getValue(COLUMN_1, QUALIFIER_1);
value2 = result.getValue(COLUMN_2, QUALIFIER_2);
assertNotNull(value1);
@@ -167,7 +167,7 @@ public class TestRemoteTable {
get = new Get(ROW_2);
get.addFamily(COLUMN_1);
- result = remoteTable.get(get);
+ result = remoteTable.get(get);
value1 = result.getValue(COLUMN_1, QUALIFIER_1);
value2 = result.getValue(COLUMN_2, QUALIFIER_2);
assertNotNull(value1);
@@ -177,7 +177,7 @@ public class TestRemoteTable {
get = new Get(ROW_2);
get.addColumn(COLUMN_1, QUALIFIER_1);
get.addColumn(COLUMN_2, QUALIFIER_2);
- result = remoteTable.get(get);
+ result = remoteTable.get(get);
value1 = result.getValue(COLUMN_1, QUALIFIER_1);
value2 = result.getValue(COLUMN_2, QUALIFIER_2);
assertNotNull(value1);
@@ -191,7 +191,7 @@ public class TestRemoteTable {
get.addFamily(COLUMN_1);
get.addFamily(COLUMN_2);
get.setTimeStamp(TS_1);
- result = remoteTable.get(get);
+ result = remoteTable.get(get);
value1 = result.getValue(COLUMN_1, QUALIFIER_1);
value2 = result.getValue(COLUMN_2, QUALIFIER_2);
assertNotNull(value1);
@@ -204,7 +204,7 @@ public class TestRemoteTable {
get.addFamily(COLUMN_1);
get.addFamily(COLUMN_2);
get.setTimeRange(0, TS_1 + 1);
- result = remoteTable.get(get);
+ result = remoteTable.get(get);
value1 = result.getValue(COLUMN_1, QUALIFIER_1);
value2 = result.getValue(COLUMN_2, QUALIFIER_2);
assertNotNull(value1);
@@ -334,7 +334,7 @@ public class TestRemoteTable {
Delete delete = new Delete(ROW_3);
delete.deleteColumn(COLUMN_2, QUALIFIER_2);
remoteTable.delete(delete);
-
+
get = new Get(ROW_3);
get.addFamily(COLUMN_1);
get.addFamily(COLUMN_2);
@@ -358,7 +358,7 @@ public class TestRemoteTable {
assertNotNull(value1);
assertTrue(Bytes.equals(VALUE_1, value1));
assertNull(value2);
-
+
delete = new Delete(ROW_3);
remoteTable.delete(delete);
@@ -369,7 +369,7 @@ public class TestRemoteTable {
value1 = result.getValue(COLUMN_1, QUALIFIER_1);
value2 = result.getValue(COLUMN_2, QUALIFIER_2);
assertNull(value1);
- assertNull(value2);
+ assertNull(value2);
}
public void testScanner() throws IOException {