You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by st...@apache.org on 2007/12/05 08:28:01 UTC

svn commit: r601232 - in /lucene/hadoop/trunk/src/contrib/hbase: ./ src/java/org/apache/hadoop/hbase/rest/

Author: stack
Date: Tue Dec  4 23:27:59 2007
New Revision: 601232

URL: http://svn.apache.org/viewvc?rev=601232&view=rev
Log:
HADOOP-2347 REST servlet not thread safe but run in a threaded manner

Modified:
    lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt
    lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/Dispatcher.java
    lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/GenericHandler.java
    lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/MetaHandler.java
    lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/ScannerHandler.java
    lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/TableHandler.java

Modified: lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt?rev=601232&r1=601231&r2=601232&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/CHANGES.txt Tue Dec  4 23:27:59 2007
@@ -56,6 +56,8 @@
                (Bryan Duxbury via Stack)
    HADOOP-2332 Meta table data selection in Hbase Shell
                (Edward Yoon via Stack)
+   HADOOP-2347 REST servlet not thread safe but run in a threaded manner
+               (Bryan Duxbury via Stack)
 
   IMPROVEMENTS
    HADOOP-2401 Add convenience put method that takes writable

Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/Dispatcher.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/Dispatcher.java?rev=601232&r1=601231&r2=601232&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/Dispatcher.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/Dispatcher.java Tue Dec  4 23:27:59 2007
@@ -61,9 +61,6 @@
  */
 public class Dispatcher extends javax.servlet.http.HttpServlet
 implements javax.servlet.Servlet {
-  
-  private static final long serialVersionUID = 1045003206345359301L;
-  
   private MetaHandler metaHandler;
   private TableHandler tableHandler;
   private ScannerHandler scannerHandler;

Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/GenericHandler.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/GenericHandler.java?rev=601232&r1=601231&r2=601232&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/GenericHandler.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/GenericHandler.java Tue Dec  4 23:27:59 2007
@@ -44,12 +44,8 @@
  * REST handler types take advantage of.
  */
 public abstract class GenericHandler {
-
-  protected static final long serialVersionUID = 6939910503474376143L;
-  
   protected HBaseConfiguration conf;
   protected HBaseAdmin admin;
-  protected HTable table = null;
 
   protected static final String ACCEPT = "accept";
   protected static final String COLUMN = "column";
@@ -255,16 +251,10 @@
     }  
   }
  
-  protected void focusTable(final String tableName) throws IOException {
-    // Do we have an HTable instance to suit?  TODO, keep a pool of
-    // instances of HTable. For now, allocate a new one each time table
-    // focus changes.
-    if (this.table == null ||
-        !this.table.getTableName().toString().equals(tableName)) {
-      if (this.table != null) {
-        this.table.close();
-      }
-      this.table = new HTable(this.conf, new Text(tableName));
-    }
+  /*
+   * Get an HTable instance by it's table name.
+   */
+  protected HTable getTable(final String tableName) throws IOException {
+    return new HTable(this.conf, new Text(tableName));
   }
 }

Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/MetaHandler.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/MetaHandler.java?rev=601232&r1=601231&r2=601232&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/MetaHandler.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/MetaHandler.java Tue Dec  4 23:27:59 2007
@@ -44,7 +44,7 @@
   }
    
    
-   public void doGet(HttpServletRequest request, HttpServletResponse response, 
+  public void doGet(HttpServletRequest request, HttpServletResponse response, 
     String[] pathSegments)
   throws ServletException, IOException {
     getTables(request, response);
@@ -77,6 +77,7 @@
     final HttpServletResponse response)
   throws IOException {
     HTableDescriptor [] tables = this.admin.listTables();
+
     switch (ContentType.getContentType(request.getHeader(ACCEPT))) {
       case XML:
         setResponseHeader(response, tables.length > 0? 200: 204,

Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/ScannerHandler.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/ScannerHandler.java?rev=601232&r1=601231&r2=601232&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/ScannerHandler.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/ScannerHandler.java Tue Dec  4 23:27:59 2007
@@ -31,6 +31,7 @@
 import javax.servlet.http.HttpServletResponse;
 
 import org.apache.hadoop.hbase.HBaseAdmin;
+import org.apache.hadoop.hbase.HTable;
 import org.apache.hadoop.hbase.HBaseConfiguration;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HScannerInterface;
@@ -248,8 +249,8 @@
   private void openScanner(final HttpServletRequest request,
       final HttpServletResponse response, final String [] pathSegments)
   throws IOException, ServletException {
-    // focus on the table
-    focusTable(getTableName(pathSegments));
+    // get the table
+    HTable table = getTable(getTableName(pathSegments));
     
     // get the list of columns we're supposed to interact with
     String[] raw_columns = request.getParameterValues(COLUMN);
@@ -284,8 +285,8 @@
         HConstants.UTF8_ENCODING));
 
     HScannerInterface scanner = (request.getParameter(END_ROW) == null)?
-       this.table.obtainScanner(columns, startRow):
-       this.table.obtainScanner(columns, startRow, endRow);
+       table.obtainScanner(columns, startRow):
+       table.obtainScanner(columns, startRow, endRow);
     
     // Make a scanner id by hashing the object toString value (object name +
     // an id).  Will make identifier less burdensome and more url friendly.

Modified: lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/TableHandler.java
URL: http://svn.apache.org/viewvc/lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/TableHandler.java?rev=601232&r1=601231&r2=601232&view=diff
==============================================================================
--- lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/TableHandler.java (original)
+++ lucene/hadoop/trunk/src/contrib/hbase/src/java/org/apache/hadoop/hbase/rest/TableHandler.java Tue Dec  4 23:27:59 2007
@@ -38,6 +38,7 @@
 import org.apache.hadoop.hbase.HColumnDescriptor;
 import org.apache.hadoop.hbase.HConstants;
 import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.HTable;
 import org.apache.hadoop.io.Text;
 import org.mortbay.servlet.MultiPartResponse;
 import org.w3c.dom.Document;
@@ -67,14 +68,14 @@
       getTableMetadata(request, response, pathSegments[0]);
     }
     else{
-      focusTable(pathSegments[0]);
+      HTable table = getTable(pathSegments[0]);
       if (pathSegments[1].toLowerCase().equals(REGIONS)) {
         // get a region list
-        getTableRegions(request, response);
+        getTableRegions(table, request, response);
       }
       else if (pathSegments[1].toLowerCase().equals(ROW)) {
         // get a row
-        getRow(request, response, pathSegments);
+        getRow(table, request, response, pathSegments);
       }
       else{
         doNotFound(response, "Not handled in TableHandler");
@@ -108,7 +109,7 @@
    * @throws IOException
    * Retrieve a row in one of several output formats.
    */
-  private void getRow(final HttpServletRequest request,
+  private void getRow(HTable table, final HttpServletRequest request,
     final HttpServletResponse response, final String [] pathSegments)
   throws IOException {
     // pull the row key out of the path
@@ -132,8 +133,8 @@
 
       // Presumption is that this.table has already been focused on target table.
       Map<Text, byte[]> result = timestampStr == null ? 
-        this.table.getRow(new Text(row)) 
-        : this.table.getRow(new Text(row), Long.parseLong(timestampStr));
+        table.getRow(new Text(row)) 
+        : table.getRow(new Text(row), Long.parseLong(timestampStr));
         
       if (result == null || result.size() == 0) {
         doNotFound(response, "Row not found!");
@@ -151,7 +152,7 @@
         }
       }
     } else {
-       Map<Text, byte[]> prefiltered_result = this.table.getRow(new Text(row));
+      Map<Text, byte[]> prefiltered_result = table.getRow(new Text(row));
     
       if (prefiltered_result == null || prefiltered_result.size() == 0) {
         doNotFound(response, "Row not found!");
@@ -243,13 +244,14 @@
   private void putRow(final HttpServletRequest request,
     final HttpServletResponse response, final String [] pathSegments)
   throws IOException, ServletException {
-    focusTable(pathSegments[0]);
+    HTable table = getTable(pathSegments[0]);
+    
     switch(ContentType.getContentType(request.getHeader(CONTENT_TYPE))) {
       case XML:
-        putRowXml(request, response, pathSegments);
+        putRowXml(table, request, response, pathSegments);
         break;
       case MIME:
-        doNotAcceptable(response);
+        doNotAcceptable(response, "Don't support multipart/related yet...");
         break;
       default:
         doNotAcceptable(response, "Unsupported Accept Header Content: " +
@@ -263,7 +265,7 @@
    * @param pathSegments
    * Decode supplied XML and do a put to Hbase.
    */
-  private void putRowXml(final HttpServletRequest request,
+  private void putRowXml(HTable table, final HttpServletRequest request,
     final HttpServletResponse response, final String [] pathSegments)
   throws IOException, ServletException{
 
@@ -291,7 +293,7 @@
     try{
       // start an update
       Text key = new Text(pathSegments[2]);
-      lock_id = this.table.startUpdate(key);
+      lock_id = table.startUpdate(key);
 
       // set the columns from the xml
       NodeList columns = doc.getElementsByTagName("column");
@@ -310,15 +312,15 @@
         byte[] value = org.apache.hadoop.hbase.util.Base64.decode(value_node.getFirstChild().getNodeValue());
 
         // put the value
-        this.table.put(lock_id, name, value);
+        table.put(lock_id, name, value);
       }
 
       // commit the update
       if (timestamp != null) {
-        this.table.commit(lock_id, Long.parseLong(timestamp));
+        table.commit(lock_id, Long.parseLong(timestamp));
       }
       else{
-        this.table.commit(lock_id);      
+        table.commit(lock_id);      
       }
 
       // respond with a 200
@@ -326,7 +328,7 @@
     }
     catch(Exception e){
       if (lock_id != -1) {
-        this.table.abort(lock_id);
+        table.abort(lock_id);
       }
       throw new ServletException(e);
     }
@@ -337,11 +339,11 @@
    * @param request
    * @param response
    */
-  private void getTableRegions(final HttpServletRequest request,
-      final HttpServletResponse response)
+  private void getTableRegions(HTable table, final HttpServletRequest request,
+    final HttpServletResponse response)
   throws IOException {
     // Presumption is that this.table has already been focused on target table.
-    Text [] startKeys = this.table.getStartKeys();
+    Text [] startKeys = table.getStartKeys();
     // Presumption is that this.table has already been set against target table
     switch (ContentType.getContentType(request.getHeader(ACCEPT))) {
       case XML:
@@ -445,7 +447,7 @@
     final HttpServletResponse response, final String [] pathSegments)
   throws IOException, ServletException {
     // grab the table we're operating on
-    focusTable(getTableName(pathSegments));
+    HTable table = getTable(getTableName(pathSegments));
     
     Text key = new Text(pathSegments[2]);
 
@@ -465,7 +467,7 @@
       } else{
         // delete each column in turn      
         for(int i = 0; i < columns.length; i++){
-          this.table.deleteAll(key, new Text(columns[i]));
+          table.deleteAll(key, new Text(columns[i]));
         }
       }
       response.setStatus(202);