mirror of https://github.com/apache/lucene.git
LUCENE-1082: fix NPE in IndexReader.lastModified(*) methods
git-svn-id: https://svn.apache.org/repos/asf/lucene/java/trunk@602055 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
11895271a3
commit
ce9b80539d
|
@ -528,40 +528,42 @@ final class SegmentInfos extends Vector {
|
|||
// a stale cache (NFS) we have a better chance of
|
||||
// getting the right generation.
|
||||
long genB = -1;
|
||||
for(int i=0;i<defaultGenFileRetryCount;i++) {
|
||||
IndexInput genInput = null;
|
||||
try {
|
||||
genInput = directory.openInput(IndexFileNames.SEGMENTS_GEN);
|
||||
} catch (FileNotFoundException e) {
|
||||
message("segments.gen open: FileNotFoundException " + e);
|
||||
break;
|
||||
} catch (IOException e) {
|
||||
message("segments.gen open: IOException " + e);
|
||||
}
|
||||
|
||||
if (genInput != null) {
|
||||
if (directory != null) {
|
||||
for(int i=0;i<defaultGenFileRetryCount;i++) {
|
||||
IndexInput genInput = null;
|
||||
try {
|
||||
int version = genInput.readInt();
|
||||
if (version == FORMAT_LOCKLESS) {
|
||||
long gen0 = genInput.readLong();
|
||||
long gen1 = genInput.readLong();
|
||||
message("fallback check: " + gen0 + "; " + gen1);
|
||||
if (gen0 == gen1) {
|
||||
// The file is consistent.
|
||||
genB = gen0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (IOException err2) {
|
||||
// will retry
|
||||
} finally {
|
||||
genInput.close();
|
||||
genInput = directory.openInput(IndexFileNames.SEGMENTS_GEN);
|
||||
} catch (FileNotFoundException e) {
|
||||
message("segments.gen open: FileNotFoundException " + e);
|
||||
break;
|
||||
} catch (IOException e) {
|
||||
message("segments.gen open: IOException " + e);
|
||||
}
|
||||
|
||||
if (genInput != null) {
|
||||
try {
|
||||
int version = genInput.readInt();
|
||||
if (version == FORMAT_LOCKLESS) {
|
||||
long gen0 = genInput.readLong();
|
||||
long gen1 = genInput.readLong();
|
||||
message("fallback check: " + gen0 + "; " + gen1);
|
||||
if (gen0 == gen1) {
|
||||
// The file is consistent.
|
||||
genB = gen0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} catch (IOException err2) {
|
||||
// will retry
|
||||
} finally {
|
||||
genInput.close();
|
||||
}
|
||||
}
|
||||
try {
|
||||
Thread.sleep(defaultGenFileRetryPauseMsec);
|
||||
} catch (InterruptedException e) {
|
||||
// will retry
|
||||
}
|
||||
}
|
||||
try {
|
||||
Thread.sleep(defaultGenFileRetryPauseMsec);
|
||||
} catch (InterruptedException e) {
|
||||
// will retry
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -655,8 +657,14 @@ final class SegmentInfos extends Vector {
|
|||
String prevSegmentFileName = IndexFileNames.fileNameFromGeneration(IndexFileNames.SEGMENTS,
|
||||
"",
|
||||
gen-1);
|
||||
|
||||
if (directory.fileExists(prevSegmentFileName)) {
|
||||
|
||||
final boolean prevExists;
|
||||
if (directory != null)
|
||||
prevExists = directory.fileExists(prevSegmentFileName);
|
||||
else
|
||||
prevExists = new File(fileDirectory, prevSegmentFileName).exists();
|
||||
|
||||
if (prevExists) {
|
||||
message("fallback to prior segment file '" + prevSegmentFileName + "'");
|
||||
try {
|
||||
Object v = doBody(prevSegmentFileName);
|
||||
|
|
|
@ -595,26 +595,51 @@ public class TestIndexReader extends LuceneTestCase
|
|||
|
||||
public void testLastModified() throws IOException {
|
||||
assertFalse(IndexReader.indexExists("there_is_no_such_index"));
|
||||
Directory dir = new MockRAMDirectory();
|
||||
assertFalse(IndexReader.indexExists(dir));
|
||||
IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true);
|
||||
addDocumentWithFields(writer);
|
||||
assertTrue(IndexReader.isLocked(dir)); // writer open, so dir is locked
|
||||
writer.close();
|
||||
assertTrue(IndexReader.indexExists(dir));
|
||||
IndexReader reader = IndexReader.open(dir);
|
||||
assertFalse(IndexReader.isLocked(dir)); // reader only, no lock
|
||||
long version = IndexReader.lastModified(dir);
|
||||
reader.close();
|
||||
// modify index and check version has been
|
||||
// incremented:
|
||||
writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true);
|
||||
addDocumentWithFields(writer);
|
||||
writer.close();
|
||||
reader = IndexReader.open(dir);
|
||||
assertTrue("old lastModified is " + version + "; new lastModified is " + IndexReader.lastModified(dir), version <= IndexReader.lastModified(dir));
|
||||
reader.close();
|
||||
dir.close();
|
||||
final File fileDir = new File(System.getProperty("tempDir"), "testIndex");
|
||||
for(int i=0;i<2;i++) {
|
||||
try {
|
||||
final Directory dir;
|
||||
if (0 == i)
|
||||
dir = new MockRAMDirectory();
|
||||
else
|
||||
dir = getDirectory();
|
||||
assertFalse(IndexReader.indexExists(dir));
|
||||
IndexWriter writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true);
|
||||
addDocumentWithFields(writer);
|
||||
assertTrue(IndexReader.isLocked(dir)); // writer open, so dir is locked
|
||||
writer.close();
|
||||
assertTrue(IndexReader.indexExists(dir));
|
||||
IndexReader reader = IndexReader.open(dir);
|
||||
assertFalse(IndexReader.isLocked(dir)); // reader only, no lock
|
||||
long version = IndexReader.lastModified(dir);
|
||||
if (i == 1) {
|
||||
long version2 = IndexReader.lastModified(fileDir);
|
||||
assertEquals(version, version2);
|
||||
}
|
||||
reader.close();
|
||||
// modify index and check version has been
|
||||
// incremented:
|
||||
while(true) {
|
||||
try {
|
||||
Thread.sleep(1000);
|
||||
break;
|
||||
} catch (InterruptedException ie) {
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
writer = new IndexWriter(dir, new WhitespaceAnalyzer(), true);
|
||||
addDocumentWithFields(writer);
|
||||
writer.close();
|
||||
reader = IndexReader.open(dir);
|
||||
assertTrue("old lastModified is " + version + "; new lastModified is " + IndexReader.lastModified(dir), version <= IndexReader.lastModified(dir));
|
||||
reader.close();
|
||||
dir.close();
|
||||
} finally {
|
||||
if (i == 1)
|
||||
_TestUtil.rmDir(fileDir);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void testVersion() throws IOException {
|
||||
|
|
Loading…
Reference in New Issue