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;