From: <ap...@vh...> - 2005-09-21 17:23:31
|
Author: apevec Date: 2005-09-21 19:14:10 +0200 (Wed, 21 Sep 2005) New Revision: 889 Modified: trunk/ccm-core/src/com/arsdigita/search/CachedResultSet.java trunk/ccm-core/src/com/arsdigita/search/Search.java trunk/ccm-core/src/com/arsdigita/search/lucene/LuceneSearch.java trunk/ccm-core/src/com/arsdigita/search/ui/ResultsPane.java Log: SF patch [ 1242260 ] Fixed file descriptors leak Modified: trunk/ccm-core/src/com/arsdigita/search/CachedResultSet.java =================================================================== --- trunk/ccm-core/src/com/arsdigita/search/CachedResultSet.java 2005-09-21 17:09:00 UTC (rev 888) +++ trunk/ccm-core/src/com/arsdigita/search/CachedResultSet.java 2005-09-21 17:14:10 UTC (rev 889) @@ -32,6 +32,7 @@ private long m_time; private Document[] m_results; private String m_engine; + private ResultSet m_realResultSet = null; public CachedResultSet(QuerySpecification spec, ResultSet results, @@ -95,10 +96,10 @@ last <= m_count) { s_log.info("Requested range: " + offset + "->" + (offset + count) + " is outsize cache size " + m_results.length); - ResultSet results = Search.process(m_spec, + m_realResultSet = Search.process(m_spec, Search.NOP_RESULT_CACHE, m_engine); - return results.getDocuments(offset, count); + return m_realResultSet.getDocuments(offset, count); } return new ResultIterator(m_results, @@ -138,7 +139,11 @@ * any system resources allocated */ public void close() { - // No-op + if(m_realResultSet != null && m_realResultSet instanceof ResultSet) { + m_realResultSet.close(); + } else { + // noop + } } private class ResultIterator implements Iterator { Modified: trunk/ccm-core/src/com/arsdigita/search/Search.java =================================================================== --- trunk/ccm-core/src/com/arsdigita/search/Search.java 2005-09-21 17:09:00 UTC (rev 888) +++ trunk/ccm-core/src/com/arsdigita/search/Search.java 2005-09-21 17:14:10 UTC (rev 889) @@ -19,6 +19,7 @@ package com.arsdigita.search; import com.arsdigita.util.Assert; +import com.arsdigita.util.UncheckedWrapperException; import com.arsdigita.xml.Element; import java.util.Iterator; @@ -182,13 +183,22 @@ if (results == null) { ResultSet rawResults = processInternal(spec, engine); - Assert.exists(rawResults, ResultSet.class); - cache.put(spec, rawResults); - - // Re-fetch results, since cache may wrap them - results = (ResultSet) cache.get(spec); - if (results == null) { - results = rawResults; + try { + Assert.exists(rawResults, ResultSet.class); + cache.put(spec, rawResults); + + // Re-fetch results, since cache may wrap them + results = (ResultSet) cache.get(spec); + if (results == null) { + results = rawResults; + } else if(rawResults != null) { + rawResults.close(); + } + } catch(Exception e) { + if(rawResults != null) { + rawResults.close(); + } + throw new UncheckedWrapperException(e); } } Modified: trunk/ccm-core/src/com/arsdigita/search/lucene/LuceneSearch.java =================================================================== --- trunk/ccm-core/src/com/arsdigita/search/lucene/LuceneSearch.java 2005-09-21 17:09:00 UTC (rev 888) +++ trunk/ccm-core/src/com/arsdigita/search/lucene/LuceneSearch.java 2005-09-21 17:14:10 UTC (rev 889) @@ -100,6 +100,7 @@ * @param f a filter **/ public LuceneSearch(String searchString, Filter f) { + m_index = null; try { LuceneConfig conf = LuceneConfig.getConfig(); Analyzer analyzer = conf.getAnalyzer(); @@ -112,9 +113,14 @@ } m_hitIndex = 0; } catch (IOException ex) { + this.close(); LOG.fatal("failed the search for " + searchString, ex); } catch (ParseException ex) { + this.close(); LOG.fatal("failed the search for " + searchString, ex); + } catch (Exception ex) { + this.close(); + throw new UncheckedWrapperException(ex); } } Modified: trunk/ccm-core/src/com/arsdigita/search/ui/ResultsPane.java =================================================================== --- trunk/ccm-core/src/com/arsdigita/search/ui/ResultsPane.java 2005-09-21 17:09:00 UTC (rev 888) +++ trunk/ccm-core/src/com/arsdigita/search/ui/ResultsPane.java 2005-09-21 17:14:10 UTC (rev 889) @@ -82,56 +82,61 @@ } QuerySpecification spec = m_query.getQuerySpecification(state); - ResultSet resultSet = m_engine == null ? - Search.process(spec) : - Search.process(spec, - Search.DEFAULT_RESULT_CACHE, - m_engine); - - if (s_log.isDebugEnabled()) { - s_log.debug("Got result set " + resultSet.getClass() + - " count: " + resultSet.getCount()); - } + ResultSet resultSet = null; + try { + resultSet = m_engine == null ? + Search.process(spec) : + Search.process(spec, + Search.DEFAULT_RESULT_CACHE, + m_engine); + + if (s_log.isDebugEnabled()) { + s_log.debug("Got result set " + resultSet.getClass() + + " count: " + resultSet.getCount()); + } - Integer page = (Integer)state.getValue(m_pageNumber); - int pageNumber = (page == null ? 1 : page.intValue()); - long objectCount = resultSet.getCount(); - int pageCount = (int)Math.ceil((double)objectCount / (double)m_pageSize); + Integer page = (Integer)state.getValue(m_pageNumber); + int pageNumber = (page == null ? 1 : page.intValue()); + long objectCount = resultSet.getCount(); + int pageCount = (int)Math.ceil((double)objectCount / (double)m_pageSize); - if (pageNumber < 1) { - pageNumber = 1; - } - - if (pageNumber > pageCount) { - pageNumber = (pageCount == 0 ? 1 : pageCount); - } - - long begin = ((pageNumber-1) * m_pageSize); - int count = (int)Math.min(m_pageSize, (objectCount - begin)); - long end = begin + count; - - Iterator results = resultSet.getDocuments(begin, count); - - Element content = Search.newElement("results"); - exportAttributes(content); - - if (s_log.isDebugEnabled()) { - s_log.debug("Paginator stats\n page number:" + pageNumber + - "\n page count: "+ pageCount + "\n page size: " + - m_pageSize + "\n start " + begin + "\n end: " + - end + "\n count: "+ objectCount); - } - - content.addContent(generatePaginatorXML(state, + if (pageNumber < 1) { + pageNumber = 1; + } + + if (pageNumber > pageCount) { + pageNumber = (pageCount == 0 ? 1 : pageCount); + } + + long begin = ((pageNumber-1) * m_pageSize); + int count = (int)Math.min(m_pageSize, (objectCount - begin)); + long end = begin + count; + + Iterator results = resultSet.getDocuments(begin, count); + + Element content = Search.newElement("results"); + exportAttributes(content); + + if (s_log.isDebugEnabled()) { + s_log.debug("Paginator stats\n page number:" + pageNumber + + "\n page count: "+ pageCount + "\n page size: " + + m_pageSize + "\n start " + begin + "\n end: " + + end + "\n count: "+ objectCount); + } + + content.addContent(generatePaginatorXML(state, m_pageNumber.getName(), pageNumber, pageCount, m_pageSize, begin, end, objectCount)); - content.addContent(generateDocumentsXML(state, results)); + content.addContent(generateDocumentsXML(state, results)); - parent.addContent(content); - - resultSet.close(); + parent.addContent(content); + } finally { + if(resultSet != null) { + resultSet.close(); + } + } } protected Element generatePaginatorXML(PageState state, |