[STORE] use Directory#fileLength() less during calculating checksums

This commit is contained in:
Simon Willnauer 2015-02-13 13:42:11 +01:00
parent 09eb8d1383
commit 287fab46a1
1 changed files with 12 additions and 4 deletions

View File

@ -713,7 +713,13 @@ public class Store extends AbstractIndexShardComponent implements Closeable, Ref
if (maxVersion.onOrAfter(FIRST_LUCENE_CHECKSUM_VERSION)) { if (maxVersion.onOrAfter(FIRST_LUCENE_CHECKSUM_VERSION)) {
checksumFromLuceneFile(directory, segmentsFile, builder, logger, maxVersion, true); checksumFromLuceneFile(directory, segmentsFile, builder, logger, maxVersion, true);
} else { } else {
builder.put(segmentsFile, new StoreFileMetaData(segmentsFile, directory.fileLength(segmentsFile), legacyChecksum, maxVersion, hashFile(directory, segmentsFile))); final BytesRefBuilder fileHash = new BytesRefBuilder();
final long length;
try (final IndexInput in = directory.openInput(segmentsFile, IOContext.READONCE)) {
length = in.length();
hashFile(fileHash, new InputStreamIndexInput(in, length), length);
}
builder.put(segmentsFile, new StoreFileMetaData(segmentsFile, length, legacyChecksum, maxVersion, fileHash.get()));
} }
} catch (CorruptIndexException | IndexNotFoundException | IndexFormatTooOldException | IndexFormatTooNewException ex) { } catch (CorruptIndexException | IndexNotFoundException | IndexFormatTooOldException | IndexFormatTooNewException ex) {
// we either know the index is corrupted or it's just not there // we either know the index is corrupted or it's just not there
@ -798,14 +804,16 @@ public class Store extends AbstractIndexShardComponent implements Closeable, Ref
final String checksum; final String checksum;
final BytesRefBuilder fileHash = new BytesRefBuilder(); final BytesRefBuilder fileHash = new BytesRefBuilder();
try (final IndexInput in = directory.openInput(file, IOContext.READONCE)) { try (final IndexInput in = directory.openInput(file, IOContext.READONCE)) {
final long length;
try { try {
if (in.length() < CodecUtil.footerLength()) { length = in.length();
if (length < CodecUtil.footerLength()) {
// truncated files trigger IAE if we seek negative... these files are really corrupted though // truncated files trigger IAE if we seek negative... these files are really corrupted though
throw new CorruptIndexException("Can't retrieve checksum from file: " + file + " file length must be >= " + CodecUtil.footerLength() + " but was: " + in.length(), in); throw new CorruptIndexException("Can't retrieve checksum from file: " + file + " file length must be >= " + CodecUtil.footerLength() + " but was: " + in.length(), in);
} }
if (readFileAsHash) { if (readFileAsHash) {
final VerifyingIndexInput verifyingIndexInput = new VerifyingIndexInput(in); // additional safety we checksum the entire file we read the hash for... final VerifyingIndexInput verifyingIndexInput = new VerifyingIndexInput(in); // additional safety we checksum the entire file we read the hash for...
hashFile(fileHash, new InputStreamIndexInput(verifyingIndexInput, in.length()), in.length()); hashFile(fileHash, new InputStreamIndexInput(verifyingIndexInput, length), length);
checksum = digestToString(verifyingIndexInput.verify()); checksum = digestToString(verifyingIndexInput.verify());
} else { } else {
checksum = digestToString(CodecUtil.retrieveChecksum(in)); checksum = digestToString(CodecUtil.retrieveChecksum(in));
@ -815,7 +823,7 @@ public class Store extends AbstractIndexShardComponent implements Closeable, Ref
logger.debug("Can retrieve checksum from file [{}]", ex, file); logger.debug("Can retrieve checksum from file [{}]", ex, file);
throw ex; throw ex;
} }
builder.put(file, new StoreFileMetaData(file, directory.fileLength(file), checksum, version, fileHash.get())); builder.put(file, new StoreFileMetaData(file, length, checksum, version, fileHash.get()));
} }
} }