Do not alloc full buffer for small change requests (#35158)
Today we always allocate a full buffer (1024 elements) in a LuceneChangesSnapshot even though the requesting size is smaller. With this change, we will use the requesting size as the buffer size if it's smaller than the default batch size; otherwise uses the default batch size.
This commit is contained in:
parent
7fb95be8bd
commit
e753e12f61
|
@ -95,14 +95,15 @@ final class LuceneChangesSnapshot implements Translog.Snapshot {
|
|||
}
|
||||
};
|
||||
this.mapperService = mapperService;
|
||||
this.searchBatchSize = searchBatchSize;
|
||||
final long requestingSize = (toSeqNo - fromSeqNo) == Long.MAX_VALUE ? Long.MAX_VALUE : (toSeqNo - fromSeqNo + 1L);
|
||||
this.searchBatchSize = requestingSize < searchBatchSize ? Math.toIntExact(requestingSize) : searchBatchSize;
|
||||
this.fromSeqNo = fromSeqNo;
|
||||
this.toSeqNo = toSeqNo;
|
||||
this.lastSeenSeqNo = fromSeqNo - 1;
|
||||
this.requiredFullRange = requiredFullRange;
|
||||
this.indexSearcher = new IndexSearcher(Lucene.wrapAllDocsLive(engineSearcher.getDirectoryReader()));
|
||||
this.indexSearcher.setQueryCache(null);
|
||||
this.parallelArray = new ParallelArray(searchBatchSize);
|
||||
this.parallelArray = new ParallelArray(this.searchBatchSize);
|
||||
final TopDocs topDocs = searchOperations(null);
|
||||
this.totalHits = Math.toIntExact(topDocs.totalHits.value);
|
||||
this.scoreDocs = topDocs.scoreDocs;
|
||||
|
|
|
@ -294,4 +294,14 @@ public class LuceneChangesSnapshotTests extends EngineTestCase {
|
|||
}
|
||||
return operations;
|
||||
}
|
||||
|
||||
public void testOverFlow() throws Exception {
|
||||
long fromSeqNo = randomLongBetween(0, 5);
|
||||
long toSeqNo = randomLongBetween(Long.MAX_VALUE - 5, Long.MAX_VALUE);
|
||||
try (Translog.Snapshot snapshot = engine.newChangesSnapshot("test", mapperService, fromSeqNo, toSeqNo, true)) {
|
||||
IllegalStateException error = expectThrows(IllegalStateException.class, () -> drainAll(snapshot));
|
||||
assertThat(error.getMessage(),
|
||||
containsString("Not all operations between from_seqno [" + fromSeqNo + "] and to_seqno [" + toSeqNo + "] found"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue