HBASE-12454 Setting didPerformCompaction early in HRegion#compact

This commit is contained in:
Andrew Purtell 2014-12-09 17:06:04 -08:00
parent cc8bdcb498
commit 011442edda
2 changed files with 29 additions and 22 deletions

View File

@ -1550,7 +1550,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver { //
return false;
}
MonitoredTask status = null;
boolean didPerformCompaction = false;
boolean requestNeedsCancellation = true;
// block waiting for the lock for compaction
lock.readLock().lock();
try {
@ -1587,7 +1587,9 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver { //
doRegionCompactionPrep();
try {
status.setStatus("Compacting store " + store);
didPerformCompaction = true;
// We no longer need to cancel the request on the way out of this
// method because Store#compact will clean up unconditionally
requestNeedsCancellation = false;
store.compact(compaction);
} catch (InterruptedIOException iioe) {
String msg = "compaction interrupted";
@ -1609,7 +1611,7 @@ public class HRegion implements HeapSize, PropagatingConfigurationObserver { //
return true;
} finally {
try {
if (!didPerformCompaction) store.cancelRequestedCompaction(compaction);
if (requestNeedsCancellation) store.cancelRequestedCompaction(compaction);
if (status != null) status.cleanup();
} finally {
lock.readLock().unlock();

View File

@ -1134,25 +1134,29 @@ public class HStore implements Store {
*/
@Override
public List<StoreFile> compact(CompactionContext compaction) throws IOException {
assert compaction != null && compaction.hasSelection();
CompactionRequest cr = compaction.getRequest();
Collection<StoreFile> filesToCompact = cr.getFiles();
assert !filesToCompact.isEmpty();
synchronized (filesCompacting) {
// sanity check: we're compacting files that this store knows about
// TODO: change this to LOG.error() after more debugging
Preconditions.checkArgument(filesCompacting.containsAll(filesToCompact));
}
// Ready to go. Have list of files to compact.
LOG.info("Starting compaction of " + filesToCompact.size() + " file(s) in "
+ this + " of " + this.getRegionInfo().getRegionNameAsString()
+ " into tmpdir=" + fs.getTempDir() + ", totalSize="
+ StringUtils.humanReadableInt(cr.getSize()));
long compactionStartTime = EnvironmentEdgeManager.currentTime();
assert compaction != null;
List<StoreFile> sfs = null;
CompactionRequest cr = compaction.getRequest();;
try {
// Do all sanity checking in here if we have a valid CompactionRequest
// because we need to clean up after it on the way out in a finally
// block below
long compactionStartTime = EnvironmentEdgeManager.currentTime();
assert compaction.hasSelection();
Collection<StoreFile> filesToCompact = cr.getFiles();
assert !filesToCompact.isEmpty();
synchronized (filesCompacting) {
// sanity check: we're compacting files that this store knows about
// TODO: change this to LOG.error() after more debugging
Preconditions.checkArgument(filesCompacting.containsAll(filesToCompact));
}
// Ready to go. Have list of files to compact.
LOG.info("Starting compaction of " + filesToCompact.size() + " file(s) in "
+ this + " of " + this.getRegionInfo().getRegionNameAsString()
+ " into tmpdir=" + fs.getTempDir() + ", totalSize="
+ StringUtils.humanReadableInt(cr.getSize()));
// Commence the compaction.
List<Path> newFiles = compaction.compact();
@ -1181,11 +1185,12 @@ public class HStore implements Store {
}
// At this point the store will use new files for all new scanners.
completeCompaction(filesToCompact, true); // Archive old files & update store size.
logCompactionEndMessage(cr, sfs, compactionStartTime);
return sfs;
} finally {
finishCompactionRequest(cr);
}
logCompactionEndMessage(cr, sfs, compactionStartTime);
return sfs;
}
private List<StoreFile> moveCompatedFilesIntoPlace(