You are viewing a plain text version of this content. The canonical link for it is here.
Posted to solr-commits@lucene.apache.org by yo...@apache.org on 2007/11/19 17:38:51 UTC

svn commit: r596359 - in /lucene/solr/trunk: CHANGES.txt src/java/org/apache/solr/search/SolrIndexSearcher.java src/test/org/apache/solr/BasicFunctionalityTest.java

Author: yonik
Date: Mon Nov 19 08:38:50 2007
New Revision: 596359

URL: http://svn.apache.org/viewvc?rev=596359&view=rev
Log:
SOLR-413: cap lastDocRequested at maxDoc()

Modified:
    lucene/solr/trunk/CHANGES.txt
    lucene/solr/trunk/src/java/org/apache/solr/search/SolrIndexSearcher.java
    lucene/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java

Modified: lucene/solr/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/CHANGES.txt?rev=596359&r1=596358&r2=596359&view=diff
==============================================================================
--- lucene/solr/trunk/CHANGES.txt (original)
+++ lucene/solr/trunk/CHANGES.txt Mon Nov 19 08:38:50 2007
@@ -211,6 +211,9 @@
  
 12. SOLR-393: Removed duplicate contentType from raw-schema.jsp. (bill)
 
+13. SOLR-413: Requesting a large numbers of documents to be returned (limit)
+    can result in an out-of-memory exception, even for a small index. (yonik)
+
 Other Changes
  1. SOLR-135: Moved common classes to org.apache.solr.common and altered the
     build scripts to make two jars: apache-solr-1.3.jar and 

Modified: lucene/solr/trunk/src/java/org/apache/solr/search/SolrIndexSearcher.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/java/org/apache/solr/search/SolrIndexSearcher.java?rev=596359&r1=596358&r2=596359&view=diff
==============================================================================
--- lucene/solr/trunk/src/java/org/apache/solr/search/SolrIndexSearcher.java (original)
+++ lucene/solr/trunk/src/java/org/apache/solr/search/SolrIndexSearcher.java Mon Nov 19 08:38:50 2007
@@ -37,7 +37,6 @@
 import java.util.*;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-import org.apache.solr.core.SolrInfoMBean.Category;
 
 
 /**
@@ -707,8 +706,10 @@
    */
   private void getDocListC(DocListAndSet out, Query query, List<Query> filterList, DocSet filter, Sort lsort, int offset, int len, int flags) throws IOException {
     QueryResultKey key=null;
-    int maxDoc = offset + len;
-    int supersetMaxDoc=maxDoc;
+    int maxDocRequested = offset + len;
+    // check for overflow, and check for # docs in index
+    if (maxDocRequested < 0 || maxDocRequested > maxDoc()) maxDocRequested = maxDoc();
+    int supersetMaxDoc= maxDocRequested;
     DocList superset;
 
 
@@ -752,10 +753,11 @@
         // next resultWindowSize for better caching.
 
         // handle 0 special case as well as avoid idiv in the common case.
-        if (maxDoc < queryResultWindowSize) {
+        if (maxDocRequested < queryResultWindowSize) {
           supersetMaxDoc=queryResultWindowSize;
         } else {
-          supersetMaxDoc = ((maxDoc-1)/queryResultWindowSize + 1)*queryResultWindowSize;
+          supersetMaxDoc = ((maxDocRequested -1)/queryResultWindowSize + 1)*queryResultWindowSize;
+          if (supersetMaxDoc < 0) supersetMaxDoc=maxDocRequested;
         }
     }
 
@@ -819,7 +821,9 @@
 
 
   private DocList getDocListNC(Query query, DocSet filter, Sort lsort, int offset, int len, int flags) throws IOException {
-    final int lastDocRequested = offset+len;
+    int last = offset+len;
+    if (last < 0 || last > maxDoc()) last=maxDoc();
+    final int lastDocRequested = last;
     int nDocsReturned;
     int totalHits;
     float maxScore;
@@ -977,7 +981,9 @@
   // the DocSet returned is for the query only, without any filtering... that way it may
   // be cached if desired.
   private DocSet getDocListAndSetNC(DocListAndSet out, Query query, DocSet filter, Sort lsort, int offset, int len, int flags) throws IOException {
-    final int lastDocRequested = offset+len;
+    int last = offset+len;
+    if (last < 0 || last > maxDoc()) last=maxDoc();
+    final int lastDocRequested = last;
     int nDocsReturned;
     int totalHits;
     float maxScore;

Modified: lucene/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java
URL: http://svn.apache.org/viewvc/lucene/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java?rev=596359&r1=596358&r2=596359&view=diff
==============================================================================
--- lucene/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java (original)
+++ lucene/solr/trunk/src/test/org/apache/solr/BasicFunctionalityTest.java Mon Nov 19 08:38:50 2007
@@ -145,6 +145,17 @@
       assertU(a, a);
     }
     assertU(commit());
+
+    // test maxint
+    assertQ(req("q","id:[100 TO 110]", "rows","2147483647")
+            ,"//*[@numFound='4']"
+            );
+
+    // test big limit
+    assertQ(req("q","id:[100 TO 111]", "rows","1147483647")
+            ,"//*[@numFound='4']"
+            );
+
     assertQ(req("id:[100 TO 110]")
             ,"//*[@numFound='4']"
             );