Apologies if this has been discussed and thrashed out before. I found some
discussion but still not clear about several things. Based on one of Mike's
answers a while back, I have ran my test program with a lucene-core jar
which was built with VERBOSE_REF_COUNTS = true. This is all on Lucene 6.6.2
on Centos.

I have a small test program whose structure if roughly like so

try {
FSDirectory dir = FSDirectory.open(Paths.get(INDEX_DIR));
IndexWriterConfig iwc = new IndexWriterConfig(new StandardAnalyzer());
TieredMergePolicy tmp = new TieredMergePolicy();
tmp.setSegmentsPerTier(10);
iwc.setInfoStream(System.out);
iwc.setMergePolicy(tmp);
iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);

IndexWriter writer = new IndexWriter(dir, iwc);

for( int madness = 0; madness < 2; madness++ ) {

indexDocs(writer, new File(args[0]));

SearcherManager sm = new SearcherManager(writer, new SearcherFactory());
IndexSearcher is = sm.acquire();
System.out.println(" Bad news Ref1 cnt is " +
is.getIndexReader().getRefCount());
sm.release(is);

deleteData(writer, true);
deleteData(writer, false);

//is.getIndexReader().close();
}
writer.close();
} catch (IOException e) {
}

deleteData() is like so. Its goal is to delete half of the index with each
call. So after 2 calls all the docs are deleted.

MultiFieldQueryParser parser = new MultiFieldQueryParser(fields, analyzer);
Query q = parser.parse(queries_str);
if (q != null) {
writer.deleteDocuments(q);
writer.deleteUnusedFiles();
writer.forceMergeDeletes();
writer.commit();
System.out.println(" Attempted delete and committed...");
} else {
System.out.println(" Delete requested but data incorrect...");
}

My goal is to test disk reclaim (file deletes). I notice that when when
is.getIndexReader().close() is commented out (see in the main madness loop)
the files remain but when reader close is called, the files get deleted. Is
that expected? I thought searchermanager acquire/release should free the
files up (meaning indexreader will not hold on to file handles).

Now as far as the streaminfo is concerned, what I see (pasted below)
between the madness loop (when indexreader is closed) which I dont see when
the indexreader is not closed (when the files remain). Also at the end of
the madness loop, with reader.close() command alive, I am left with only
couple of files (the behavior I want).

IFD 0 [2017-11-21T03:47:08.983Z; main]:   DecRef "_1.cfs": pre-decr count
is 1
IFD 0 [2017-11-21T03:47:08.983Z; main]:   DecRef "_0.cfe": pre-decr count
is 1
IFD 0 [2017-11-21T03:47:08.984Z; main]:   DecRef "_0.si": pre-decr count is
1
IFD 0 [2017-11-21T03:47:08.984Z; main]:   DecRef "_1.cfe": pre-decr count
is 1
IFD 0 [2017-11-21T03:47:08.984Z; main]:   DecRef "_1.si": pre-decr count is
1
IFD 0 [2017-11-21T03:47:08.984Z; main]:   DecRef "_0.cfs": pre-decr count
is 1
IFD 0 [2017-11-21T03:47:08.984Z; main]: delete [_1.cfs, _0.cfe, _0.si,
_1.cfe, _1.si, _0.cfs]
IW 0 [2017-11-21T03:47:08.987Z; main]: decRefDeleter for NRT reader
version=5 segments=_0(6.6.2):c95218 _1(6.6.2):c4781

Also does my program structure look ok? Specifically

a) Do I need to create the SearcherManager every time like I have done or
can I pull it out of the madness loop?
b) Should I be calling the deleteUnusedFiles() and forceMergeDeletes() or
are those redundant calls?

Thanks for any insight.

Reply via email to