DUE TO SPAM, SIGN-UP IS DISABLED. Goto Selfserve wiki signup and request an account.
...
| Code Block |
|---|
/**
* Compaction is composed of 3 transactional phases:
* 1. Scan data from entry log file into compaction log file and keep track of new entry locations
* 2. Flush compaction log to make sure it's persisted in disk and roll a new compaction log
* 3. Update entry locations to cache and flush index, finally delete the old entry log file
* <p>
* If compaction failed in any phase, abort the current compaction gracefully.
*/
synchronized boolean compact(EntryLogMetadata metadata) {
if (metadata != null) {
LOG.info("Compacting entry log {} : {}.", metadata.entryLogId, metadata);
CompactionPhase scanEntryLog = new ScanEntryLogPhase(metadata);
if (!scanEntryLog.run()) {
LOG.info("Compaction for entry log {} end in ScanEntryLogPhase.", metadata.entryLogId);
return false;
}
File compactionLogFile = entryLogger.getCurCompactionLogFile();
CompactionPhase flushCompactionLog = new FlushCompactionLogPhase(metadata.entryLogId);
if (!flushCompactionLog.run()) {
LOG.info("Compaction for entry log {} end in FlushCompactionLogPhase.", metadata.entryLogId);
return false;
}
File compactedLogFile = getCompactedLogFile(compactionLogFile, metadata.entryLogId);
CompactionPhase updateIndex = new UpdateIndexPhase(compactedLogFile);
if (!updateIndex.run()) {
LOG.info("Compaction for entry log {} end in UpdateIndexPhase.", metadata.entryLogId);
return false;
}
LOG.info("Compacted entry log : {}.", metadata.entryLogId);
return true;
}
return false;
} |
And this is the abstract class for all compaction phases.
| Code Block |
|---|
/**
* An abstract class that would be extended to be the actual transactional phases for compaction
*/
abstract static class CompactionPhase {
private String phaseName = "";
CompactionPhase() {
}
CompactionPhase(String phaseName) {
this.phaseName = phaseName;
}
boolean run() {
try {
start();
return complete();
} catch (IOException e) {
LOG.error("Encounter exception in compaction phase {}. Abort current compaction.", phaseName, e);
abort();
}
return false;
}
abstract void start() throws IOException;
abstract boolean complete() throws IOException;
abstract void abort();
} |
...