HBASE-4789 On split, parent region is sticking around in oldest sequenceid to region map though not online; we don't cleanup WALs
git-svn-id: https://svn.apache.org/repos/asf/hbase/trunk@1204034 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
1a83d9528b
commit
39d7828814
|
@ -1286,7 +1286,7 @@ public class HRegion implements HeapSize { // , Writable{
|
|||
w = mvcc.beginMemstoreInsert();
|
||||
mvcc.advanceMemstore(w);
|
||||
|
||||
sequenceId = (wal == null)? myseqid :
|
||||
sequenceId = (wal == null)? myseqid:
|
||||
wal.startCacheFlush(this.regionInfo.getEncodedNameAsBytes());
|
||||
completeSequenceId = this.getCompleteCacheFlushSequenceId(sequenceId);
|
||||
|
||||
|
@ -1302,7 +1302,7 @@ public class HRegion implements HeapSize { // , Writable{
|
|||
this.updatesLock.writeLock().unlock();
|
||||
}
|
||||
status.setStatus("Waiting for mvcc");
|
||||
LOG.debug("Finished snapshotting, commencing waiting for mvcc");
|
||||
LOG.debug("Finished snapshotting " + this + ", commencing wait for mvcc");
|
||||
|
||||
// wait for all in-progress transactions to commit to HLog before
|
||||
// we can start the flush. This prevents
|
||||
|
|
|
@ -115,11 +115,11 @@ class LogRoller extends HasThread implements WALActionsListener {
|
|||
}
|
||||
|
||||
/**
|
||||
* @param region Encoded name of region to flush.
|
||||
* @param encodedRegionName Encoded name of region to flush.
|
||||
*/
|
||||
private void scheduleFlush(final byte [] region) {
|
||||
private void scheduleFlush(final byte [] encodedRegionName) {
|
||||
boolean scheduled = false;
|
||||
HRegion r = this.services.getFromOnlineRegions(Bytes.toString(region));
|
||||
HRegion r = this.services.getFromOnlineRegions(Bytes.toString(encodedRegionName));
|
||||
FlushRequester requester = null;
|
||||
if (r != null) {
|
||||
requester = this.services.getFlushRequester();
|
||||
|
@ -129,8 +129,9 @@ class LogRoller extends HasThread implements WALActionsListener {
|
|||
}
|
||||
}
|
||||
if (!scheduled) {
|
||||
LOG.warn("Failed to schedule flush of " +
|
||||
Bytes.toString(region) + "r=" + r + ", requester=" + requester);
|
||||
LOG.warn("Failed to schedule flush of " +
|
||||
Bytes.toString(encodedRegionName) + ", region=" + r + ", requester=" +
|
||||
requester);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -187,8 +187,8 @@ public class HLog implements Syncable {
|
|||
Collections.synchronizedSortedMap(new TreeMap<Long, Path>());
|
||||
|
||||
/*
|
||||
* Map of regions to most recent sequence/edit id in their memstore.
|
||||
* Key is encoded region name.
|
||||
* Map of encoded region names to their most recent sequence/edit id in their
|
||||
* memstore.
|
||||
*/
|
||||
private final ConcurrentSkipListMap<byte [], Long> lastSeqWritten =
|
||||
new ConcurrentSkipListMap<byte [], Long>(Bytes.BYTES_COMPARATOR);
|
||||
|
@ -745,9 +745,8 @@ public class HLog implements Syncable {
|
|||
// If too many log files, figure which regions we need to flush.
|
||||
// Array is an array of encoded region names.
|
||||
byte [][] regions = null;
|
||||
int logCount = this.outputfiles.size();
|
||||
if (logCount > this.maxLogs && this.outputfiles != null &&
|
||||
this.outputfiles.size() > 0) {
|
||||
int logCount = this.outputfiles == null? 0: this.outputfiles.size();
|
||||
if (logCount > this.maxLogs && logCount > 0) {
|
||||
// This is an array of encoded region names.
|
||||
regions = findMemstoresWithEditsEqualOrOlderThan(this.outputfiles.firstKey(),
|
||||
this.lastSeqWritten);
|
||||
|
@ -769,7 +768,7 @@ public class HLog implements Syncable {
|
|||
* Return regions (memstores) that have edits that are equal or less than
|
||||
* the passed <code>oldestWALseqid</code>.
|
||||
* @param oldestWALseqid
|
||||
* @param regionsToSeqids
|
||||
* @param regionsToSeqids Encoded region names to sequence ids
|
||||
* @return All regions whose seqid is < than <code>oldestWALseqid</code> (Not
|
||||
* necessarily in order). Null if no regions found.
|
||||
*/
|
||||
|
@ -780,6 +779,7 @@ public class HLog implements Syncable {
|
|||
for (Map.Entry<byte [], Long> e: regionsToSeqids.entrySet()) {
|
||||
if (e.getValue().longValue() <= oldestWALseqid) {
|
||||
if (regions == null) regions = new ArrayList<byte []>();
|
||||
// Key is encoded region name.
|
||||
regions.add(e.getKey());
|
||||
}
|
||||
}
|
||||
|
@ -802,6 +802,7 @@ public class HLog implements Syncable {
|
|||
byte [] oldestRegion = null;
|
||||
for (Map.Entry<byte [], Long> e: this.lastSeqWritten.entrySet()) {
|
||||
if (e.getValue().longValue() == oldestOutstandingSeqNum.longValue()) {
|
||||
// Key is encoded region name.
|
||||
oldestRegion = e.getKey();
|
||||
break;
|
||||
}
|
||||
|
@ -1092,9 +1093,9 @@ public class HLog implements Syncable {
|
|||
// is greater than or equal to the value in lastSeqWritten.
|
||||
// Use encoded name. Its shorter, guaranteed unique and a subset of
|
||||
// actual name.
|
||||
byte [] hriKey = info.getEncodedNameAsBytes();
|
||||
this.lastSeqWritten.putIfAbsent(hriKey, seqNum);
|
||||
HLogKey logKey = makeKey(hriKey, tableName, seqNum, now, clusterId);
|
||||
byte [] encodedRegionName = info.getEncodedNameAsBytes();
|
||||
this.lastSeqWritten.putIfAbsent(encodedRegionName, seqNum);
|
||||
HLogKey logKey = makeKey(encodedRegionName, tableName, seqNum, now, clusterId);
|
||||
doWrite(info, logKey, edits, htd);
|
||||
this.numEntries.incrementAndGet();
|
||||
txid = this.unflushedEntries.incrementAndGet();
|
||||
|
@ -1537,6 +1538,11 @@ public class HLog implements Syncable {
|
|||
// Cleaning up of lastSeqWritten is in the finally clause because we
|
||||
// don't want to confuse getOldestOutstandingSeqNum()
|
||||
this.lastSeqWritten.remove(getSnapshotName(encodedRegionName));
|
||||
Long l = this.lastSeqWritten.remove(encodedRegionName);
|
||||
if (l != null) {
|
||||
LOG.warn("Why is there a raw encodedRegionName in lastSeqWritten? name=" +
|
||||
Bytes.toString(encodedRegionName) + ", seqid=" + l);
|
||||
}
|
||||
this.cacheFlushLock.unlock();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue