mirror of https://github.com/apache/lucene.git
tests: additional corrupt tlog test
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/trunk@1384358 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
9f91d12c4f
commit
6104078c44
|
@ -864,6 +864,83 @@ public class TestRecovery extends SolrTestCaseJ4 {
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// test that a corrupt tlog doesn't stop us from coming up
|
||||
//
|
||||
@Test
|
||||
public void testCorruptLog() throws Exception {
|
||||
try {
|
||||
DirectUpdateHandler2.commitOnClose = false;
|
||||
final Semaphore logReplay = new Semaphore(0);
|
||||
final Semaphore logReplayFinish = new Semaphore(0);
|
||||
|
||||
UpdateLog.testing_logReplayHook = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
assertTrue(logReplay.tryAcquire(timeout, TimeUnit.SECONDS));
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
UpdateLog.testing_logReplayFinishHook = new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
logReplayFinish.release();
|
||||
}
|
||||
};
|
||||
|
||||
File logDir = h.getCore().getUpdateHandler().getUpdateLog().getLogDir();
|
||||
|
||||
clearIndex();
|
||||
assertU(commit());
|
||||
|
||||
assertU(adoc("id","G1"));
|
||||
assertU(adoc("id","G2"));
|
||||
assertU(adoc("id","G3"));
|
||||
|
||||
h.close();
|
||||
String[] files = UpdateLog.getLogList(logDir);
|
||||
Arrays.sort(files);
|
||||
RandomAccessFile raf = new RandomAccessFile(new File(logDir, files[files.length-1]), "rw");
|
||||
long len = raf.length();
|
||||
raf.seek(0); // seek to start
|
||||
raf.write(new byte[(int)len]); // zero out file
|
||||
raf.close();
|
||||
|
||||
logReplay.release(1000);
|
||||
logReplayFinish.release(1);
|
||||
ignoreException("Failure to open existing log file"); // this is what the corrupted log currently produces... subject to change.
|
||||
createCore();
|
||||
resetExceptionIgnores();
|
||||
|
||||
// just make sure it responds
|
||||
assertJQ(req("q","*:*") ,"/response/numFound==0");
|
||||
|
||||
//
|
||||
// Now test that the bad log file doesn't mess up retrieving latest versions
|
||||
//
|
||||
|
||||
updateJ(jsonAdd(sdoc("id","G4", "_version_","104")), params(DISTRIB_UPDATE_PARAM,FROM_LEADER));
|
||||
updateJ(jsonAdd(sdoc("id","G5", "_version_","105")), params(DISTRIB_UPDATE_PARAM,FROM_LEADER));
|
||||
updateJ(jsonAdd(sdoc("id","G6", "_version_","106")), params(DISTRIB_UPDATE_PARAM,FROM_LEADER));
|
||||
|
||||
// This currently skips the bad log file and also returns the version of the clearIndex (del *:*)
|
||||
// assertJQ(req("qt","/get", "getVersions","6"), "/versions==[106,105,104]");
|
||||
assertJQ(req("qt","/get", "getVersions","3"), "/versions==[106,105,104]");
|
||||
|
||||
} finally {
|
||||
DirectUpdateHandler2.commitOnClose = true;
|
||||
UpdateLog.testing_logReplayHook = null;
|
||||
UpdateLog.testing_logReplayFinishHook = null;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// in rare circumstances, two logs can be left uncapped (lacking a commit at the end signifying that all the content in the log was committed)
|
||||
@Test
|
||||
public void testRecoveryMultipleLogs() throws Exception {
|
||||
|
|
Loading…
Reference in New Issue