From 83c2de2575dbbecbe4530af36a34218786cdd7e8 Mon Sep 17 00:00:00 2001 From: Andrew Purtell Date: Tue, 23 Sep 2014 13:12:05 -0700 Subject: [PATCH] Amend HBASE-12023 HRegion.applyFamilyMapToMemstore creates too many iterator objects; More cases (Vladimir Rodionov) --- .../hadoop/hbase/regionserver/HRegion.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 94cc5b2dd5f..1b74cab34ce 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -2181,9 +2181,12 @@ public class HRegion implements HeapSize { // , Writable{ byte[] family = e.getKey(); List cells = e.getValue(); - Map kvCount = new TreeMap(Bytes.BYTES_COMPARATOR); + assert cells instanceof RandomAccess; - for (Cell cell: cells) { + Map kvCount = new TreeMap(Bytes.BYTES_COMPARATOR); + int listSize = cells.size(); + for (int i=0; i < listSize; i++) { + Cell cell = cells.get(i); KeyValue kv = KeyValueUtil.ensureKeyValue(cell); // Check if time is LATEST, change to time of most recent addition if so // This is expensive. @@ -3005,7 +3008,10 @@ public class HRegion implements HeapSize { // , Writable{ void updateKVTimestamps(final Iterable> keyLists, final byte[] now) { for (List cells: keyLists) { if (cells == null) continue; - for (Cell cell : cells) { + assert cells instanceof RandomAccess; + int listSize = cells.size(); + for (int i=0; i < listSize; i++) { + Cell cell = cells.get(i); KeyValue kv = KeyValueUtil.ensureKeyValue(cell); kv.updateLatestStamp(now); } @@ -3166,7 +3172,10 @@ public class HRegion implements HeapSize { // , Writable{ } long maxTs = now + timestampSlop; for (List kvs : familyMap.values()) { - for (Cell cell : kvs) { + assert kvs instanceof RandomAccess; + int listSize = kvs.size(); + for (int i=0; i < listSize; i++) { + Cell cell = kvs.get(i); // see if the user-side TS is out of range. latest = server-side long ts = cell.getTimestamp(); if (ts != HConstants.LATEST_TIMESTAMP && ts > maxTs) { @@ -3186,7 +3195,10 @@ public class HRegion implements HeapSize { // , Writable{ private void addFamilyMapToWALEdit(Map> familyMap, WALEdit walEdit) { for (List edits : familyMap.values()) { - for (Cell cell : edits) { + assert edits instanceof RandomAccess; + int listSize = edits.size(); + for (int i=0; i < listSize; i++) { + Cell cell = edits.get(i); walEdit.add(cell); } } @@ -6060,7 +6072,10 @@ public class HRegion implements HeapSize { // , Writable{ long mutationSize = 0; for (List cells: familyMap.values()) { - for (Cell cell : cells) { + assert cells instanceof RandomAccess; + int listSize = cells.size(); + for (int i=0; i < listSize; i++) { + Cell cell = cells.get(i); // TODO we need include tags length also here. mutationSize += KeyValueUtil.keyLength(cell) + cell.getValueLength(); }