diff --git a/src/main/java/org/apache/hadoop/hbase/rest/ExistsResource.java b/src/main/java/org/apache/hadoop/hbase/rest/ExistsResource.java index 435c82b..a4a5d8f 100644 --- a/src/main/java/org/apache/hadoop/hbase/rest/ExistsResource.java +++ b/src/main/java/org/apache/hadoop/hbase/rest/ExistsResource.java @@ -31,6 +31,8 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.Response.ResponseBuilder; +import org.apache.hadoop.hbase.client.HBaseAdmin; + public class ExistsResource extends ResourceBase { static CacheControl cacheControl; @@ -57,8 +59,13 @@ public class ExistsResource extends ResourceBase { MIMETYPE_BINARY}) public Response get(final @Context UriInfo uriInfo) { try { - if (!tableResource.exists()) { - throw new WebApplicationException(Response.Status.NOT_FOUND); + HBaseAdmin admin = new HBaseAdmin(servlet.getConfiguration()); + try { + if (!admin.tableExists(tableResource.table)) { + throw new WebApplicationException(Response.Status.NOT_FOUND); + } + } finally { + admin.close(); } } catch (IOException e) { throw new WebApplicationException(Response.Status.SERVICE_UNAVAILABLE); diff --git a/src/main/java/org/apache/hadoop/hbase/rest/RootResource.java b/src/main/java/org/apache/hadoop/hbase/rest/RootResource.java index 4cf37a8..60a4c54 100644 --- a/src/main/java/org/apache/hadoop/hbase/rest/RootResource.java +++ b/src/main/java/org/apache/hadoop/hbase/rest/RootResource.java @@ -63,11 +63,15 @@ public class RootResource extends ResourceBase { private final TableListModel getTableList() throws IOException { TableListModel tableList = new TableListModel(); HBaseAdmin admin = new HBaseAdmin(servlet.getConfiguration()); - HTableDescriptor[] list = admin.listTables(); - for (HTableDescriptor htd: list) { - tableList.add(new TableModel(htd.getNameAsString())); + try { + HTableDescriptor[] list = admin.listTables(); + for (HTableDescriptor htd: list) { + tableList.add(new TableModel(htd.getNameAsString())); + } + return tableList; + } finally { + admin.close(); } - return tableList; } @GET diff --git a/src/main/java/org/apache/hadoop/hbase/rest/SchemaResource.java b/src/main/java/org/apache/hadoop/hbase/rest/SchemaResource.java index 5e9a5be..4e0f365 100644 --- a/src/main/java/org/apache/hadoop/hbase/rest/SchemaResource.java +++ b/src/main/java/org/apache/hadoop/hbase/rest/SchemaResource.java @@ -177,10 +177,14 @@ public class SchemaResource extends ResourceBase { try { byte[] name = Bytes.toBytes(tableResource.getName()); HBaseAdmin admin = new HBaseAdmin(servlet.getConfiguration()); - if (replace || !admin.tableExists(name)) { - return replace(name, model, uriInfo, admin); - } else { - return update(name, model, uriInfo, admin); + try { + if (replace || !admin.tableExists(name)) { + return replace(name, model, uriInfo, admin); + } else { + return update(name, model, uriInfo, admin); + } + } finally { + admin.close(); } } catch (IOException e) { throw new WebApplicationException(e, diff --git a/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java b/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java index 69ed646..30baead 100644 --- a/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java +++ b/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java @@ -68,7 +68,12 @@ public class StorageClusterStatusResource extends ResourceBase { servlet.getMetrics().incrementRequests(1); try { HBaseAdmin admin = new HBaseAdmin(servlet.getConfiguration()); - ClusterStatus status = admin.getClusterStatus(); + ClusterStatus status; + try { + status = admin.getClusterStatus(); + } finally { + admin.close(); + } StorageClusterStatusModel model = new StorageClusterStatusModel(); model.setRegions(status.getRegionsCount()); model.setRequests(status.getRequestsCount()); diff --git a/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterVersionResource.java b/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterVersionResource.java index 106c9dc..3611d54 100644 --- a/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterVersionResource.java +++ b/src/main/java/org/apache/hadoop/hbase/rest/StorageClusterVersionResource.java @@ -65,11 +65,15 @@ public class StorageClusterVersionResource extends ResourceBase { servlet.getMetrics().incrementRequests(1); try { HBaseAdmin admin = new HBaseAdmin(servlet.getConfiguration()); - StorageClusterVersionModel model = new StorageClusterVersionModel(); - model.setVersion(admin.getClusterStatus().getHBaseVersion()); - ResponseBuilder response = Response.ok(model); - response.cacheControl(cacheControl); - return response.build(); + try { + StorageClusterVersionModel model = new StorageClusterVersionModel(); + model.setVersion(admin.getClusterStatus().getHBaseVersion()); + ResponseBuilder response = Response.ok(model); + response.cacheControl(cacheControl); + return response.build(); + } finally { + admin.close(); + } } catch (IOException e) { throw new WebApplicationException(e, Response.Status.SERVICE_UNAVAILABLE); diff --git a/src/main/java/org/apache/hadoop/hbase/rest/TableResource.java b/src/main/java/org/apache/hadoop/hbase/rest/TableResource.java index e19893d..836c1bb 100644 --- a/src/main/java/org/apache/hadoop/hbase/rest/TableResource.java +++ b/src/main/java/org/apache/hadoop/hbase/rest/TableResource.java @@ -32,21 +32,17 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.QueryParam; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HTableDescriptor; -import org.apache.hadoop.hbase.TableNotFoundException; -import org.apache.hadoop.hbase.client.HBaseAdmin; +import org.apache.hadoop.hbase.client.HTableInterface; +import org.apache.hadoop.hbase.client.HTablePool; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.rest.transform.NullTransform; import org.apache.hadoop.hbase.rest.transform.Transform; import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.util.StringUtils; public class TableResource extends ResourceBase { - private static final Log LOG = LogFactory.getLog(TableResource.class); /** * HCD attributes starting with this string are considered transform @@ -132,62 +128,59 @@ public class TableResource extends ResourceBase { * The attribute key must begin with the string "Transform$". */ void scanTransformAttrs() throws IOException { + HTableDescriptor htd = null; try { - HBaseAdmin admin = new HBaseAdmin(servlet.getConfiguration()); - HTableDescriptor htd = admin.getTableDescriptor(Bytes.toBytes(table)); - for (HColumnDescriptor hcd: htd.getFamilies()) { - for (Map.Entry e: - hcd.getValues().entrySet()) { - // does the key start with the transform directive tag? - String key = Bytes.toString(e.getKey().get()); - if (!key.startsWith(DIRECTIVE_KEY)) { - // no, skip - continue; + HTablePool pool = servlet.getTablePool(); + HTableInterface t = pool.getTable(table); + try { + htd = t.getTableDescriptor(); + } finally { + pool.putTable(t); + } + } catch (Exception e) { + // HTablePool#getTable throws RTE, and it doesn't really matter what + // exception got us here anyway, htd will be null below + } + if (htd == null) { + return; + } + for (HColumnDescriptor hcd: htd.getFamilies()) { + for (Map.Entry e: + hcd.getValues().entrySet()) { + // does the key start with the transform directive tag? + String key = Bytes.toString(e.getKey().get()); + if (!key.startsWith(DIRECTIVE_KEY)) { + // no, skip + continue; + } + // match a comma separated list of one or more directives + byte[] value = e.getValue().get(); + Matcher m = DIRECTIVE_PATTERN.matcher(Bytes.toString(value)); + while (m.find()) { + byte[] qualifier = HConstants.EMPTY_BYTE_ARRAY; + String s = m.group(1); + if (s.length() > 0 && !s.equals("*")) { + qualifier = Bytes.toBytes(s); } - // match a comma separated list of one or more directives - byte[] value = e.getValue().get(); - Matcher m = DIRECTIVE_PATTERN.matcher(Bytes.toString(value)); - while (m.find()) { - byte[] qualifier = HConstants.EMPTY_BYTE_ARRAY; - String s = m.group(1); - if (s.length() > 0 && !s.equals("*")) { - qualifier = Bytes.toBytes(s); - } - boolean retry = false; - String className = m.group(2); - while (true) { - try { - // if a transform was previously configured for the qualifier, - // this will simply replace it - setTransform(table, hcd.getName(), qualifier, + String className = m.group(2); + try { + // if a transform was previously configured for the qualifier, + // this will simply replace it + setTransform(table, hcd.getName(), qualifier, + (Transform)Class.forName(className).newInstance()); + } catch (ClassNotFoundException ex) { + className = "org.apache.hadoop.hbase.rest.transform." + className; + try { + setTransform(table, hcd.getName(), qualifier, (Transform)Class.forName(className).newInstance()); - break; - } catch (InstantiationException ex) { - LOG.error(StringUtils.stringifyException(ex)); - if (retry) { - break; - } - retry = true; - } catch (IllegalAccessException ex) { - LOG.error(StringUtils.stringifyException(ex)); - if (retry) { - break; - } - retry = true; - } catch (ClassNotFoundException ex) { - if (retry) { - LOG.error(StringUtils.stringifyException(ex)); - break; - } - className = "org.apache.hadoop.hbase.rest.transform." + className; - retry = true; - } + } catch (Exception ex2) { + throw new IOException("Cannot instantiate transform", ex2); } + } catch (Exception ex) { + throw new IOException("Cannot instantiate transform", ex); } } } - } catch (TableNotFoundException e) { - // ignore } } @@ -223,15 +216,6 @@ public class TableResource extends ResourceBase { } /** - * @return true if the table exists - * @throws IOException - */ - boolean exists() throws IOException { - HBaseAdmin admin = new HBaseAdmin(servlet.getConfiguration()); - return admin.tableExists(table); - } - - /** * Apply any configured transformations to the value * @param family * @param qualifier