Index: lucene/src/java/org/apache/lucene/index/SegmentReader.java =================================================================== --- lucene/src/java/org/apache/lucene/index/SegmentReader.java (revision 1088725) +++ lucene/src/java/org/apache/lucene/index/SegmentReader.java (working copy) @@ -441,6 +441,7 @@ boolean success = false; try { try { + out.writeBytes(SegmentMerger.NORMS_HEADER, 0, SegmentMerger.NORMS_HEADER.length); out.writeBytes(bytes, maxDoc()); } finally { out.close(); @@ -986,8 +987,19 @@ // If this were to change in the future, a clone could be done here. normInput = singleNormStream; } else { - normSeek = 0; normInput = d.openInput(fileName); + // if the segment was created after 3.1, we wrote the header for sure, + // and dont need to do the sketchy file size check. otherwise, we check + // if the size is exactly equal to maxDoc to detect a headerless file. + String version = si.getVersion(); + final boolean isUnversioned = + (version == null || version.equals("3.0") || version.equals("3.1")) + && normInput.length() == maxDoc(); + if (isUnversioned) { + normSeek = 0; + } else { + normSeek = SegmentMerger.NORMS_HEADER.length; + } } norms.put(fi.name, new Norm(normInput, fi.number, normSeek));