commit c1cd9356cc0dcff654e9ac2a0c6470cc3b3710fa Author: Ryan Rawson Date: Fri Sep 10 16:33:21 2010 -0700 HBASE-2986: Multi can NPE in writable when entire region fails, eg: due to a split diff --git a/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java b/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java index f1fa836..7efc7fc 100644 --- a/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java +++ b/src/main/java/org/apache/hadoop/hbase/client/HConnectionManager.java @@ -1128,9 +1128,8 @@ public class HConnectionManager { for (Entry>> e : resp.getResults().entrySet()) { byte[] regionName = e.getKey(); List> regionResults = e.getValue(); - for (int i = 0; i < regionResults.size(); i++) { - Pair regionResult = regionResults.get(i); - if (regionResult.getSecond() == null) { + for (Pair regionResult : regionResults) { + if (regionResult == null) { // failed LOG.debug("Failures for region: " + Bytes.toStringBinary(regionName) + ", removing from cache"); } else { diff --git a/src/main/java/org/apache/hadoop/hbase/client/MultiResponse.java b/src/main/java/org/apache/hadoop/hbase/client/MultiResponse.java index 60008b1..b3a20ee 100644 --- a/src/main/java/org/apache/hadoop/hbase/client/MultiResponse.java +++ b/src/main/java/org/apache/hadoop/hbase/client/MultiResponse.java @@ -61,7 +61,7 @@ public class MultiResponse implements Writable { /** * Add the pair to the container, grouped by the regionName - * + * * @param regionName * @param r * First item in the pair is the original index of the Action @@ -89,8 +89,12 @@ public class MultiResponse implements Writable { List> lst = e.getValue(); out.writeInt(lst.size()); for (Pair r : lst) { - out.writeInt(r.getFirst()); - HbaseObjectWritable.writeObject(out, r.getSecond(), Result.class, null); + if (r == null) { + out.writeInt(-1); // cant have index -1 + } else { + out.writeInt(r.getFirst()); // this can npe!?! + HbaseObjectWritable.writeObject(out, r.getSecond(), Result.class, null); + } } } } @@ -106,8 +110,12 @@ public class MultiResponse implements Writable { listSize); for (int j = 0; j < listSize; j++) { Integer idx = in.readInt(); - Result r = (Result) HbaseObjectWritable.readObject(in, null); - lst.add(new Pair(idx, r)); + if (idx == -1) { + lst.add(null); + } else { + Result r = (Result) HbaseObjectWritable.readObject(in, null); + lst.add(new Pair(idx, r)); + } } results.put(key, lst); }