HBASE-15204 Try to estimate the cell count for adding into WALEdit (Ram)

This commit is contained in:
ramkrishna 2016-02-11 09:09:25 +05:30
parent 1942a99b83
commit fec9733893
2 changed files with 26 additions and 5 deletions

View File

@ -2951,7 +2951,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
Set<byte[]> deletesCfSet = null; Set<byte[]> deletesCfSet = null;
long currentNonceGroup = HConstants.NO_NONCE; long currentNonceGroup = HConstants.NO_NONCE;
long currentNonce = HConstants.NO_NONCE; long currentNonce = HConstants.NO_NONCE;
WALEdit walEdit = new WALEdit(replay); WALEdit walEdit = null;
boolean locked = false; boolean locked = false;
// reference family maps directly so coprocessors can mutate them if desired // reference family maps directly so coprocessors can mutate them if desired
Map<byte[], List<Cell>>[] familyMaps = new Map[batchOp.operations.length]; Map<byte[], List<Cell>>[] familyMaps = new Map[batchOp.operations.length];
@ -2962,6 +2962,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
int noOfPuts = 0; int noOfPuts = 0;
int noOfDeletes = 0; int noOfDeletes = 0;
WriteEntry writeEntry = null; WriteEntry writeEntry = null;
int cellCount = 0;
/** Keep track of the locks we hold so we can release them in finally clause */ /** Keep track of the locks we hold so we can release them in finally clause */
List<RowLock> acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length); List<RowLock> acquiredRowLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);
try { try {
@ -2990,7 +2991,11 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
lastIndexExclusive++; lastIndexExclusive++;
numReadyToWrite++; numReadyToWrite++;
if (replay) {
for (List<Cell> cells : mutation.getFamilyCellMap().values()) {
cellCount += cells.size();
}
}
if (mutation instanceof Put) { if (mutation instanceof Put) {
// If Column Families stay consistent through out all of the // If Column Families stay consistent through out all of the
// individual puts then metrics can be reported as a multiput across // individual puts then metrics can be reported as a multiput across
@ -3041,8 +3046,15 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
noOfDeletes++; noOfDeletes++;
} }
rewriteCellTags(familyMaps[i], mutation); rewriteCellTags(familyMaps[i], mutation);
WALEdit fromCP = batchOp.walEditsFromCoprocessors[i];
if (fromCP != null) {
cellCount += fromCP.size();
} }
for (List<Cell> cells : familyMaps[i].values()) {
cellCount += cells.size();
}
}
walEdit = new WALEdit(cellCount, replay);
lock(this.updatesLock.readLock(), numReadyToWrite); lock(this.updatesLock.readLock(), numReadyToWrite);
locked = true; locked = true;
@ -3082,7 +3094,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver, Regi
if (nonceGroup != currentNonceGroup || nonce != currentNonce) { if (nonceGroup != currentNonceGroup || nonce != currentNonce) {
// Write what we have so far for nonces out to WAL // Write what we have so far for nonces out to WAL
appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce); appendCurrentNonces(m, replay, walEdit, now, currentNonceGroup, currentNonce);
walEdit = new WALEdit(replay); walEdit = new WALEdit(cellCount, replay);
currentNonceGroup = nonceGroup; currentNonceGroup = nonceGroup;
currentNonce = nonce; currentNonce = nonce;
} }

View File

@ -99,7 +99,7 @@ public class WALEdit implements Writable, HeapSize {
private final int VERSION_2 = -1; private final int VERSION_2 = -1;
private final boolean isReplay; private final boolean isReplay;
private ArrayList<Cell> cells = new ArrayList<Cell>(1); private ArrayList<Cell> cells = null;
public static final WALEdit EMPTY_WALEDIT = new WALEdit(); public static final WALEdit EMPTY_WALEDIT = new WALEdit();
@ -117,7 +117,16 @@ public class WALEdit implements Writable, HeapSize {
} }
public WALEdit(boolean isReplay) { public WALEdit(boolean isReplay) {
this(1, isReplay);
}
public WALEdit(int cellCount) {
this(cellCount, false);
}
public WALEdit(int cellCount, boolean isReplay) {
this.isReplay = isReplay; this.isReplay = isReplay;
cells = new ArrayList<Cell>(cellCount);
} }
/** /**