OK, thanks for the update Mark.
I'd recommend putting "request.close()" inside a finally clause, and
the "searcher.close()"seems incorrect (will lead to premature close).
-Yonik
On Dec 26, 2007 11:46 AM, Mark Baird <[EMAIL PROTECTED]> wrote:
> Yonik, to be more specific, I'm not using a custom request handler. I've
> just got a Quartz job running periodically inside the Solr webapp that goes
> out and pulls down updates to Solr from our database. I just expanded the
> solr .war file and created a custom version with the Spring jars and my own
> code added in. As for what I did to fix my open file handle issue:
>
> Old code with the stale file handles:
> public static String getLastTimestamp(String timestampField) throws
> IOException
> {
> Map<String, String[]> args = new HashMap<String, String[]>();
> args.put("q", new String[] {"*:*"}); // Query all documents
> args.put("sort", new String[] {timestampField + " desc"}); // Sort
> by timestamp, descending
> args.put("rows", new String[] {"1"}); // Just return the top
> document
>
> SolrCore core = SolrCore.getSolrCore();
> SolrQueryRequest request = new LocalSolrQueryRequest(core, args);
> SolrRequestHandler handler = core.getRequestHandler(
> request.getQueryType());
> SolrQueryResponse response = new SolrQueryResponse();
> core.execute(handler, request, response);
>
> DocSlice docSlice = (DocSlice) response.getValues().get("response");
>
> SolrIndexSearcher searcher = request.getSearcher();
> Integer docId = docSlice.iterator().next();
> Set<String> fields = new HashSet<String>();
> fields.add(timestampField); // Just return the timestamp field
> values
>
> Document doc = searcher.doc(docId, fields);
> String timestamp = doc.get(timestampField);
>
> return timestamp;
> }
>
> New code:
> public static String getLastTimestamp(String timestampField) throws
> IOException
> {
> Map<String, String[]> args = new HashMap<String, String[]>();
> args.put("q", new String[] {"*:*"}); // Query all documents
> args.put("sort", new String[] {timestampField + " desc"}); // Sort
> by timestamp, descending
> args.put("rows", new String[] {"1"}); // Just return the top
> document
>
> SolrCore core = SolrCore.getSolrCore();
> SolrQueryRequest request = new LocalSolrQueryRequest(core, args);
> SolrRequestHandler handler = core.getRequestHandler(
> request.getQueryType());
> SolrQueryResponse response = new SolrQueryResponse();
> core.execute(handler, request, response);
>
> DocSlice docSlice = (DocSlice) response.getValues().get("response");
>
> SolrIndexSearcher searcher = request.getSearcher();
> Integer docId = docSlice.iterator().next();
> Set<String> fields = new HashSet<String>();
> fields.add(timestampField); // Just return the timestamp field
> values
>
> Document doc = searcher.doc(docId, fields);
> String timestamp = doc.get(timestampField);
>
> request.close();
> searcher.close();
>
> return timestamp;
> }
>
>
> Mark
>
> On Dec 26, 2007 11:26 AM, Yonik Seeley <[EMAIL PROTECTED]> wrote:
>
>
> > On Dec 26, 2007 11:16 AM, Mark Baird <[EMAIL PROTECTED]> wrote:
> > > Not sure, but I believe I just found the problem. It has to do with the
> > way
> > > reference counts are used in the code. Once Yonik mentioned the
> > reference
> > > count I looked through the Solr source to see how that worked. Then I
> > > looked through the custom code I've added to my Solr install and found
> > an
> > > instance of SolrQueryRequest that I wasn't calling close() on when done.
> >
> > Solr handles all the ref-counting when you use a custom request handler.
> > Are you using embedded Solr?
> >
> > -Yonik
> >
>