HDFS-3884. Journal format() should reset cached values. Contributed by Todd Lipcon.
git-svn-id: https://svn.apache.org/repos/asf/hadoop/common/branches/HDFS-3077@1380979 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
72485f3112
commit
f6b7f067c3
@ -40,3 +40,5 @@ HDFS-3877. QJM: Provide defaults for dfs.journalnode.*address (eli)
|
|||||||
HDFS-3863. Track last "committed" txid in QJM (todd)
|
HDFS-3863. Track last "committed" txid in QJM (todd)
|
||||||
|
|
||||||
HDFS-3869. Expose non-file journal manager details in web UI (todd)
|
HDFS-3869. Expose non-file journal manager details in web UI (todd)
|
||||||
|
|
||||||
|
HDFS-3884. Journal format() should reset cached values (todd)
|
||||||
|
@ -105,6 +105,19 @@ class Journal implements Closeable {
|
|||||||
Journal(File logDir, StorageErrorReporter errorReporter) throws IOException {
|
Journal(File logDir, StorageErrorReporter errorReporter) throws IOException {
|
||||||
storage = new JNStorage(logDir, errorReporter);
|
storage = new JNStorage(logDir, errorReporter);
|
||||||
|
|
||||||
|
refreshCachedData();
|
||||||
|
|
||||||
|
this.fjm = storage.getJournalManager();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reload any data that may have been cached. This is necessary
|
||||||
|
* when we first load the Journal, but also after any formatting
|
||||||
|
* operation, since the cached data is no longer relevant.
|
||||||
|
*/
|
||||||
|
private synchronized void refreshCachedData() {
|
||||||
|
IOUtils.closeStream(committedTxnId);
|
||||||
|
|
||||||
File currentDir = storage.getSingularStorageDir().getCurrentDir();
|
File currentDir = storage.getSingularStorageDir().getCurrentDir();
|
||||||
this.lastPromisedEpoch = new PersistentLongFile(
|
this.lastPromisedEpoch = new PersistentLongFile(
|
||||||
new File(currentDir, LAST_PROMISED_FILENAME), 0);
|
new File(currentDir, LAST_PROMISED_FILENAME), 0);
|
||||||
@ -113,8 +126,6 @@ class Journal implements Closeable {
|
|||||||
this.committedTxnId = new BestEffortLongFile(
|
this.committedTxnId = new BestEffortLongFile(
|
||||||
new File(currentDir, COMMITTED_TXID_FILENAME),
|
new File(currentDir, COMMITTED_TXID_FILENAME),
|
||||||
HdfsConstants.INVALID_TXID);
|
HdfsConstants.INVALID_TXID);
|
||||||
|
|
||||||
this.fjm = storage.getJournalManager();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -156,6 +167,7 @@ void format(NamespaceInfo nsInfo) throws IOException {
|
|||||||
LOG.info("Formatting " + this + " with namespace info: " +
|
LOG.info("Formatting " + this + " with namespace info: " +
|
||||||
nsInfo);
|
nsInfo);
|
||||||
storage.format(nsInfo);
|
storage.format(nsInfo);
|
||||||
|
refreshCachedData();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -181,6 +193,11 @@ synchronized long getLastPromisedEpoch() throws IOException {
|
|||||||
return lastPromisedEpoch.get();
|
return lastPromisedEpoch.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
synchronized public long getLastWriterEpoch() throws IOException {
|
||||||
|
checkFormatted();
|
||||||
|
return lastWriterEpoch.get();
|
||||||
|
}
|
||||||
|
|
||||||
synchronized long getCommittedTxnIdForTests() throws IOException {
|
synchronized long getCommittedTxnIdForTests() throws IOException {
|
||||||
return committedTxnId.get();
|
return committedTxnId.get();
|
||||||
}
|
}
|
||||||
|
@ -148,6 +148,19 @@ public void testRestartJournal() throws Exception {
|
|||||||
assertEquals(1, newEpoch.getLastSegmentTxId());
|
assertEquals(1, newEpoch.getLastSegmentTxId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testFormatResetsCachedValues() throws Exception {
|
||||||
|
journal.newEpoch(FAKE_NSINFO, 12345L);
|
||||||
|
journal.startLogSegment(new RequestInfo(JID, 12345L, 1L, 0L), 1L);
|
||||||
|
|
||||||
|
assertEquals(12345L, journal.getLastPromisedEpoch());
|
||||||
|
assertEquals(12345L, journal.getLastWriterEpoch());
|
||||||
|
|
||||||
|
journal.format(FAKE_NSINFO_2);
|
||||||
|
assertEquals(0, journal.getLastPromisedEpoch());
|
||||||
|
assertEquals(0, journal.getLastWriterEpoch());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Test that, if the writer crashes at the very beginning of a segment,
|
* Test that, if the writer crashes at the very beginning of a segment,
|
||||||
* before any transactions are written, that the next newEpoch() call
|
* before any transactions are written, that the next newEpoch() call
|
||||||
|
Loading…
Reference in New Issue
Block a user