You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ns...@apache.org on 2011/10/11 04:11:15 UTC

svn commit: r1181467 - in /hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase: client/MultiPut.java client/Put.java regionserver/HRegionServer.java

Author: nspiegelberg
Date: Tue Oct 11 02:11:15 2011
New Revision: 1181467

URL: http://svn.apache.org/viewvc?rev=1181467&view=rev
Log:
enhance debugability of slow puts

Summary:
put/multiput from client ends up as a multiput() on server side. However,
MultiPut() doesn't implement a toString() method. So the slow response log is
something like:

 (responseTooSlow) multiPut(org.apache.hadoop.hbase.client.MultiPut@30943653)
from 10.47.56.33:33642: Size: 70.0: Time (ms): 2064

Improve it so that we get some insight into the offending KeyValue(s).

With the fix, the output will be something like:

(responseTooSlow) multiPut(#regions:1 {#puts:1 {row=row, families={(family=cf1,
keyvalues=(row/cf1:cf1-col/8/Put/vlen=2500000), (family=cf2,
keyvalues=(row/cf2:cf2-col/8/Put/vlen=2500000)}}}) from
10.47.56.33:40074: Size: 70.0: Time (ms): 1240

Test Plan:
ran some local tests to trigger the logging. Also running unit tests.

DiffCamp Revision: 194453
Reviewed By: jgray
Reviewers: jgray, nspiegelberg, kranganathan
Commenters: nspiegelberg
CC: jgray, nspiegelberg, kannan, hbase@lists
Revert Plan:
OK

Modified:
    hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/client/MultiPut.java
    hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/client/Put.java
    hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java

Modified: hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/client/MultiPut.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/client/MultiPut.java?rev=1181467&r1=1181466&r2=1181467&view=diff
==============================================================================
--- hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/client/MultiPut.java (original)
+++ hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/client/MultiPut.java Tue Oct 11 02:11:15 2011
@@ -80,6 +80,25 @@ public class MultiPut implements Writabl
     return res;
   }
 
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+
+    sb.append("#regions:" + puts.size() + " {");
+    for (List<Put> items : puts.values()) {
+      sb.append("#puts:" + items.size() + " <");
+      for (Put p : items) {
+        sb.append(p.toStringMax(4096));
+        if (sb.length() > 4096 * 2) {
+          sb.append("....<output truncated>...");
+          return sb.toString();
+        }
+      }
+      sb.append(">");
+    }
+    sb.append("}");
+    return sb.toString();
+  }
 
   @Override
   public void write(DataOutput out) throws IOException {

Modified: hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/client/Put.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/client/Put.java?rev=1181467&r1=1181466&r2=1181467&view=diff
==============================================================================
--- hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/client/Put.java (original)
+++ hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/client/Put.java Tue Oct 11 02:11:15 2011
@@ -408,10 +408,10 @@ public class Put implements HeapSize, Wr
   }
 
   /**
+   * Truncate output buffer at suggested max size.
    * @return String
    */
-  @Override
-  public String toString() {
+  public String toStringMax(int suggestedMaxSize) {
     StringBuilder sb = new StringBuilder();
     sb.append("row=");
     sb.append(Bytes.toString(this.row));
@@ -434,6 +434,10 @@ public class Put implements HeapSize, Wr
           moreThanOneB = true;
         }
         sb.append(kv.toString());
+        if (sb.length() > suggestedMaxSize) {
+          sb.append("...<output truncated>...");
+          return sb.toString();
+        }
       }
       sb.append(")");
     }
@@ -441,6 +445,14 @@ public class Put implements HeapSize, Wr
     return sb.toString();
   }
 
+  /**
+   * @return String
+   */
+  @Override
+  public String toString() {
+    return toStringMax(Integer.MAX_VALUE);
+  }
+
   public int compareTo(Row p) {
     return Bytes.compareTo(this.getRow(), p.getRow());
   }

Modified: hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=1181467&r1=1181466&r2=1181467&view=diff
==============================================================================
--- hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Tue Oct 11 02:11:15 2011
@@ -2374,11 +2374,23 @@ public class HRegionServer implements HR
     MultiPutResponse resp = new MultiPutResponse();
 
     // do each region as it's own.
+    int size = puts.puts.size();
+    int index = 0;
     for( Map.Entry<byte[], List<Put>> e: puts.puts.entrySet()) {
       int result = put(e.getKey(), e.getValue());
       resp.addResult(e.getKey(), result);
 
-      e.getValue().clear(); // clear some RAM
+      index++;
+      if (index < size) {
+        // clear each regions list of Puts to save RAM except for the
+        // last one. We will lose the reference to the last one pretty
+        // soon anyway; keep it for a little more, until we get back
+        // to HBaseServer level, where we might need to pretty print
+        // the MultiPut request for debugging slow/large puts.
+        // Note: A single row "put" from client also end up in server
+        // as a multiPut().
+        e.getValue().clear(); // clear some RAM
+      }
     }
 
     return resp;