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
> >
>

Reply via email to