You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ap...@apache.org on 2010/04/06 09:24:50 UTC

svn commit: r931039 [1/2] - in /hadoop/hbase/branches/0.20: ./ src/contrib/stargate/ src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/ src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/ src/contrib/stargate/src/java/or...

Author: apurtell
Date: Tue Apr  6 07:24:50 2010
New Revision: 931039

URL: http://svn.apache.org/viewvc?rev=931039&view=rev
Log:
HBASE-2412 [stargate] PerformanceEvaluation

Added:
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/ExistsResource.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/RemoteAdmin.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/test/org/apache/hadoop/hbase/stargate/PerformanceEvaluation.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/test/org/apache/hadoop/hbase/stargate/client/TestRemoteAdmin.java
Modified:
    hadoop/hbase/branches/0.20/CHANGES.txt
    hadoop/hbase/branches/0.20/src/contrib/stargate/build.xml
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/Main.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RESTServlet.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RegionsResource.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RootResource.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RowResource.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/ScannerResource.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/SchemaResource.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterStatusResource.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/TableResource.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/User.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Client.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Cluster.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/RemoteHTable.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableRegionModel.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableSchemaModel.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/util/HTableTokenBucket.java
    hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/util/UserData.java

Modified: hadoop/hbase/branches/0.20/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/CHANGES.txt?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/CHANGES.txt (original)
+++ hadoop/hbase/branches/0.20/CHANGES.txt Tue Apr  6 07:24:50 2010
@@ -112,6 +112,7 @@ Release 0.20.4 - Unreleased
                holds up all flushing
    HBASE-2252  Mapping a very big table kills region servers
    HBASE-2411  Findbugs target
+   HBASE-2412  [stargate] PerformanceEvaluation
 
   NEW FEATURES
    HBASE-2257  [stargate] multiuser mode

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/build.xml
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/build.xml?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/build.xml (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/build.xml Tue Apr  6 07:24:50 2010
@@ -63,6 +63,15 @@
     <javac srcdir="${src.test}" includes="**/*.java" destdir="${build.test}" debug="${javac.debug}" source="1.6">
       <classpath refid="test.classpath"/>
     </javac>
+    <jar jarfile="${build.dir}/${test.jar.file}" >
+      <fileset dir="${build.test}" includes="org/**" />
+      <fileset dir="${build.classes}" />
+      <fileset dir="${src.test}" includes="**/*.properties" />
+      <manifest>
+        <attribute name="Main-Class"
+          value="org/apache/hadoop/hbase/stargate/PerformanceEvaluation"/>
+      </manifest>
+    </jar>
   </target>
   
   <target name="test" depends="compile-test" description="Build test jar and run tests">

Added: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/ExistsResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/ExistsResource.java?rev=931039&view=auto
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/ExistsResource.java (added)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/ExistsResource.java Tue Apr  6 07:24:50 2010
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2010 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate;
+
+import java.io.IOException;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+import javax.ws.rs.WebApplicationException;
+import javax.ws.rs.core.CacheControl;
+import javax.ws.rs.core.Context;
+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 implements Constants {
+
+  User user;
+  String tableName;
+  String actualTableName;
+  CacheControl cacheControl;
+  RESTServlet servlet;
+
+  public ExistsResource(User user, String table) throws IOException {
+    if (user != null) {
+      this.user = user;
+      this.actualTableName = 
+        !user.isAdmin() ? (user.getName() + "." + table) : table;
+    } else {
+      this.actualTableName = table;
+    }
+    this.tableName = table;
+    servlet = RESTServlet.getInstance();
+    cacheControl = new CacheControl();
+    cacheControl.setNoCache(true);
+    cacheControl.setNoTransform(false);
+  }
+
+  @GET
+  @Produces({MIMETYPE_TEXT, MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF,
+    MIMETYPE_BINARY})
+  public Response get(final @Context UriInfo uriInfo) throws IOException {
+    if (!servlet.userRequestLimit(user, 1)) {
+      Response.status(509).build();
+    }
+    try {
+      HBaseAdmin admin = new HBaseAdmin(servlet.getConfiguration());
+      if (!admin.tableExists(actualTableName)) {
+        throw new WebApplicationException(Response.Status.NOT_FOUND);
+      }
+    } catch (IOException e) {
+      throw new WebApplicationException(Response.Status.SERVICE_UNAVAILABLE);
+    }
+    ResponseBuilder response = Response.ok();
+    response.cacheControl(cacheControl);
+    return response.build();
+  }
+
+}

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/Main.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/Main.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/Main.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/Main.java Tue Apr  6 07:24:50 2010
@@ -20,11 +20,12 @@
 
 package org.apache.hadoop.hbase.stargate;
 
+import java.net.InetAddress;
+
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.PosixParser;
-import org.mortbay.jetty.Connector;
 import org.mortbay.jetty.Server;
 import org.mortbay.jetty.servlet.Context;
 import org.mortbay.jetty.servlet.ServletHolder;
@@ -64,6 +65,18 @@ public class Main implements Constants {
     sh.setInitParameter("com.sun.jersey.config.property.packages",
       "jetty");
 
+    // configure the Stargate singleton
+
+    RESTServlet servlet = RESTServlet.getInstance();
+    port = servlet.getConfiguration().getInt("stargate.port", port);
+    if (!servlet.isMultiUser()) {
+      servlet.setMultiUser(cmd.hasOption("m"));
+    }
+    servlet.addConnectorAddress(
+      servlet.getConfiguration().get("stargate.hostname",
+        InetAddress.getLocalHost().getCanonicalHostName()),
+      port);
+
     // set up Jetty and run the embedded server
 
     Server server = new Server(port);
@@ -74,14 +87,6 @@ public class Main implements Constants {
     Context context = new Context(server, "/", Context.SESSIONS);
     context.addServlet(sh, "/*");
 
-    // configure the Stargate singleton
-
-    RESTServlet servlet = RESTServlet.getInstance();
-    servlet.setMultiUser(cmd.hasOption("m"));
-    for (Connector conn: server.getConnectors()) {
-      servlet.addConnectorAddress(conn.getHost(), conn.getLocalPort());
-    }
-
     server.start();
     server.join();
   }

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RESTServlet.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RESTServlet.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RESTServlet.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RESTServlet.java Tue Apr  6 07:24:50 2010
@@ -48,6 +48,7 @@ import org.apache.hadoop.hbase.stargate.
 import org.apache.hadoop.hbase.stargate.util.UserData;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.Pair;
+import org.apache.hadoop.hbase.util.Threads;
 import org.apache.hadoop.hbase.zookeeper.ZooKeeperWrapper;
 
 import org.apache.hadoop.util.StringUtils;
@@ -98,13 +99,12 @@ public class RESTServlet extends Servlet
         }
         status.endArray();
         status.endObject();
-        updateNode(wrapper, znode, CreateMode.EPHEMERAL, 
+        ensureExists(znode, CreateMode.EPHEMERAL, 
           Bytes.toBytes(status.toString()));
       } catch (Exception e) {
         LOG.error(StringUtils.stringifyException(e));
       }
     }
-
   }
 
   final String znode = INSTANCE_ZNODE_ROOT + "/" + System.currentTimeMillis();
@@ -132,49 +132,38 @@ public class RESTServlet extends Servlet
     return instance;
   }
 
-  static boolean ensureExists(final ZooKeeperWrapper zkw, final String znode,
-      final CreateMode mode) throws IOException {
-    ZooKeeper zk = zkw.getZooKeeper();
+  private boolean ensureExists(final String znode, final CreateMode mode,
+      final byte[] data) {
     try {
+      ZooKeeper zk = wrapper.getZooKeeper();
       Stat stat = zk.exists(znode, false);
       if (stat != null) {
+        zk.setData(znode, data, -1);
         return true;
       }
-      zk.create(znode, new byte[0], Ids.OPEN_ACL_UNSAFE, mode);
-      LOG.debug("Created ZNode " + znode);
+      zk.create(znode, data, Ids.OPEN_ACL_UNSAFE, mode);
+      LOG.info("Created ZNode " + znode);
       return true;
     } catch (KeeperException.NodeExistsException e) {
       return true;      // ok, move on.
     } catch (KeeperException.NoNodeException e) {
-      return ensureParentExists(zkw, znode, mode) && 
-        ensureExists(zkw, znode, mode);
+      return ensureParentExists(znode, CreateMode.PERSISTENT, new byte[]{}) &&
+        ensureExists(znode, mode, data);
     } catch (KeeperException e) {
-      throw new IOException(e);
+      LOG.warn(StringUtils.stringifyException(e));
     } catch (InterruptedException e) {
-      throw new IOException(e);
+      LOG.warn(StringUtils.stringifyException(e));
     }
+    return false;
   }
 
-  static boolean ensureParentExists(final ZooKeeperWrapper zkw,
-      final String znode, final CreateMode mode) throws IOException {
-    int index = znode.lastIndexOf("/");
+  private boolean ensureParentExists(final String znode, final CreateMode mode,
+      final byte[] data) {
+    int index = znode.lastIndexOf('/');
     if (index <= 0) {   // Parent is root, which always exists.
       return true;
     }
-    return ensureExists(zkw, znode.substring(0, index), mode);
-  }
-
-  static void updateNode(final ZooKeeperWrapper zkw, final String znode, 
-        final CreateMode mode, final byte[] data) throws IOException  {
-    ensureExists(zkw, znode, mode);
-    ZooKeeper zk = zkw.getZooKeeper();
-    try {
-      zk.setData(znode, data, -1);
-    } catch (KeeperException e) {
-      throw new IOException(e);
-    } catch (InterruptedException e) {
-      throw new IOException(e);
-    }
+    return ensureExists(znode.substring(0, index), mode, data);
   }
 
   ZooKeeperWrapper initZooKeeperWrapper() throws IOException {
@@ -190,8 +179,13 @@ public class RESTServlet extends Servlet
     this.pool = new HTablePool(conf, 10);
     this.wrapper = initZooKeeperWrapper();
     this.statusReporter = new StatusReporter(
-      conf.getInt(STATUS_REPORT_PERIOD_KEY, 1000 * 60), stopping);
+      conf.getInt(STATUS_REPORT_PERIOD_KEY, 1000 * 30), stopping);
+    Threads.setDaemonThreadRunning(statusReporter, "Stargate.statusReporter");
     this.multiuser = conf.getBoolean("stargate.multiuser", false);
+    if (this.multiuser) {
+      LOG.info("multiuser mode enabled");
+      getAuthenticator();
+    }
   }
 
   @Override
@@ -320,6 +314,7 @@ public class RESTServlet extends Servlet
       if (authenticator == null) {
         authenticator = new HBCAuthenticator(conf);
       }
+      LOG.info("using authenticator " + authenticator);
     }
     return authenticator;
   }
@@ -340,16 +335,18 @@ public class RESTServlet extends Servlet
    */
   public boolean userRequestLimit(final User user, int want) 
       throws IOException {
-    UserData ud = SoftUserData.get(user);
-    HTableTokenBucket tb = (HTableTokenBucket) ud.get(UserData.TOKENBUCKET);
-    if (tb == null) {
-      tb = new HTableTokenBucket(conf, Bytes.toBytes(user.getToken()));
-      ud.put(UserData.TOKENBUCKET, tb);
-    }
-    if (tb.available() < want) {
-      return false;
+    if (multiuser) {
+      UserData ud = SoftUserData.get(user);
+      HTableTokenBucket tb = (HTableTokenBucket) ud.get(UserData.TOKENBUCKET);
+      if (tb == null) {
+        tb = new HTableTokenBucket(conf, Bytes.toBytes(user.getToken()));
+        ud.put(UserData.TOKENBUCKET, tb);
+      }
+      if (tb.available() < want) {
+        return false;
+      }
+      tb.remove(want);
     }
-    tb.remove(want);
     return true;
   }
 

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RegionsResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RegionsResource.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RegionsResource.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RegionsResource.java Tue Apr  6 07:24:50 2010
@@ -35,6 +35,7 @@ import javax.ws.rs.core.Response.Respons
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+
 import org.apache.hadoop.hbase.HRegionInfo;
 import org.apache.hadoop.hbase.HServerAddress;
 import org.apache.hadoop.hbase.TableNotFoundException;
@@ -48,18 +49,20 @@ public class RegionsResource implements 
   private static final Log LOG = LogFactory.getLog(RegionsResource.class);
 
   User user;
-  String table;
+  String tableName;
+  String actualTableName;
   CacheControl cacheControl;
   RESTServlet servlet;
 
   public RegionsResource(User user, String table) throws IOException {
     if (user != null) {
-      if (!user.isAdmin()) {
-        throw new WebApplicationException(Response.Status.FORBIDDEN);
-      }
       this.user = user;
+      this.actualTableName = 
+        !user.isAdmin() ? (user.getName() + "." + table) : table;
+    } else {
+      this.actualTableName = table;
     }
-    this.table = table;
+    this.tableName = table;
     cacheControl = new CacheControl();
     cacheControl.setNoCache(true);
     cacheControl.setNoTransform(false);
@@ -69,7 +72,7 @@ public class RegionsResource implements 
   private Map<HRegionInfo,HServerAddress> getTableRegions()
       throws IOException {
     HTablePool pool = servlet.getTablePool();
-    HTable table = pool.getTable(this.table);
+    HTable table = pool.getTable(actualTableName);
     try {
       return table.getRegionsInfo();
     } finally {
@@ -79,22 +82,32 @@ public class RegionsResource implements 
 
   @GET
   @Produces({MIMETYPE_TEXT, MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF})
-  public Response get(final @Context UriInfo uriInfo) {
+  public Response get(final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("GET " + uriInfo.getAbsolutePath());
     }
+    if (!servlet.userRequestLimit(user, 1)) {
+      Response.status(509).build();
+    }
     servlet.getMetrics().incrementRequests(1);
     try {
-      TableInfoModel model = new TableInfoModel(table);
+      String name = user.isAdmin() ? actualTableName : tableName;
+      TableInfoModel model = new TableInfoModel(name);
       Map<HRegionInfo,HServerAddress> regions = getTableRegions();
       for (Map.Entry<HRegionInfo,HServerAddress> e: regions.entrySet()) {
         HRegionInfo hri = e.getKey();
-        HServerAddress addr = e.getValue();
-        InetSocketAddress sa = addr.getInetSocketAddress();
-        model.add(
-          new TableRegionModel(table, hri.getRegionId(), hri.getStartKey(),
-                hri.getEndKey(),
-                sa.getHostName() + ":" + Integer.valueOf(sa.getPort())));
+        if (user.isAdmin()) {
+          HServerAddress addr = e.getValue();
+          InetSocketAddress sa = addr.getInetSocketAddress();
+          model.add(
+            new TableRegionModel(name, hri.getRegionId(), hri.getStartKey(),
+              hri.getEndKey(),
+              sa.getHostName() + ":" + Integer.valueOf(sa.getPort())));
+        } else {
+          model.add(
+            new TableRegionModel(name, hri.getRegionId(), hri.getStartKey(),
+              hri.getEndKey()));
+        }
       }
       ResponseBuilder response = Response.ok(model);
       response.cacheControl(cacheControl);

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RootResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RootResource.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RootResource.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RootResource.java Tue Apr  6 07:24:50 2010
@@ -121,7 +121,7 @@ public class RootResource implements Con
     if (servlet.isMultiUser()) {
       throw new WebApplicationException(Response.Status.BAD_REQUEST);
     }
-    return new StorageClusterStatusResource();
+    return new StorageClusterStatusResource(User.DEFAULT_USER);
   }
 
   @Path("version")
@@ -135,7 +135,7 @@ public class RootResource implements Con
     if (servlet.isMultiUser()) {
       User user = auth(token);
       if (!servlet.userRequestLimit(user, 1)) {
-        throw new WebApplicationException(Response.status(509).build());
+        return Response.status(509).build();
       }
       try {
         ResponseBuilder response = Response.ok(getTableListForUser(user));
@@ -154,11 +154,8 @@ public class RootResource implements Con
       final @PathParam("token") String token) throws IOException {
     if (servlet.isMultiUser()) {
       User user = auth(token);
-      if (user.isAdmin()) {
-        if (!servlet.userRequestLimit(user, 1)) {
-          throw new WebApplicationException(Response.status(509).build());
-        }
-        return new StorageClusterStatusResource();
+      if (user != null && user.isAdmin()) {
+        return new StorageClusterStatusResource(user);
       }
       throw new WebApplicationException(Response.Status.FORBIDDEN);
     }
@@ -171,9 +168,6 @@ public class RootResource implements Con
       final @PathParam("table") String table) throws IOException {
     if (servlet.isMultiUser()) {
       User user = auth(token);
-      if (!servlet.userRequestLimit(user, 1)) {
-        throw new WebApplicationException(Response.status(509).build());
-      }
       return new TableResource(user, table);
     }
     throw new WebApplicationException(Response.Status.BAD_REQUEST);
@@ -185,7 +179,7 @@ public class RootResource implements Con
     if (servlet.isMultiUser()) {
       throw new WebApplicationException(Response.Status.BAD_REQUEST);
     }
-    return new TableResource(null, table);
+    return new TableResource(User.DEFAULT_USER, table);
   }
 
 }

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RowResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RowResource.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RowResource.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/RowResource.java Tue Apr  6 07:24:50 2010
@@ -79,16 +79,19 @@ public class RowResource implements Cons
     }
     this.servlet = RESTServlet.getInstance();
     cacheControl = new CacheControl();
-    cacheControl.setMaxAge(servlet.getMaxAge(table));
+    cacheControl.setMaxAge(servlet.getMaxAge(actualTableName));
     cacheControl.setNoTransform(false);
   }
 
   @GET
   @Produces({MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF})
-  public Response get(final @Context UriInfo uriInfo) {
+  public Response get(final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("GET " + uriInfo.getAbsolutePath());
     }
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
+    }
     servlet.getMetrics().incrementRequests(1);
     try {
       ResultGenerator generator =
@@ -127,10 +130,14 @@ public class RowResource implements Cons
 
   @GET
   @Produces(MIMETYPE_BINARY)
-  public Response getBinary(final @Context UriInfo uriInfo) {
+  public Response getBinary(final @Context UriInfo uriInfo) 
+      throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("GET " + uriInfo.getAbsolutePath() + " as "+ MIMETYPE_BINARY);
     }
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
+    }
     servlet.getMetrics().incrementRequests(1);
     // doesn't make sense to use a non specific coordinate as this can only
     // return a single cell
@@ -155,7 +162,6 @@ public class RowResource implements Cons
   }
 
   Response update(final CellSetModel model, final boolean replace) {
-    servlet.getMetrics().incrementRequests(1);
     HTablePool pool = servlet.getTablePool();
     HTable table = null;
     try {
@@ -166,6 +172,7 @@ public class RowResource implements Cons
         throw new WebApplicationException(Response.status(509).build());
       }
       table = pool.getTable(actualTableName);
+      table.setAutoFlush(false);
       for (RowModel row: rows) {
         byte[] key = row.getKey();
         Put put = new Put(key);
@@ -178,6 +185,7 @@ public class RowResource implements Cons
           LOG.debug("PUT " + put.toString());
         }
       }
+      table.setAutoFlush(true);
       table.flushCommits();
       ResponseBuilder response = Response.ok();
       return response.build();
@@ -194,7 +202,6 @@ public class RowResource implements Cons
   // This currently supports only update of one row at a time.
   Response updateBinary(final byte[] message, final HttpHeaders headers,
       final boolean replace) {
-    servlet.getMetrics().incrementRequests(1);
     HTablePool pool = servlet.getTablePool();
     HTable table = null;    
     try {
@@ -228,7 +235,6 @@ public class RowResource implements Cons
       if (LOG.isDebugEnabled()) {
         LOG.debug("PUT " + put.toString());
       }
-      table.flushCommits();
       return Response.ok().build();
     } catch (IOException e) {
       throw new WebApplicationException(e,
@@ -243,10 +249,14 @@ public class RowResource implements Cons
   @PUT
   @Consumes({MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF})
   public Response put(final CellSetModel model,
-      final @Context UriInfo uriInfo) {
+      final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("PUT " + uriInfo.getAbsolutePath());
     }
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
+    }
+    servlet.getMetrics().incrementRequests(1);
     return update(model, true);
   }
 
@@ -254,38 +264,55 @@ public class RowResource implements Cons
   @Consumes(MIMETYPE_BINARY)
   public Response putBinary(final byte[] message,
       final @Context UriInfo uriInfo, final @Context HttpHeaders headers)
+      throws IOException
   {
     if (LOG.isDebugEnabled()) {
       LOG.debug("PUT " + uriInfo.getAbsolutePath() + " as "+ MIMETYPE_BINARY);
     }
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
+    }
+    servlet.getMetrics().incrementRequests(1);
     return updateBinary(message, headers, true);
   }
 
   @POST
   @Consumes({MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF})
   public Response post(final CellSetModel model,
-      final @Context UriInfo uriInfo) {
+      final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("POST " + uriInfo.getAbsolutePath());
     }
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
+    }
+    servlet.getMetrics().incrementRequests(1);
     return update(model, false);
   }
 
   @POST
   @Consumes(MIMETYPE_BINARY)
   public Response postBinary(final byte[] message,
-      final @Context UriInfo uriInfo, final @Context HttpHeaders headers) {
+      final @Context UriInfo uriInfo, final @Context HttpHeaders headers) 
+      throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("POST " + uriInfo.getAbsolutePath() + " as "+MIMETYPE_BINARY);
     }
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
+    }
+    servlet.getMetrics().incrementRequests(1);
     return updateBinary(message, headers, false);
   }
 
   @DELETE
-  public Response delete(final @Context UriInfo uriInfo) {
+  public Response delete(final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("DELETE " + uriInfo.getAbsolutePath());
     }
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
+    }
     servlet.getMetrics().incrementRequests(1);
     Delete delete = null;
     if (rowspec.hasTimestamp())
@@ -317,7 +344,6 @@ public class RowResource implements Cons
       if (LOG.isDebugEnabled()) {
         LOG.debug("DELETE " + delete.toString());
       }
-      table.flushCommits();
     } catch (IOException e) {
       throw new WebApplicationException(e, 
                   Response.Status.SERVICE_UNAVAILABLE);

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/ScannerResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/ScannerResource.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/ScannerResource.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/ScannerResource.java Tue Apr  6 07:24:50 2010
@@ -22,6 +22,7 @@ package org.apache.hadoop.hbase.stargate
 
 import java.io.IOException;
 import java.net.URI;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -48,8 +49,8 @@ public class ScannerResource implements 
 
   private static final Log LOG = LogFactory.getLog(ScannerResource.class);
 
-  static final Map<String,ScannerInstanceResource> scanners = 
-    new HashMap<String,ScannerInstanceResource>();
+  static final Map<String,ScannerInstanceResource> scanners =
+   Collections.synchronizedMap(new HashMap<String,ScannerInstanceResource>());
 
   User user;
   String tableName;
@@ -69,16 +70,17 @@ public class ScannerResource implements 
   }
 
   static void delete(final String id) {
-    synchronized (scanners) {
-      ScannerInstanceResource instance = scanners.remove(id);
-      if (instance != null) {
-        instance.generator.close();
-      }
+    ScannerInstanceResource instance = scanners.remove(id);
+    if (instance != null) {
+      instance.generator.close();
     }
   }
 
   Response update(final ScannerModel model, final boolean replace, 
-      final UriInfo uriInfo) {
+      final UriInfo uriInfo) throws IOException {
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
+    }
     servlet.getMetrics().incrementRequests(1);
     byte[] endRow = model.hasEndRow() ? model.getEndRow() : null;
     RowSpec spec = new RowSpec(model.getStartRow(), endRow,
@@ -91,9 +93,7 @@ public class ScannerResource implements 
       ScannerInstanceResource instance = 
         new ScannerInstanceResource(user, actualTableName, id, gen, 
           model.getBatch());
-      synchronized (scanners) {
-        scanners.put(id, instance);
-      }
+      scanners.put(id, instance);
       if (LOG.isDebugEnabled()) {
         LOG.debug("new scanner: " + id);
       }
@@ -111,7 +111,7 @@ public class ScannerResource implements 
   @PUT
   @Consumes({MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF})
   public Response put(final ScannerModel model, 
-      final @Context UriInfo uriInfo) {
+      final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("PUT " + uriInfo.getAbsolutePath());
     }
@@ -121,7 +121,7 @@ public class ScannerResource implements 
   @POST
   @Consumes({MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF})
   public Response post(final ScannerModel model,
-      final @Context UriInfo uriInfo) {
+      final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("POST " + uriInfo.getAbsolutePath());
     }
@@ -131,13 +131,11 @@ public class ScannerResource implements 
   @Path("{scanner: .+}")
   public ScannerInstanceResource getScannerInstanceResource(
       final @PathParam("scanner") String id) {
-    synchronized (scanners) {
-      ScannerInstanceResource instance = scanners.get(id);
-      if (instance == null) {
-        throw new WebApplicationException(Response.Status.NOT_FOUND);
-      }
-      return instance;
+    ScannerInstanceResource instance = scanners.get(id);
+    if (instance == null) {
+      throw new WebApplicationException(Response.Status.NOT_FOUND);
     }
+    return instance;
   }
 
 }

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/SchemaResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/SchemaResource.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/SchemaResource.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/SchemaResource.java Tue Apr  6 07:24:50 2010
@@ -35,10 +35,12 @@ import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.core.Response.ResponseBuilder;
+
 import javax.xml.namespace.QName;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
+
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.TableExistsException;
@@ -46,7 +48,6 @@ import org.apache.hadoop.hbase.TableNotF
 import org.apache.hadoop.hbase.client.HBaseAdmin;
 import org.apache.hadoop.hbase.client.HTable;
 import org.apache.hadoop.hbase.client.HTablePool;
-import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.stargate.User;
 import org.apache.hadoop.hbase.stargate.model.ColumnSchemaModel;
 import org.apache.hadoop.hbase.stargate.model.TableSchemaModel;
@@ -89,31 +90,17 @@ public class SchemaResource implements C
 
   @GET
   @Produces({MIMETYPE_TEXT, MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF})
-  public Response get(final @Context UriInfo uriInfo) {
+  public Response get(final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("GET " + uriInfo.getAbsolutePath());
     }
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
+    }
     servlet.getMetrics().incrementRequests(1);
     try {
-      HTableDescriptor htd = getTableSchema();
-      TableSchemaModel model = new TableSchemaModel();
-      model.setName(tableName);
-      for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
-          htd.getValues().entrySet()) {
-        model.addAttribute(Bytes.toString(e.getKey().get()), 
-            Bytes.toString(e.getValue().get()));
-      }
-      for (HColumnDescriptor hcd: htd.getFamilies()) {
-        ColumnSchemaModel columnModel = new ColumnSchemaModel();
-        columnModel.setName(hcd.getNameAsString());
-        for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
-          hcd.getValues().entrySet()) {
-        columnModel.addAttribute(Bytes.toString(e.getKey().get()), 
-          Bytes.toString(e.getValue().get()));
-      }
-        model.addColumnFamily(columnModel);
-      }
-      ResponseBuilder response = Response.ok(model);
+      ResponseBuilder response =
+        Response.ok(new TableSchemaModel(getTableSchema()));
       response.cacheControl(cacheControl);
       return response.build();
     } catch (TableNotFoundException e) {
@@ -206,46 +193,52 @@ public class SchemaResource implements C
   @PUT
   @Consumes({MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF})
   public Response put(final TableSchemaModel model, 
-      final @Context UriInfo uriInfo) {
+      final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("PUT " + uriInfo.getAbsolutePath());
     }
-    servlet.getMetrics().incrementRequests(1);
-    // use the name given in the path, but warn if the name on the path and
-    // the name in the schema are different
-    if (model.getName() != tableName) {
-      LOG.warn("table name mismatch: path='" + tableName + "', schema='" +
-        model.getName() + "'");
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
     }
+    servlet.getMetrics().incrementRequests(1);
     return update(model, true, uriInfo);
   }
 
   @POST
   @Consumes({MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF})
   public Response post(final TableSchemaModel model, 
-      final @Context UriInfo uriInfo) {
+      final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("PUT " + uriInfo.getAbsolutePath());
     }
-    servlet.getMetrics().incrementRequests(1);
-    // use the name given in the path, but warn if the name on the path and
-    // the name in the schema are different
-    if (model.getName() != tableName) {
-      LOG.warn("table name mismatch: path='" + tableName + "', schema='" +
-        model.getName() + "'");
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
     }
+    servlet.getMetrics().incrementRequests(1);
     return update(model, false, uriInfo);
   }
 
   @DELETE
-  public Response delete(final @Context UriInfo uriInfo) {     
+  public Response delete(final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("DELETE " + uriInfo.getAbsolutePath());
     }
+    if (!servlet.userRequestLimit(user, 1)) {
+      return Response.status(509).build();
+    }
     servlet.getMetrics().incrementRequests(1);
     try {
       HBaseAdmin admin = new HBaseAdmin(servlet.getConfiguration());
-      admin.disableTable(actualTableName);
+      boolean success = false;
+      for (int i = 0; i < 10; i++) try {
+        admin.disableTable(actualTableName);
+        success = true;
+        break;
+      } catch (IOException e) {
+      }
+      if (!success) {
+        throw new IOException("could not disable table");
+      }
       admin.deleteTable(actualTableName);
       return Response.ok().build();
     } catch (TableNotFoundException e) {

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterStatusResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterStatusResource.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterStatusResource.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/StorageClusterStatusResource.java Tue Apr  6 07:24:50 2010
@@ -44,22 +44,27 @@ public class StorageClusterStatusResourc
   private static final Log LOG =
     LogFactory.getLog(StorageClusterStatusResource.class);
 
+  private User user;
   private CacheControl cacheControl;
   private RESTServlet servlet;
 
-  public StorageClusterStatusResource() throws IOException {
-    servlet = RESTServlet.getInstance();
-    cacheControl = new CacheControl();
-    cacheControl.setNoCache(true);
-    cacheControl.setNoTransform(false);
+  public StorageClusterStatusResource(User user) throws IOException {
+    this.user = user;
+    this.servlet = RESTServlet.getInstance();
+    this.cacheControl = new CacheControl();
+    this.cacheControl.setNoCache(true);
+    this.cacheControl.setNoTransform(false);
   }
 
   @GET
   @Produces({MIMETYPE_TEXT, MIMETYPE_XML, MIMETYPE_JSON, MIMETYPE_PROTOBUF})
-  public Response get(final @Context UriInfo uriInfo) {
+  public Response get(final @Context UriInfo uriInfo) throws IOException {
     if (LOG.isDebugEnabled()) {
       LOG.debug("GET " + uriInfo.getAbsolutePath());
     }
+    if (!servlet.userRequestLimit(user, 1)) {
+      Response.status(509).build();
+    }
     servlet.getMetrics().incrementRequests(1);
     try {
       HBaseAdmin admin = new HBaseAdmin(servlet.getConfiguration());

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/TableResource.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/TableResource.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/TableResource.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/TableResource.java Tue Apr  6 07:24:50 2010
@@ -40,6 +40,11 @@ public class TableResource implements Co
     this.table = table;
   }
 
+  @Path("exists")
+  public ExistsResource getExistsResource() throws IOException {
+    return new ExistsResource(user, table);
+  }
+
   @Path("regions")
   public RegionsResource getRegionsResource() throws IOException {
     return new RegionsResource(user, table);
@@ -66,4 +71,5 @@ public class TableResource implements Co
                   Response.Status.INTERNAL_SERVER_ERROR);
     }
   }
+
 }

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/User.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/User.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/User.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/User.java Tue Apr  6 07:24:50 2010
@@ -28,7 +28,7 @@ import org.apache.hadoop.hbase.util.Byte
 public class User implements Constants {
 
   public static final User DEFAULT_USER = new User("default",
-    "00000000000000000000000000000000", false, true);
+    "00000000000000000000000000000000", true, true);
 
   private String name;
   private String token;

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Client.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Client.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Client.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Client.java Tue Apr  6 07:24:50 2010
@@ -64,10 +64,13 @@ public class Client {
    */
   public Client(Cluster cluster) {
     this.cluster = cluster;
-    httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
-    HttpConnectionManagerParams managerParams =
-      httpClient.getHttpConnectionManager().getParams();
+    MultiThreadedHttpConnectionManager manager = 
+      new MultiThreadedHttpConnectionManager();
+    HttpConnectionManagerParams managerParams = manager.getParams();
     managerParams.setConnectionTimeout(2000); // 2 s
+    managerParams.setDefaultMaxConnectionsPerHost(10);
+    managerParams.setMaxTotalConnections(100);
+    this.httpClient = new HttpClient(manager);
     HttpClientParams clientParams = httpClient.getParams();
     clientParams.setVersion(HttpVersion.HTTP_1_1);
   }
@@ -106,7 +109,7 @@ public class Client {
     do {
       cluster.lastHost = cluster.nodes.get(i);
       try {
-        StringBuffer sb = new StringBuffer();
+        StringBuilder sb = new StringBuilder();
         sb.append("http://");
         sb.append(cluster.lastHost);
         sb.append(path);
@@ -200,10 +203,13 @@ public class Client {
   public Response head(Cluster cluster, String path, Header[] headers) 
       throws IOException {
     HeadMethod method = new HeadMethod();
-    int code = execute(cluster, method, null, path);
-    headers = method.getResponseHeaders();
-    method.releaseConnection();
-    return new Response(code, headers, null);
+    try {
+      int code = execute(cluster, method, null, path);
+      headers = method.getResponseHeaders();
+      return new Response(code, headers, null);
+    } finally {
+      method.releaseConnection();
+    }
   }
 
   /**
@@ -276,11 +282,14 @@ public class Client {
   public Response get(Cluster c, String path, Header[] headers) 
       throws IOException {
     GetMethod method = new GetMethod();
-    int code = execute(c, method, headers, path);
-    headers = method.getResponseHeaders();
-    byte[] body = method.getResponseBody();
-    method.releaseConnection();
-    return new Response(code, headers, body);
+    try {
+      int code = execute(c, method, headers, path);
+      headers = method.getResponseHeaders();
+      byte[] body = method.getResponseBody();
+      return new Response(code, headers, body);
+    } finally {
+      method.releaseConnection();
+    }
   }
 
   /**
@@ -339,12 +348,15 @@ public class Client {
   public Response put(Cluster cluster, String path, Header[] headers, 
       byte[] content) throws IOException {
     PutMethod method = new PutMethod();
-    method.setRequestEntity(new ByteArrayRequestEntity(content));
-    int code = execute(cluster, method, headers, path);
-    headers = method.getResponseHeaders();
-    content = method.getResponseBody();
-    method.releaseConnection();
-    return new Response(code, headers, content);
+    try {
+      method.setRequestEntity(new ByteArrayRequestEntity(content));
+      int code = execute(cluster, method, headers, path);
+      headers = method.getResponseHeaders();
+      content = method.getResponseBody();
+      return new Response(code, headers, content);
+    } finally {
+      method.releaseConnection();
+    }
   }
 
   /**
@@ -403,12 +415,15 @@ public class Client {
   public Response post(Cluster cluster, String path, Header[] headers, 
       byte[] content) throws IOException {
     PostMethod method = new PostMethod();
-    method.setRequestEntity(new ByteArrayRequestEntity(content));
-    int code = execute(cluster, method, headers, path);
-    headers = method.getResponseHeaders();
-    content = method.getResponseBody();
-    method.releaseConnection();
-    return new Response(code, headers, content);
+    try {
+      method.setRequestEntity(new ByteArrayRequestEntity(content));
+      int code = execute(cluster, method, headers, path);
+      headers = method.getResponseHeaders();
+      content = method.getResponseBody();
+      return new Response(code, headers, content);
+    } finally {
+      method.releaseConnection();
+    }
   }
 
   /**
@@ -430,9 +445,14 @@ public class Client {
    */
   public Response delete(Cluster cluster, String path) throws IOException {
     DeleteMethod method = new DeleteMethod();
-    int code = execute(cluster, method, null, path);
-    Header[] headers = method.getResponseHeaders();
-    method.releaseConnection();
-    return new Response(code, headers);
+    try {
+      int code = execute(cluster, method, null, path);
+      Header[] headers = method.getResponseHeaders();
+      byte[] content = method.getResponseBody();
+      return new Response(code, headers, content);
+    } finally {
+      method.releaseConnection();
+    }
   }
+
 }

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Cluster.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Cluster.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Cluster.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/Cluster.java Tue Apr  6 07:24:50 2010
@@ -47,6 +47,13 @@ public class Cluster {
   }
 
   /**
+   * @return true if no locations have been added, false otherwise
+   */
+  public boolean isEmpty() {
+    return nodes.isEmpty();
+  }
+
+  /**
    * Add a node to the cluster
    * @param node the service location in 'host:port' format
    */

Added: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/RemoteAdmin.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/RemoteAdmin.java?rev=931039&view=auto
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/RemoteAdmin.java (added)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/RemoteAdmin.java Tue Apr  6 07:24:50 2010
@@ -0,0 +1,187 @@
+/*
+ * Copyright 2010 The Apache Software Foundation
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hbase.stargate.client;
+
+import java.io.IOException;
+
+import org.apache.hadoop.hbase.HBaseConfiguration;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.stargate.Constants;
+import org.apache.hadoop.hbase.stargate.model.TableSchemaModel;
+import org.apache.hadoop.hbase.util.Bytes;
+
+public class RemoteAdmin {
+
+  final Client client;
+  final HBaseConfiguration conf;
+  final String accessToken;
+  final int maxRetries;
+  final long sleepTime;
+
+  /**
+   * Constructor
+   * @param client
+   * @param conf
+   */
+  public RemoteAdmin(Client client, HBaseConfiguration conf) {
+    this(client, conf, null);
+  }
+
+  /**
+   * Constructor
+   * @param client
+   * @param conf
+   * @param accessToken
+   */
+  public RemoteAdmin(Client client, HBaseConfiguration conf, String accessToken) {
+    this.client = client;
+    this.conf = conf;
+    this.accessToken = accessToken;
+    this.maxRetries = conf.getInt("stargate.client.max.retries", 10);
+    this.sleepTime = conf.getLong("stargate.client.sleep", 1000);
+  }
+
+  /**
+   * @param tableName name of table to check
+   * @return true if all regions of the table are available
+   * @throws IOException if a remote or network exception occurs
+   */
+  public boolean isTableAvailable(String tableName) throws IOException {
+    return isTableAvailable(Bytes.toBytes(tableName));
+  }
+
+  /**
+   * @param tableName name of table to check
+   * @return true if all regions of the table are available
+   * @throws IOException if a remote or network exception occurs
+   */
+  public boolean isTableAvailable(byte[] tableName) throws IOException {
+    StringBuilder sb = new StringBuilder();
+    sb.append('/');
+    if (accessToken != null) {
+      sb.append(accessToken);
+      sb.append('/');
+    }
+    sb.append(Bytes.toStringBinary(tableName));
+    sb.append('/');
+    sb.append("exists");
+    int code = 0;
+    for (int i = 0; i < maxRetries; i++) {
+      Response response = client.get(sb.toString());
+      code = response.getCode();
+      switch (code) {
+      case 200:
+        return true;
+      case 404:
+        return false;
+      case 509:
+        try {
+          Thread.sleep(sleepTime);
+        } catch (InterruptedException e) { }
+        break;
+      default:
+        throw new IOException("exists request returned " + code);
+      }
+    }
+    throw new IOException("exists request timed out");
+  }
+
+  /**
+   * Creates a new table.
+   * @param desc table descriptor for table
+   * @throws IOException if a remote or network exception occurs
+   */
+  public void createTable(HTableDescriptor desc)
+      throws IOException {
+    TableSchemaModel model = new TableSchemaModel(desc);
+    StringBuilder sb = new StringBuilder();
+    sb.append('/');
+    if (accessToken != null) {
+      sb.append(accessToken);
+      sb.append('/');
+    }
+    sb.append(Bytes.toStringBinary(desc.getName()));
+    sb.append('/');
+    sb.append("schema");
+    int code = 0;
+    for (int i = 0; i < maxRetries; i++) {
+      Response response = client.put(sb.toString(), Constants.MIMETYPE_PROTOBUF,
+        model.createProtobufOutput());
+      code = response.getCode();
+      switch (code) {
+      case 201:
+        return;
+      case 509:
+        try {
+          Thread.sleep(sleepTime);
+        } catch (InterruptedException e) { }
+        break;
+      default:
+        throw new IOException("create request returned " + code);
+      }
+    }
+    throw new IOException("create request timed out");
+  }
+
+  /**
+   * Deletes a table.
+   * @param tableName name of table to delete
+   * @throws IOException if a remote or network exception occurs
+   */
+  public void deleteTable(final String tableName) throws IOException {
+    deleteTable(Bytes.toBytes(tableName));
+  }
+
+  /**
+   * Deletes a table.
+   * @param tableName name of table to delete
+   * @throws IOException if a remote or network exception occurs
+   */
+  public void deleteTable(final byte [] tableName) throws IOException {
+    StringBuilder sb = new StringBuilder();
+    sb.append('/');
+    if (accessToken != null) {
+      sb.append(accessToken);
+      sb.append('/');
+    }
+    sb.append(Bytes.toStringBinary(tableName));
+    sb.append('/');
+    sb.append("schema");
+    int code = 0;
+    for (int i = 0; i < maxRetries; i++) { 
+      Response response = client.delete(sb.toString());
+      code = response.getCode();
+      switch (code) {
+      case 200:
+        return;
+      case 509:
+        try {
+          Thread.sleep(sleepTime);
+        } catch (InterruptedException e) { }
+        break;
+      default:
+        throw new IOException("delete request returned " + code);
+      }
+    }
+    throw new IOException("delete request timed out");
+  }
+
+}

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/RemoteHTable.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/RemoteHTable.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/RemoteHTable.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/client/RemoteHTable.java Tue Apr  6 07:24:50 2010
@@ -29,15 +29,12 @@ import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
 
-import javax.xml.namespace.QName;
-
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
 import org.apache.hadoop.util.StringUtils;
 
 import org.apache.hadoop.hbase.HBaseConfiguration;
-import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HTableDescriptor;
 import org.apache.hadoop.hbase.KeyValue;
@@ -52,7 +49,6 @@ import org.apache.hadoop.hbase.io.TimeRa
 import org.apache.hadoop.hbase.stargate.Constants;
 import org.apache.hadoop.hbase.stargate.model.CellModel;
 import org.apache.hadoop.hbase.stargate.model.CellSetModel;
-import org.apache.hadoop.hbase.stargate.model.ColumnSchemaModel;
 import org.apache.hadoop.hbase.stargate.model.RowModel;
 import org.apache.hadoop.hbase.stargate.model.ScannerModel;
 import org.apache.hadoop.hbase.stargate.model.TableSchemaModel;
@@ -65,11 +61,13 @@ public class RemoteHTable {
 
   private static final Log LOG = LogFactory.getLog(RemoteHTable.class);
 
-  Client client;
-  HBaseConfiguration conf;
-  byte[] name;
-  String accessToken;
-  
+  final Client client;
+  final HBaseConfiguration conf;
+  final byte[] name;
+  final String accessToken;
+  final int maxRetries;
+  final long sleepTime;
+
   @SuppressWarnings("unchecked")
   protected String buildRowSpec(final byte[] row, final Map familyMap, 
       final long startTime, final long endTime, final int maxVersions) {
@@ -208,6 +206,8 @@ public class RemoteHTable {
     this.conf = conf;
     this.name = name;
     this.accessToken = accessToken;
+    this.maxRetries = conf.getInt("stargate.client.max.retries", 10);
+    this.sleepTime = conf.getLong("stargate.client.sleep", 1000);
   }
 
   public byte[] getTableName() {
@@ -228,24 +228,24 @@ public class RemoteHTable {
     sb.append(Bytes.toStringBinary(name));
     sb.append('/');
     sb.append("schema");
-    Response response = client.get(sb.toString(), Constants.MIMETYPE_PROTOBUF);
-    if (response.getCode() != 200) {
-      throw new IOException("schema request returned " + response.getCode());
-    }
-    TableSchemaModel schema = new TableSchemaModel();
-    schema.getObjectFromMessage(response.getBody());
-    HTableDescriptor htd = new HTableDescriptor(schema.getName());
-    for (Map.Entry<QName, Object> e: schema.getAny().entrySet()) {
-      htd.setValue(e.getKey().getLocalPart(), e.getValue().toString());
-    }
-    for (ColumnSchemaModel column: schema.getColumns()) {
-      HColumnDescriptor hcd = new HColumnDescriptor(column.getName());
-      for (Map.Entry<QName, Object> e: column.getAny().entrySet()) {
-        hcd.setValue(e.getKey().getLocalPart(), e.getValue().toString());
+    for (int i = 0; i < maxRetries; i++) {
+      Response response = client.get(sb.toString(), Constants.MIMETYPE_PROTOBUF);
+      int code = response.getCode();
+      switch (code) {
+      case 200:
+        TableSchemaModel schema = new TableSchemaModel();
+        schema.getObjectFromMessage(response.getBody());
+        return schema.getTableDescriptor();
+      case 509: 
+        try {
+          Thread.sleep(sleepTime);
+        } catch (InterruptedException e) { }
+        break;
+      default:
+        throw new IOException("schema request returned " + code);
       }
-      htd.addFamily(hcd);
     }
-    return htd;
+    throw new IOException("schema request timed out");
   }
 
   public void close() throws IOException {
@@ -259,24 +259,33 @@ public class RemoteHTable {
     if (get.getFilter() != null) {
       LOG.warn("filters not supported on gets");
     }
-    Response response = client.get(spec, Constants.MIMETYPE_PROTOBUF);
-    int code = response.getCode();
-    if (code == 404) {
-      return new Result();
-    }
-    if (code != 200) {
-      throw new IOException("get request returned " + code);
-    }
-    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 + ")");
+    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 + ")");
+          }
+          return results[0];
+        }
+        // fall through
+      case 404:
+        return new Result();
+      case 509:
+        try {
+          Thread.sleep(sleepTime);
+        } catch (InterruptedException e) { }
+        break;
+      default:
+        throw new IOException("get request returned " + code);
       }
-      return results[0];
     }
-    return new Result();
+    throw new IOException("get request timed out");
   }
 
   public boolean exists(Get get) throws IOException {
@@ -296,11 +305,23 @@ public class RemoteHTable {
     sb.append(Bytes.toStringBinary(name));
     sb.append('/');
     sb.append(Bytes.toStringBinary(put.getRow()));
-    Response response = client.put(sb.toString(), Constants.MIMETYPE_PROTOBUF,
-      model.createProtobufOutput());
-    if (response.getCode() != 200) {
-      throw new IOException("put failed with " + response.getCode());
+    for (int i = 0; i < maxRetries; i++) {
+      Response response = client.put(sb.toString(), Constants.MIMETYPE_PROTOBUF,
+        model.createProtobufOutput());
+      int code = response.getCode();
+      switch (code) {
+      case 200:
+        return;
+      case 509:
+        try {
+          Thread.sleep(sleepTime);
+        } catch (InterruptedException e) { }
+        break;
+      default:
+        throw new IOException("put request failed with " + code);
+      }
     }
+    throw new IOException("put request timed out");
   }
 
   public void put(List<Put> puts) throws IOException {
@@ -341,20 +362,44 @@ public class RemoteHTable {
     }
     sb.append(Bytes.toStringBinary(name));
     sb.append("/$multiput"); // can be any nonexistent row
-    Response response = client.put(sb.toString(), Constants.MIMETYPE_PROTOBUF,
-      model.createProtobufOutput());
-    if (response.getCode() != 200) {
-      throw new IOException("multiput failed with " + response.getCode());
+    for (int i = 0; i < maxRetries; i++) {
+      Response response = client.put(sb.toString(), Constants.MIMETYPE_PROTOBUF,
+        model.createProtobufOutput());
+      int code = response.getCode();
+      switch (code) {
+      case 200:
+        return;
+      case 509:
+        try {
+          Thread.sleep(sleepTime);
+        } catch (InterruptedException e) { }
+        break;
+      default:
+        throw new IOException("multiput request failed with " + code);
+      }
     }
+    throw new IOException("multiput request timed out");
   }
 
   public void delete(Delete delete) throws IOException {
     String spec = buildRowSpec(delete.getRow(), delete.getFamilyMap(),
       delete.getTimeStamp(), delete.getTimeStamp(), 1);
-    Response response = client.delete(spec);
-    if (response.getCode() != 200) {
-      throw new IOException("delete() returned " + response.getCode());
+    for (int i = 0; i < maxRetries; i++) {
+      Response response = client.delete(spec);
+      int code = response.getCode();
+      switch (code) {
+      case 200:
+        return;
+      case 509:
+        try {
+          Thread.sleep(sleepTime);
+        } catch (InterruptedException e) { }
+        break;
+      default:
+        throw new IOException("delete request failed with " + code);
+      }
     }
+    throw new IOException("delete request timed out");
   }
 
   public void delete(List<Delete> deletes) throws IOException {
@@ -372,6 +417,12 @@ public class RemoteHTable {
     String uri;
 
     public Scanner(Scan scan) throws IOException {
+      ScannerModel model;
+      try {
+        model = ScannerModel.fromScan(scan);
+      } catch (Exception e) {
+        throw new IOException(e);
+      }
       StringBuffer sb = new StringBuffer();
       sb.append('/');
       if (accessToken != null) {
@@ -381,18 +432,24 @@ public class RemoteHTable {
       sb.append(Bytes.toStringBinary(name));
       sb.append('/');
       sb.append("scanner");
-      try {
-        ScannerModel model = ScannerModel.fromScan(scan);
+      for (int i = 0; i < maxRetries; i++) {
         Response response = client.post(sb.toString(),
           Constants.MIMETYPE_PROTOBUF, model.createProtobufOutput());
-        if (response.getCode() != 201) {
-          throw new IOException("scan request failed with " +
-            response.getCode());
+        int code = response.getCode();
+        switch (code) {
+        case 201:
+          uri = response.getLocation();
+          return;
+        case 509:
+          try {
+            Thread.sleep(sleepTime);
+          } catch (InterruptedException e) { }
+          break;
+        default:
+          throw new IOException("scan request failed with " + code);
         }
-        uri = response.getLocation();
-      } catch (Exception e) {
-        throw new IOException(e);
       }
+      throw new IOException("scan request timed out");
     }
 
     @Override
@@ -400,18 +457,28 @@ public class RemoteHTable {
       StringBuilder sb = new StringBuilder(uri);
       sb.append("?n=");
       sb.append(nbRows);
-      Response response = client.get(sb.toString(),
-        Constants.MIMETYPE_PROTOBUF);
-      if (response.getCode() == 206) {
-        return null;
-      }
-      if (response.getCode() != 200) {
-        LOG.error("scanner.next failed with " + response.getCode());
-        return null;
+      for (int i = 0; i < maxRetries; i++) {
+        Response response = client.get(sb.toString(),
+          Constants.MIMETYPE_PROTOBUF);
+        int code = response.getCode();
+        switch (code) {
+        case 200:
+          CellSetModel model = new CellSetModel();
+          model.getObjectFromMessage(response.getBody());
+          return buildResultFromModel(model);
+        case 204:
+        case 206:
+          return null;
+        case 509:
+          try {
+            Thread.sleep(sleepTime);
+          } catch (InterruptedException e) { }
+          break;
+        default:
+          throw new IOException("scanner.next request failed with " + code);
+        }
       }
-      CellSetModel model = new CellSetModel();
-      model.getObjectFromMessage(response.getBody());
-      return buildResultFromModel(model);
+      throw new IOException("scanner.next request timed out");
     }
 
     @Override

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableRegionModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableRegionModel.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableRegionModel.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableRegionModel.java Tue Apr  6 07:24:50 2010
@@ -65,6 +65,18 @@ public class TableRegionModel implements
    * @param id the encoded id of the region
    * @param startKey the start key of the region
    * @param endKey the end key of the region
+   */
+  public TableRegionModel(String table, long id, byte[] startKey,
+      byte[] endKey) {
+    this(table, id, startKey, endKey, null);
+  }
+
+  /**
+   * Constructor
+   * @param table the table name
+   * @param id the encoded id of the region
+   * @param startKey the start key of the region
+   * @param endKey the end key of the region
    * @param location the name and port of the region server hosting the region
    */
   public TableRegionModel(String table, long id, byte[] startKey,
@@ -173,8 +185,10 @@ public class TableRegionModel implements
     sb.append(Bytes.toString(startKey));
     sb.append("'\n  endKey='");
     sb.append(Bytes.toString(endKey));
-    sb.append("'\n  location='");
-    sb.append(location);
+    if (location != null) {
+      sb.append("'\n  location='");
+      sb.append(location);
+    }
     sb.append("'\n]\n");
     return sb.toString();
   }

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableSchemaModel.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableSchemaModel.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableSchemaModel.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/model/TableSchemaModel.java Tue Apr  6 07:24:50 2010
@@ -38,9 +38,11 @@ import javax.xml.namespace.QName;
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
 import org.apache.hadoop.hbase.stargate.ProtobufMessageHandler;
 import org.apache.hadoop.hbase.stargate.protobuf.generated.ColumnSchemaMessage.ColumnSchema;
 import org.apache.hadoop.hbase.stargate.protobuf.generated.TableSchemaMessage.TableSchema;
+import org.apache.hadoop.hbase.util.Bytes;
 
 /**
  * A representation of HBase table descriptors.
@@ -78,6 +80,29 @@ public class TableSchemaModel implements
   public TableSchemaModel() {}
 
   /**
+   * Constructor
+   * @param htd the table descriptor
+   */
+  public TableSchemaModel(HTableDescriptor htd) {
+    setName(htd.getNameAsString());
+    for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
+        htd.getValues().entrySet()) {
+      addAttribute(Bytes.toString(e.getKey().get()), 
+        Bytes.toString(e.getValue().get()));
+    }
+    for (HColumnDescriptor hcd: htd.getFamilies()) {
+      ColumnSchemaModel columnModel = new ColumnSchemaModel();
+      columnModel.setName(hcd.getNameAsString());
+      for (Map.Entry<ImmutableBytesWritable, ImmutableBytesWritable> e:
+          hcd.getValues().entrySet()) {
+        columnModel.addAttribute(Bytes.toString(e.getKey().get()), 
+            Bytes.toString(e.getValue().get()));
+      }
+      addColumnFamily(columnModel);
+    }
+  }
+
+  /**
    * Add an attribute to the table descriptor
    * @param name attribute name
    * @param value attribute value
@@ -308,4 +333,23 @@ public class TableSchemaModel implements
     }
     return this;
   }
+
+  /**
+   * @return a table descriptor
+   */
+  public HTableDescriptor getTableDescriptor() {
+    HTableDescriptor htd = new HTableDescriptor(getName());
+    for (Map.Entry<QName, Object> e: getAny().entrySet()) {
+      htd.setValue(e.getKey().getLocalPart(), e.getValue().toString());
+    }
+    for (ColumnSchemaModel column: getColumns()) {
+      HColumnDescriptor hcd = new HColumnDescriptor(column.getName());
+      for (Map.Entry<QName, Object> e: column.getAny().entrySet()) {
+        hcd.setValue(e.getKey().getLocalPart(), e.getValue().toString());
+      }
+      htd.addFamily(hcd);
+    }
+    return htd;
+  }
+
 }

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/util/HTableTokenBucket.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/util/HTableTokenBucket.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/util/HTableTokenBucket.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/util/HTableTokenBucket.java Tue Apr  6 07:24:50 2010
@@ -70,7 +70,7 @@ public class HTableTokenBucket implement
   HTable table;
   byte[] row;
   int tokens;
-  double rate = 10.0; // default, 10 ops added per second
+  double rate = 20.0; // default, 20 ops added per second
   int size = 100;     // burst
   long lastUpdated = System.currentTimeMillis();
   long configUpdateInterval;

Modified: hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/util/UserData.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/util/UserData.java?rev=931039&r1=931038&r2=931039&view=diff
==============================================================================
--- hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/util/UserData.java (original)
+++ hadoop/hbase/branches/0.20/src/contrib/stargate/src/java/org/apache/hadoop/hbase/stargate/util/UserData.java Tue Apr  6 07:24:50 2010
@@ -20,46 +20,32 @@
 
 package org.apache.hadoop.hbase.stargate.util;
 
-import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
 
 /**
  * Generic storage for per user information.
  */
 public class UserData {
 
-  public static final int TOKENBUCKET = 0;
+  public static final int TOKENBUCKET = 1;
 
-  ArrayList<Object> data = new ArrayList<Object>();
+  Map<Integer,Object> data = new HashMap<Integer,Object>(1);
 
   public synchronized boolean has(final int sel) {
-    try {
-      return data.get(sel) != null;
-    } catch (IndexOutOfBoundsException e) {
-      return false;
-    }
+    return data.get(sel) != null;
   }
 
   public synchronized Object get(final int sel) {
-    try {
-      return data.get(sel);
-    } catch (IndexOutOfBoundsException e) {
-      return null;
-    }
+    return data.get(sel);
   }
 
   public synchronized Object put(final int sel, final Object o) {
-    Object old = null;
-    try {
-      old = data.get(sel);
-    } catch (IndexOutOfBoundsException e) {
-      // do nothing
-    }
-    data.set(sel, o);
-    return old;
+    return data.put(sel, o);
   }
 
   public synchronized Object remove(int sel) {
-    return put(sel, null);
+    return remove(sel);
   }
 
 }