diff --git a/CHANGES.txt b/CHANGES.txt index 250dec4e941..b9788cb13fc 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -471,6 +471,7 @@ Release 0.21.0 - Unreleased HBASE-2901 HBASE-2461 broke build HBASE-2823 Entire Row Deletes not stored in Row+Col Bloom (Alexander Georgiev via Stack) + HBASE-2897 RowResultGenerator should handle NoSuchColumnFamilyException IMPROVEMENTS HBASE-1760 Cleanup TODOs in HTable diff --git a/src/main/java/org/apache/hadoop/hbase/rest/RowResultGenerator.java b/src/main/java/org/apache/hadoop/hbase/rest/RowResultGenerator.java index b742ded02de..2948f163a79 100644 --- a/src/main/java/org/apache/hadoop/hbase/rest/RowResultGenerator.java +++ b/src/main/java/org/apache/hadoop/hbase/rest/RowResultGenerator.java @@ -24,6 +24,9 @@ import java.io.IOException; import java.util.Iterator; import java.util.NoSuchElementException; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.client.Get; @@ -31,8 +34,11 @@ import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.hadoop.hbase.client.HTablePool; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.filter.Filter; +import org.apache.hadoop.hbase.regionserver.NoSuchColumnFamilyException; public class RowResultGenerator extends ResultGenerator { + private static final Log LOG = LogFactory.getLog(RowResultGenerator.class); + private Iterator valuesI; private KeyValue cache; @@ -67,6 +73,14 @@ public class RowResultGenerator extends ResultGenerator { if (result != null && !result.isEmpty()) { valuesI = result.list().iterator(); } + } catch (NoSuchColumnFamilyException e) { + // Warn here because Stargate will return 404 in the case if multiple + // column families were specified but one did not exist -- currently + // HBase will fail the whole Get. + // Specifying multiple columns in a URI should be uncommon usage but + // help to avoid confusion by leaving a record of what happened here in + // the log. + LOG.warn(StringUtils.stringifyException(e)); } finally { pool.putTable(table); } diff --git a/src/main/java/org/apache/hadoop/hbase/rest/client/Client.java b/src/main/java/org/apache/hadoop/hbase/rest/client/Client.java index 45cf2db777e..11a09fe6f3b 100644 --- a/src/main/java/org/apache/hadoop/hbase/rest/client/Client.java +++ b/src/main/java/org/apache/hadoop/hbase/rest/client/Client.java @@ -143,7 +143,7 @@ public class Client { int code = httpClient.executeMethod(method); long endTime = System.currentTimeMillis(); if (LOG.isDebugEnabled()) { - LOG.debug(method.getName() + " " + uri + ": " + code + " " + + LOG.debug(method.getName() + " " + uri + " " + code + " " + method.getStatusText() + " in " + (endTime - startTime) + " ms"); } return code; diff --git a/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java b/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java index 392505e881b..2227395fccc 100644 --- a/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java +++ b/src/test/java/org/apache/hadoop/hbase/rest/TestRowResource.java @@ -312,6 +312,17 @@ public class TestRowResource extends HBaseRESTClusterTestBase { checkValueXML(TABLE, encodedKey, COLUMN_2, VALUE_2); } + public void testNoSuchCF() throws IOException, JAXBException { + final String goodPath = "/" + TABLE + "/" + ROW_1 + "/" + CFA; + final String badPath = "/" + TABLE + "/" + ROW_1 + "/" + "BAD"; + Response response = client.post(goodPath, MIMETYPE_BINARY, + Bytes.toBytes(VALUE_1)); + assertEquals(response.getCode(), 200); + assertEquals(client.get(goodPath, MIMETYPE_BINARY).getCode(), 200); + assertEquals(client.get(badPath, MIMETYPE_BINARY).getCode(), 404); + assertEquals(client.get(goodPath, MIMETYPE_BINARY).getCode(), 200); + } + void doTestMultiCellGetPutXML() throws IOException, JAXBException { String path = "/" + TABLE + "/fakerow"; // deliberate nonexistent row