下面列出了org.apache.lucene.index.IndexReader#getRefCount ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
@Override
public int doLogic() throws IOException {
IndexReader reader = getRunData().getIndexReader();
getRunData().setIndexReader(null);
if (reader.getRefCount() != 1) {
System.out.println("WARNING: CloseReader: reference count is currently " + reader.getRefCount());
}
reader.decRef();
return 1;
}
private void tryToCloseReaders() {
LOG.debug("Trying to close [{0}] readers", readers.size());
Iterator<IndexReader> it = readers.iterator();
while (it.hasNext()) {
IndexReader reader = it.next();
if (reader.getRefCount() == 1) {
it.remove();
closeInternal(reader);
} else {
LOG.debug("Could not close indexreader [" + reader + "] because of ref count [" + reader.getRefCount() + "].");
}
}
}
public void testReopen() throws Exception {
assertU(adoc("id","1", "v_t","Hello Dude", "v_s1","string1"));
assertU(adoc("id","2", "v_t","Hello Yonik", "v_s1","string2"));
assertU(commit());
SolrQueryRequest sr1 = req("q","foo");
IndexReader r1 = sr1.getSearcher().getRawReader();
String sval1 = getStringVal(sr1, "v_s1",0);
assertEquals("string1", sval1);
assertU(adoc("id","3", "v_s1","{!literal}"));
assertU(adoc("id","4", "v_s1","other stuff"));
assertU(commit());
SolrQueryRequest sr2 = req("q","foo");
IndexReader r2 = sr2.getSearcher().getRawReader();
// make sure the readers share the first segment
// Didn't work w/ older versions of lucene2.9 going from segment -> multi
assertEquals(r1.leaves().get(0).reader(), r2.leaves().get(0).reader());
assertU(adoc("id","5", "v_f","3.14159"));
assertU(adoc("id","6", "v_f","8983", "v_s1","string6"));
assertU(commit());
SolrQueryRequest sr3 = req("q","foo");
IndexReader r3 = sr3.getSearcher().getRawReader();
// make sure the readers share segments
// assertEquals(r1.getLeafReaders()[0], r3.getLeafReaders()[0]);
assertEquals(r2.leaves().get(0).reader(), r3.leaves().get(0).reader());
assertEquals(r2.leaves().get(1).reader(), r3.leaves().get(1).reader());
sr1.close();
sr2.close();
// should currently be 1, but this could change depending on future index management
int baseRefCount = r3.getRefCount();
assertEquals(1, baseRefCount);
Map<String, Metric> metrics = h.getCore().getCoreMetricManager().getRegistry().getMetrics();
@SuppressWarnings({"unchecked"})
Gauge<Date> g = (Gauge<Date>)metrics.get("SEARCHER.searcher.registeredAt");
Date sr3SearcherRegAt = g.getValue();
assertU(commit()); // nothing has changed
SolrQueryRequest sr4 = req("q","foo");
assertSame("nothing changed, searcher should be the same",
sr3.getSearcher(), sr4.getSearcher());
assertEquals("nothing changed, searcher should not have been re-registered",
sr3SearcherRegAt, g.getValue());
IndexReader r4 = sr4.getSearcher().getRawReader();
// force an index change so the registered searcher won't be the one we are testing (and
// then we should be able to test the refCount going all the way to 0
assertU(adoc("id","7", "v_f","7574"));
assertU(commit());
// test that reader didn't change
assertSame(r3, r4);
assertEquals(baseRefCount, r4.getRefCount());
sr3.close();
assertEquals(baseRefCount, r4.getRefCount());
sr4.close();
assertEquals(baseRefCount-1, r4.getRefCount());
SolrQueryRequest sr5 = req("q","foo");
IndexReaderContext rCtx5 = sr5.getSearcher().getTopReaderContext();
assertU(delI("1"));
assertU(commit());
SolrQueryRequest sr6 = req("q","foo");
IndexReaderContext rCtx6 = sr6.getSearcher().getTopReaderContext();
assertEquals(1, rCtx6.leaves().get(0).reader().numDocs()); // only a single doc left in the first segment
assertTrue( !rCtx5.leaves().get(0).reader().equals(rCtx6.leaves().get(0).reader()) ); // readers now different
sr5.close();
sr6.close();
}