From: Andrew Purtell Subject: [PATCH] HBASE-10952 [REST] Let the user turn off block caching if desired --- .../org/apache/hadoop/hbase/rest/Constants.java | 50 +++---- .../apache/hadoop/hbase/rest/MultiRowResource.java | 7 +- .../apache/hadoop/hbase/rest/ResultGenerator.java | 7 +- .../org/apache/hadoop/hbase/rest/RowResource.java | 9 +- .../hadoop/hbase/rest/RowResultGenerator.java | 4 +- .../apache/hadoop/hbase/rest/ScannerResource.java | 6 +- .../hadoop/hbase/rest/ScannerResultGenerator.java | 13 +- .../hadoop/hbase/rest/model/ScannerModel.java | 22 ++- .../rest/protobuf/generated/ScannerMessage.java | 151 ++++++++++++++++++++- .../org/apache/hadoop/hbase/rest/XMLSchema.xsd | 7 +- .../hbase/rest/protobuf/ScannerMessage.proto | 3 +- .../hadoop/hbase/rest/model/TestModelBase.java | 9 -- .../hadoop/hbase/rest/model/TestScannerModel.java | 23 ++-- 13 files changed, 247 insertions(+), 64 deletions(-) diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/rest/Constants.java hbase-server/src/main/java/org/apache/hadoop/hbase/rest/Constants.java index 8c101d8..4326c41 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/rest/Constants.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/rest/Constants.java @@ -27,7 +27,9 @@ import org.apache.hadoop.classification.InterfaceStability; @InterfaceAudience.Public @InterfaceStability.Stable public interface Constants { - String VERSION_STRING = "0.0.2"; + // All constants in a public interface are 'public static final' + + String VERSION_STRING = "0.0.3"; int DEFAULT_MAX_AGE = 60 * 60 * 4; // 4 hours @@ -43,30 +45,32 @@ public interface Constants { String CRLF = "\r\n"; - static final String REST_KEYTAB_FILE = "hbase.rest.keytab.file"; - static final String REST_KERBEROS_PRINCIPAL = "hbase.rest.kerberos.principal"; - static final String REST_AUTHENTICATION_TYPE = "hbase.rest.authentication.type"; - static final String REST_AUTHENTICATION_PRINCIPAL = - "hbase.rest.authentication.kerberos.principal"; + String REST_KEYTAB_FILE = "hbase.rest.keytab.file"; + String REST_KERBEROS_PRINCIPAL = "hbase.rest.kerberos.principal"; + String REST_AUTHENTICATION_TYPE = "hbase.rest.authentication.type"; + String REST_AUTHENTICATION_PRINCIPAL = "hbase.rest.authentication.kerberos.principal"; - static final String REST_SSL_ENABLED = "hbase.rest.ssl.enabled"; - static final String REST_SSL_KEYSTORE_STORE = "hbase.rest.ssl.keystore.store"; - static final String REST_SSL_KEYSTORE_PASSWORD = "hbase.rest.ssl.keystore.password"; - static final String REST_SSL_KEYSTORE_KEYPASSWORD = - "hbase.rest.ssl.keystore.keypassword"; + String REST_SSL_ENABLED = "hbase.rest.ssl.enabled"; + String REST_SSL_KEYSTORE_STORE = "hbase.rest.ssl.keystore.store"; + String REST_SSL_KEYSTORE_PASSWORD = "hbase.rest.ssl.keystore.password"; + String REST_SSL_KEYSTORE_KEYPASSWORD = "hbase.rest.ssl.keystore.keypassword"; - static final String REST_DNS_NAMESERVER = "hbase.rest.dns.nameserver"; - static final String REST_DNS_INTERFACE = "hbase.rest.dns.interface"; + String REST_DNS_NAMESERVER = "hbase.rest.dns.nameserver"; + String REST_DNS_INTERFACE = "hbase.rest.dns.interface"; - public static final String FILTER_CLASSES = "hbase.rest.filter.classes"; - public static final String SCAN_START_ROW = "startrow"; - public static final String SCAN_END_ROW = "endrow"; - public static final String SCAN_COLUMN = "column"; - public static final String SCAN_START_TIME = "starttime"; - public static final String SCAN_END_TIME = "endtime"; - public static final String SCAN_MAX_VERSIONS = "maxversions"; - public static final String SCAN_BATCH_SIZE = "batchsize"; - public static final String SCAN_LIMIT = "limit"; - public static final String SCAN_FETCH_SIZE = "hbase.rest.scan.fetchsize"; + String FILTER_CLASSES = "hbase.rest.filter.classes"; + String SCAN_START_ROW = "startrow"; + String SCAN_END_ROW = "endrow"; + String SCAN_COLUMN = "column"; + String SCAN_START_TIME = "starttime"; + String SCAN_END_TIME = "endtime"; + String SCAN_MAX_VERSIONS = "maxversions"; + String SCAN_BATCH_SIZE = "batchsize"; + String SCAN_LIMIT = "limit"; + String SCAN_FETCH_SIZE = "hbase.rest.scan.fetchsize"; + String ROW_KEYS_PARAM_NAME = "row"; + /** If this query parameter is present when processing row or scanner resources, + it disables server side block caching */ + String NOCACHE_PARAM_NAME = "nocache"; } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java hbase-server/src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java index 82fee52..239ec9d 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/rest/MultiRowResource.java @@ -37,9 +37,8 @@ import org.apache.hadoop.hbase.rest.model.CellSetModel; import org.apache.hadoop.hbase.rest.model.RowModel; @InterfaceAudience.Private -public class MultiRowResource extends ResourceBase { +public class MultiRowResource extends ResourceBase implements Constants { private static final Log LOG = LogFactory.getLog(MultiRowResource.class); - public static final String ROW_KEYS_PARAM_NAME = "row"; TableResource tableResource; Integer versions = null; @@ -75,9 +74,9 @@ public class MultiRowResource extends ResourceBase { if (this.versions != null) { rowSpec.setMaxVersions(this.versions); } - ResultGenerator generator = - ResultGenerator.fromRowSpec(this.tableResource.getName(), rowSpec, null); + ResultGenerator.fromRowSpec(this.tableResource.getName(), rowSpec, null, + !params.containsKey(NOCACHE_PARAM_NAME)); Cell value = null; RowModel rowModel = new RowModel(rk); if (generator.hasNext()) { diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ResultGenerator.java hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ResultGenerator.java index 6db0232..edee91d 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ResultGenerator.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ResultGenerator.java @@ -31,11 +31,12 @@ import org.apache.hadoop.hbase.rest.model.ScannerModel; public abstract class ResultGenerator implements Iterator { public static ResultGenerator fromRowSpec(final String table, - final RowSpec rowspec, final Filter filter) throws IOException { + final RowSpec rowspec, final Filter filter, final boolean cacheBlocks) + throws IOException { if (rowspec.isSingleRow()) { - return new RowResultGenerator(table, rowspec, filter); + return new RowResultGenerator(table, rowspec, filter, cacheBlocks); } else { - return new ScannerResultGenerator(table, rowspec, filter); + return new ScannerResultGenerator(table, rowspec, filter, cacheBlocks); } } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java index 8492c4a..6f0a9eb 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResource.java @@ -31,6 +31,7 @@ import javax.ws.rs.PUT; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.ResponseBuilder; import javax.ws.rs.core.UriInfo; @@ -88,9 +89,11 @@ public class RowResource extends ResourceBase { LOG.debug("GET " + uriInfo.getAbsolutePath()); } servlet.getMetrics().incrementRequests(1); + MultivaluedMap params = uriInfo.getQueryParameters(); try { ResultGenerator generator = - ResultGenerator.fromRowSpec(tableResource.getName(), rowspec, null); + ResultGenerator.fromRowSpec(tableResource.getName(), rowspec, null, + !params.containsKey(NOCACHE_PARAM_NAME)); if (!generator.hasNext()) { servlet.getMetrics().incrementFailedGetRequests(1); return Response.status(Response.Status.NOT_FOUND) @@ -138,9 +141,11 @@ public class RowResource extends ResourceBase { return Response.status(Response.Status.BAD_REQUEST).type(MIMETYPE_TEXT) .entity("Bad request: Either 0 or more than 1 columns specified." + CRLF).build(); } + MultivaluedMap params = uriInfo.getQueryParameters(); try { ResultGenerator generator = - ResultGenerator.fromRowSpec(tableResource.getName(), rowspec, null); + ResultGenerator.fromRowSpec(tableResource.getName(), rowspec, null, + !params.containsKey(NOCACHE_PARAM_NAME)); if (!generator.hasNext()) { servlet.getMetrics().incrementFailedGetRequests(1); return Response.status(Response.Status.NOT_FOUND) diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResultGenerator.java hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResultGenerator.java index ee84e6d..cdfc041 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResultGenerator.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/rest/RowResultGenerator.java @@ -43,7 +43,8 @@ public class RowResultGenerator extends ResultGenerator { private Cell cache; public RowResultGenerator(final String tableName, final RowSpec rowspec, - final Filter filter) throws IllegalArgumentException, IOException { + final Filter filter, final boolean cacheBlocks) + throws IllegalArgumentException, IOException { HTableInterface table = RESTServlet.getInstance().getTable(tableName); try { Get get = new Get(rowspec.getRow()); @@ -64,6 +65,7 @@ public class RowResultGenerator extends ResultGenerator { if (filter != null) { get.setFilter(filter); } + get.setCacheBlocks(cacheBlocks); Result result = table.get(get); if (result != null && !result.isEmpty()) { valuesI = result.listCells().iterator(); diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ScannerResource.java hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ScannerResource.java index 81be6fc..43a7667 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ScannerResource.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ScannerResource.java @@ -31,6 +31,7 @@ import javax.ws.rs.PUT; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.core.Context; +import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriInfo; @@ -90,11 +91,14 @@ public class ScannerResource extends ResourceBase { spec = new RowSpec(model.getStartRow(), endRow, model.getColumns(), model.getStartTime(), model.getEndTime(), model.getMaxVersions()); } + MultivaluedMap params = uriInfo.getQueryParameters(); + try { Filter filter = ScannerResultGenerator.buildFilterFromModel(model); String tableName = tableResource.getName(); ScannerResultGenerator gen = - new ScannerResultGenerator(tableName, spec, filter, model.getCaching()); + new ScannerResultGenerator(tableName, spec, filter, model.getCaching(), + model.getCacheBlocks()); String id = gen.getID(); ScannerInstanceResource instance = new ScannerInstanceResource(tableName, id, gen, model.getBatch()); diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ScannerResultGenerator.java hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ScannerResultGenerator.java index be4682e..32f145b 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ScannerResultGenerator.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/rest/ScannerResultGenerator.java @@ -59,12 +59,14 @@ public class ScannerResultGenerator extends ResultGenerator { private Result cached; public ScannerResultGenerator(final String tableName, final RowSpec rowspec, - final Filter filter) throws IllegalArgumentException, IOException { - this(tableName, rowspec, filter, -1); + final Filter filter, final boolean cacheBlocks) + throws IllegalArgumentException, IOException { + this(tableName, rowspec, filter, -1, cacheBlocks); } public ScannerResultGenerator(final String tableName, final RowSpec rowspec, - final Filter filter, final int caching) throws IllegalArgumentException, IOException { + final Filter filter, final int caching, final boolean cacheBlocks) + throws IllegalArgumentException, IOException { HTableInterface table = RESTServlet.getInstance().getTable(tableName); try { Scan scan; @@ -91,12 +93,11 @@ public class ScannerResultGenerator extends ResultGenerator { if (filter != null) { scan.setFilter(filter); } - // always disable block caching on the cluster when scanning - scan.setCacheBlocks(false); if (caching > 0 ) { scan.setCaching(caching); } - if(rowspec.hasLabels()) { + scan.setCacheBlocks(cacheBlocks); + if (rowspec.hasLabels()) { scan.setAuthorizations(new Authorizations(rowspec.getLabels())); } scanner = table.getScanner(scan); diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java index 8e0bb73..7950f55 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/rest/model/ScannerModel.java @@ -116,6 +116,7 @@ public class ScannerModel implements ProtobufMessageHandler, Serializable { private int maxVersions = Integer.MAX_VALUE; private int caching = -1; private List labels = new ArrayList(); + private boolean cacheBlocks = true; @XmlRootElement static class FilterModel { @@ -667,6 +668,14 @@ public class ScannerModel implements ProtobufMessageHandler, Serializable { } /** + * @return true if HFile blocks should be cached on the servers for this scan, false otherwise + */ + @XmlAttribute + public boolean getCacheBlocks() { + return cacheBlocks; + } + + /** * @return the lower bound on timestamps of items of interest */ @XmlAttribute @@ -734,6 +743,13 @@ public class ScannerModel implements ProtobufMessageHandler, Serializable { } /** + * @param value true if HFile blocks should be cached on the servers for this scan, false otherwise + */ + public void setCacheBlocks(boolean value) { + this.cacheBlocks = value; + } + + /** * @param maxVersions maximum number of versions to return */ public void setMaxVersions(int maxVersions) { @@ -791,6 +807,7 @@ public class ScannerModel implements ProtobufMessageHandler, Serializable { for (String label : labels) builder.addLabels(label); } + builder.setCacheBlocks(cacheBlocks); return builder.build().toByteArray(); } @@ -826,12 +843,15 @@ public class ScannerModel implements ProtobufMessageHandler, Serializable { if (builder.hasFilter()) { filter = builder.getFilter(); } - if(builder.getLabelsList() != null) { + if (builder.getLabelsList() != null) { List labels = builder.getLabelsList(); for(String label : labels) { addLabel(label); } } + if (builder.hasCacheBlocks()) { + this.cacheBlocks = builder.getCacheBlocks(); + } return this; } diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/rest/protobuf/generated/ScannerMessage.java hbase-server/src/main/java/org/apache/hadoop/hbase/rest/protobuf/generated/ScannerMessage.java index b76e4e0..ef9d1b9 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/rest/protobuf/generated/ScannerMessage.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/rest/protobuf/generated/ScannerMessage.java @@ -103,10 +103,18 @@ public final class ScannerMessage { // optional int32 caching = 9; /** * optional int32 caching = 9; + * + *
+     * specifies REST scanner caching
+     * 
*/ boolean hasCaching(); /** * optional int32 caching = 9; + * + *
+     * specifies REST scanner caching
+     * 
*/ int getCaching(); @@ -129,6 +137,24 @@ public final class ScannerMessage { */ com.google.protobuf.ByteString getLabelsBytes(int index); + + // optional bool cacheBlocks = 11; + /** + * optional bool cacheBlocks = 11; + * + *
+     * server side block caching hint
+     * 
+ */ + boolean hasCacheBlocks(); + /** + * optional bool cacheBlocks = 11; + * + *
+     * server side block caching hint
+     * 
+ */ + boolean getCacheBlocks(); } /** * Protobuf type {@code org.apache.hadoop.hbase.rest.protobuf.generated.Scanner} @@ -237,6 +263,11 @@ public final class ScannerMessage { labels_.add(input.readBytes()); break; } + case 88: { + bitField0_ |= 0x00000100; + cacheBlocks_ = input.readBool(); + break; + } } } } catch (com.google.protobuf.InvalidProtocolBufferException e) { @@ -450,12 +481,20 @@ public final class ScannerMessage { private int caching_; /** * optional int32 caching = 9; + * + *
+     * specifies REST scanner caching
+     * 
*/ public boolean hasCaching() { return ((bitField0_ & 0x00000080) == 0x00000080); } /** * optional int32 caching = 9; + * + *
+     * specifies REST scanner caching
+     * 
*/ public int getCaching() { return caching_; @@ -491,6 +530,30 @@ public final class ScannerMessage { return labels_.getByteString(index); } + // optional bool cacheBlocks = 11; + public static final int CACHEBLOCKS_FIELD_NUMBER = 11; + private boolean cacheBlocks_; + /** + * optional bool cacheBlocks = 11; + * + *
+     * server side block caching hint
+     * 
+ */ + public boolean hasCacheBlocks() { + return ((bitField0_ & 0x00000100) == 0x00000100); + } + /** + * optional bool cacheBlocks = 11; + * + *
+     * server side block caching hint
+     * 
+ */ + public boolean getCacheBlocks() { + return cacheBlocks_; + } + private void initFields() { startRow_ = com.google.protobuf.ByteString.EMPTY; endRow_ = com.google.protobuf.ByteString.EMPTY; @@ -502,6 +565,7 @@ public final class ScannerMessage { filter_ = ""; caching_ = 0; labels_ = com.google.protobuf.LazyStringArrayList.EMPTY; + cacheBlocks_ = false; } private byte memoizedIsInitialized = -1; public final boolean isInitialized() { @@ -545,6 +609,9 @@ public final class ScannerMessage { for (int i = 0; i < labels_.size(); i++) { output.writeBytes(10, labels_.getByteString(i)); } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + output.writeBool(11, cacheBlocks_); + } getUnknownFields().writeTo(output); } @@ -604,6 +671,10 @@ public final class ScannerMessage { size += dataSize; size += 1 * getLabelsList().size(); } + if (((bitField0_ & 0x00000100) == 0x00000100)) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(11, cacheBlocks_); + } size += getUnknownFields().getSerializedSize(); memoizedSerializedSize = size; return size; @@ -740,6 +811,8 @@ public final class ScannerMessage { bitField0_ = (bitField0_ & ~0x00000100); labels_ = com.google.protobuf.LazyStringArrayList.EMPTY; bitField0_ = (bitField0_ & ~0x00000200); + cacheBlocks_ = false; + bitField0_ = (bitField0_ & ~0x00000400); return this; } @@ -811,6 +884,10 @@ public final class ScannerMessage { bitField0_ = (bitField0_ & ~0x00000200); } result.labels_ = labels_; + if (((from_bitField0_ & 0x00000400) == 0x00000400)) { + to_bitField0_ |= 0x00000100; + } + result.cacheBlocks_ = cacheBlocks_; result.bitField0_ = to_bitField0_; onBuilt(); return result; @@ -873,6 +950,9 @@ public final class ScannerMessage { } onChanged(); } + if (other.hasCacheBlocks()) { + setCacheBlocks(other.getCacheBlocks()); + } this.mergeUnknownFields(other.getUnknownFields()); return this; } @@ -1254,18 +1334,30 @@ public final class ScannerMessage { private int caching_ ; /** * optional int32 caching = 9; + * + *
+       * specifies REST scanner caching
+       * 
*/ public boolean hasCaching() { return ((bitField0_ & 0x00000100) == 0x00000100); } /** * optional int32 caching = 9; + * + *
+       * specifies REST scanner caching
+       * 
*/ public int getCaching() { return caching_; } /** * optional int32 caching = 9; + * + *
+       * specifies REST scanner caching
+       * 
*/ public Builder setCaching(int value) { bitField0_ |= 0x00000100; @@ -1275,6 +1367,10 @@ public final class ScannerMessage { } /** * optional int32 caching = 9; + * + *
+       * specifies REST scanner caching
+       * 
*/ public Builder clearCaching() { bitField0_ = (bitField0_ & ~0x00000100); @@ -1376,6 +1472,55 @@ public final class ScannerMessage { return this; } + // optional bool cacheBlocks = 11; + private boolean cacheBlocks_ ; + /** + * optional bool cacheBlocks = 11; + * + *
+       * server side block caching hint
+       * 
+ */ + public boolean hasCacheBlocks() { + return ((bitField0_ & 0x00000400) == 0x00000400); + } + /** + * optional bool cacheBlocks = 11; + * + *
+       * server side block caching hint
+       * 
+ */ + public boolean getCacheBlocks() { + return cacheBlocks_; + } + /** + * optional bool cacheBlocks = 11; + * + *
+       * server side block caching hint
+       * 
+ */ + public Builder setCacheBlocks(boolean value) { + bitField0_ |= 0x00000400; + cacheBlocks_ = value; + onChanged(); + return this; + } + /** + * optional bool cacheBlocks = 11; + * + *
+       * server side block caching hint
+       * 
+ */ + public Builder clearCacheBlocks() { + bitField0_ = (bitField0_ & ~0x00000400); + cacheBlocks_ = false; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:org.apache.hadoop.hbase.rest.protobuf.generated.Scanner) } @@ -1402,12 +1547,12 @@ public final class ScannerMessage { static { java.lang.String[] descriptorData = { "\n\024ScannerMessage.proto\022/org.apache.hadoo" + - "p.hbase.rest.protobuf.generated\"\265\001\n\007Scan" + + "p.hbase.rest.protobuf.generated\"\312\001\n\007Scan" + "ner\022\020\n\010startRow\030\001 \001(\014\022\016\n\006endRow\030\002 \001(\014\022\017\n" + "\007columns\030\003 \003(\014\022\r\n\005batch\030\004 \001(\005\022\021\n\tstartTi" + "me\030\005 \001(\003\022\017\n\007endTime\030\006 \001(\003\022\023\n\013maxVersions" + "\030\007 \001(\005\022\016\n\006filter\030\010 \001(\t\022\017\n\007caching\030\t \001(\005\022" + - "\016\n\006labels\030\n \003(\t" + "\016\n\006labels\030\n \003(\t\022\023\n\013cacheBlocks\030\013 \001(\010" }; com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner = new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() { @@ -1419,7 +1564,7 @@ public final class ScannerMessage { internal_static_org_apache_hadoop_hbase_rest_protobuf_generated_Scanner_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_org_apache_hadoop_hbase_rest_protobuf_generated_Scanner_descriptor, - new java.lang.String[] { "StartRow", "EndRow", "Columns", "Batch", "StartTime", "EndTime", "MaxVersions", "Filter", "Caching", "Labels", }); + new java.lang.String[] { "StartRow", "EndRow", "Columns", "Batch", "StartTime", "EndTime", "MaxVersions", "Filter", "Caching", "Labels", "CacheBlocks", }); return null; } }; diff --git hbase-server/src/main/resources/org/apache/hadoop/hbase/rest/XMLSchema.xsd hbase-server/src/main/resources/org/apache/hadoop/hbase/rest/XMLSchema.xsd index 9577ce2..ab1b722 100644 --- hbase-server/src/main/resources/org/apache/hadoop/hbase/rest/XMLSchema.xsd +++ hbase-server/src/main/resources/org/apache/hadoop/hbase/rest/XMLSchema.xsd @@ -111,13 +111,18 @@ - + + + + + + diff --git hbase-server/src/main/resources/org/apache/hadoop/hbase/rest/protobuf/ScannerMessage.proto hbase-server/src/main/resources/org/apache/hadoop/hbase/rest/protobuf/ScannerMessage.proto index 31de919..185eac6 100644 --- hbase-server/src/main/resources/org/apache/hadoop/hbase/rest/protobuf/ScannerMessage.proto +++ hbase-server/src/main/resources/org/apache/hadoop/hbase/rest/protobuf/ScannerMessage.proto @@ -26,6 +26,7 @@ message Scanner { optional int64 endTime = 6; optional int32 maxVersions = 7; optional string filter = 8; - optional int32 caching = 9; + optional int32 caching = 9; // specifies REST scanner caching repeated string labels = 10; + optional bool cacheBlocks = 11; // server side block caching hint } diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/rest/model/TestModelBase.java hbase-server/src/test/java/org/apache/hadoop/hbase/rest/model/TestModelBase.java index 5143cb3..500d924 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/rest/model/TestModelBase.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/rest/model/TestModelBase.java @@ -20,22 +20,14 @@ package org.apache.hadoop.hbase.rest.model; -import com.sun.jersey.api.json.JSONJAXBContext; import junit.framework.TestCase; import org.apache.hadoop.hbase.SmallTests; import org.apache.hadoop.hbase.rest.ProtobufMessageHandler; import org.apache.hadoop.hbase.rest.provider.JAXBContextResolver; import org.apache.hadoop.hbase.util.Base64; -import org.apache.hadoop.hbase.util.Bytes; -import org.codehaus.jackson.JsonGenerationException; -import org.codehaus.jackson.JsonParseException; import org.codehaus.jackson.jaxrs.JacksonJaxbJsonProvider; -import org.codehaus.jackson.map.AnnotationIntrospector; import org.codehaus.jackson.map.ObjectMapper; -import org.codehaus.jackson.map.SerializationConfig; -import org.codehaus.jackson.map.introspect.JacksonAnnotationIntrospector; import org.codehaus.jackson.node.ObjectNode; -import org.codehaus.jackson.xc.JaxbAnnotationIntrospector; import org.junit.experimental.categories.Category; import javax.ws.rs.core.MediaType; @@ -44,7 +36,6 @@ import javax.xml.bind.JAXBException; import java.io.IOException; import java.io.StringReader; import java.io.StringWriter; -import java.lang.reflect.InvocationTargetException; @Category(SmallTests.class) public abstract class TestModelBase extends TestCase { diff --git hbase-server/src/test/java/org/apache/hadoop/hbase/rest/model/TestScannerModel.java hbase-server/src/test/java/org/apache/hadoop/hbase/rest/model/TestScannerModel.java index c84a058..3102bfd 100644 --- hbase-server/src/test/java/org/apache/hadoop/hbase/rest/model/TestScannerModel.java +++ hbase-server/src/test/java/org/apache/hadoop/hbase/rest/model/TestScannerModel.java @@ -35,23 +35,26 @@ public class TestScannerModel extends TestModelBase { private static final long END_TIME = 1245393318192L; private static final int CACHING = 1000; private static final int BATCH = 100; + private static final boolean CACHE_BLOCKS = false; public TestScannerModel() throws Exception { super(ScannerModel.class); AS_XML = "" - + "" + + "" + "Y29sdW1uMQ==Y29sdW1uMjpmb28=" - + ""; + + "" + + ""; - AS_JSON = "{\"batch\":100,\"caching\":1000,\"endRow\":\"enp5eng=\",\"endTime\":1245393318192," - + "\"maxVersions\":2147483647,\"startRow\":\"YWJyYWNhZGFicmE=\",\"startTime\":1245219839331," - + "\"column\":[\"Y29sdW1uMQ==\",\"Y29sdW1uMjpmb28=\"]," - +"\"labels\":[\"private\",\"public\"]}"; + AS_JSON = "{\"batch\":100,\"caching\":1000,\"cacheBlocks\":false,\"endRow\":\"enp5eng=\"," + + "\"endTime\":1245393318192,\"maxVersions\":2147483647,\"startRow\":\"YWJyYWNhZGFicmE=\"," + + "\"startTime\":1245219839331,\"column\":[\"Y29sdW1uMQ==\",\"Y29sdW1uMjpmb28=\"]," + +"\"labels\":[\"private\",\"public\"]" + +"}"; - // TODO AS_PB = "CgthYnJhY2FkYWJyYRIFenp5engaB2NvbHVtbjEaC2NvbHVtbjI6Zm9vIGQo47qL554kMLDi57mf" - + "JDj/////B0joBw=="; + + "JDj/////B0joB1IHcHJpdmF0ZVIGcHVibGljWAA="; } protected ScannerModel buildTestModel() { @@ -66,6 +69,7 @@ public class TestScannerModel extends TestModelBase { model.setCaching(CACHING); model.addLabel(PRIVATE); model.addLabel(PUBLIC); + model.setCacheBlocks(CACHE_BLOCKS); return model; } @@ -86,6 +90,7 @@ public class TestScannerModel extends TestModelBase { assertEquals(model.getEndTime(), END_TIME); assertEquals(model.getBatch(), BATCH); assertEquals(model.getCaching(), CACHING); + assertEquals(model.getCacheBlocks(), CACHE_BLOCKS); boolean foundLabel1 = false; boolean foundLabel2 = false; if (model.getLabels() != null && model.getLabels().size() > 0) { -- 1.8.3.2