Ram has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/56354


Change subject: Bug: 43544: Improve error handling to not hide internal errors.
......................................................................

Bug: 43544: Improve error handling to not hide internal errors.

Change error handling to set the error flag when invoking certain functions
such as searchPart() and highlight(); the log files currently show errors
from these functions. There are a couple more such as getFuzzy() and
similar() that may need analogous changes but we currently do not see any
issues from these in the log files, so they are deferred till later.

Bug: 43544
Change-Id: Ibeef63f45a3276e870afbcadbd08c7bd2967b9e6
---
M src/org/wikimedia/lsearch/interoperability/RMIMessengerClient.java
M src/org/wikimedia/lsearch/search/SearchEngine.java
2 files changed, 69 insertions(+), 23 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/operations/debs/lucene-search-2 
refs/changes/54/56354/1

diff --git a/src/org/wikimedia/lsearch/interoperability/RMIMessengerClient.java 
b/src/org/wikimedia/lsearch/interoperability/RMIMessengerClient.java
index 4c25489..9b2ed8a 100644
--- a/src/org/wikimedia/lsearch/interoperability/RMIMessengerClient.java
+++ b/src/org/wikimedia/lsearch/interoperability/RMIMessengerClient.java
@@ -184,7 +184,7 @@
                }
        }
        
-       public HighlightPack searchPart(IndexId iid, String searchterm, Query 
query, FilterWrapper filter, int offset, int limit, boolean explain, String 
host){
+       public HighlightPack searchPart(IndexId iid, String searchterm, Query 
query, FilterWrapper filter, int offset, int limit, boolean explain, String 
host) throws Exception {
                try {
                        RMIMessenger r = messengerFromCache(host);
                        log.debug("Calling 
searchPart("+iid+",("+query+"),"+offset+","+limit+") on "+host);
@@ -193,11 +193,9 @@
                        return res;
                } catch (Exception e) {
                        recheckRemote(iid,host);
-                       HighlightPack pack = new HighlightPack(new 
SearchResults());
-                       pack.res.retry();                       
                        log.warn("Error invoking 
searchPart("+iid+",(term="+searchterm+"),(q="+query+"),"+offset+","+limit+") on 
"+host+" : "+e.getMessage(),e);
                        e.printStackTrace();
-                       return pack;
+                       throw e;
                }
        }
        
@@ -255,7 +253,8 @@
                } catch(Exception e){
                        log.warn("Exception highligthing words="+words+" on 
host="+host, e);
                        recheckRemote(IndexId.get(dbrole).getHighlight(),host);
-                       return new Highlight.ResultSet(new 
HashMap<String,HighlightResult>(),new HashSet<String>(),new 
HashSet<String>(),false,0,new HashSet<String>(),false);
+                       //return new Highlight.ResultSet(new 
HashMap<String,HighlightResult>(),new HashSet<String>(),new 
HashSet<String>(),false,0,new HashSet<String>(),false);
+                       return null;
                }               
        }
        
@@ -270,7 +269,7 @@
                        }
                        recheckRemote(dbrole,host);
                        SearchResults res = new SearchResults();
-                       res.setErrorMsg("Error searching titles: 
"+e.getMessage());                     
+                       res.setErrorMsg("Error searching titles: 
"+e.getMessage());
                        log.warn("Error invoking remote method searchTitles on 
host "+host+" : "+e.getMessage(),e);
                        return res;
                }
diff --git a/src/org/wikimedia/lsearch/search/SearchEngine.java 
b/src/org/wikimedia/lsearch/search/SearchEngine.java
index e66645f..bf5e24c 100644
--- a/src/org/wikimedia/lsearch/search/SearchEngine.java
+++ b/src/org/wikimedia/lsearch/search/SearchEngine.java
@@ -19,7 +19,6 @@
 import org.apache.lucene.index.Term;
 import org.apache.lucene.index.TermDocs;
 import org.apache.lucene.index.TermEnum;
-import org.apache.lucene.queryParser.ParseException;
 import org.apache.lucene.search.ArticleNamespaceScaling;
 import org.apache.lucene.search.Query;
 import org.apache.lucene.search.Searchable;
@@ -85,9 +84,16 @@
        /** dbname -> ns_index -> ns_string */
        protected static Hashtable<String,Hashtable<Integer,String>> 
dbNamespaceNames = new Hashtable<String,Hashtable<Integer,String>>();
        
+       /** non-existent host name */
+       protected String nullHost;
+
        public SearchEngine(){
                if(config == null)
                        config = Configuration.open();
+
+               nullHost = config.getString( "Search", "nullHost", "" );    // 
non-existent host
+               log.info( "nullHost = " + nullHost );
+
                if(global == null){
                        global = GlobalConfiguration.getInstance();
                        maxlimit = global.getMaxSearchLimit();
@@ -682,15 +688,38 @@
                                                }
                                                // query 
                                                Wildcards wildcards = new 
Wildcards(piid,host,exactCase);
-                                               q = 
parseQuery(searchterm,parser,iid,raw,nsfw,searchAll,wildcards);
-                                               
-                                               RMIMessengerClient messenger = 
new RMIMessengerClient();                                                
-                                               HighlightPack pack = 
messenger.searchPart(piid,searchterm,q,nsfw,offset,limit,explain,host);
+                                               HighlightPack pack = null;
+                                               try {
+                                                       // parseQuery() can 
fail with:
+                                                       // RuntimeException: 
Trying to extract field from zero-length list of terms
+                                                       // at 
org.wikimedia.lsearch.analyzers.WikiQueryParser.extractField
+                                                       //
+                                                       // searchPart() can 
fail with:
+                                                       // NullPointerException 
at org.apache.lucene.search.Searcher.createWeight
+                                                       //
+                                                       q = parseQuery( 
searchterm, parser, iid, raw, nsfw, searchAll, wildcards);
+                                                       RMIMessengerClient 
messenger = new RMIMessengerClient();
+                                                       pack = 
messenger.searchPart(piid,searchterm,q,nsfw,offset,limit,explain,host);
+                                               } catch (Exception e) {
+                                                       res = new 
SearchResults();
+                                                       e.printStackTrace();
+                                                       res.setErrorMsg( 
"Internal error in SearchEngine: " + e.getMessage() );
+                                                       log.error( "Internal 
error in SearchEngine -- parseQuery or " +
+                                                                  
"messenger.searchPart: searchterm = " + searchterm +
+                                                                  
e.getMessage(), e );
+                                                       return res;
+                                               }
                                                res = pack.res;
                                                
res.addInfo("search",formatHost(host));
                                                if(!searchOnly){
                                                        
highlight(iid,q,parser.getWordsClean(),pack.terms,pack.dfs,pack.maxDoc,res,exactCase,null,parser.hasPhrases(),false,commonsWiki);
+                                                       if ( ! res.isSuccess() 
) {
+                                                               return res;
+                                                       }
                                                        
fetchTitles(res,searchterm,nsfw,iid,parser,offset,iwoffset,iwlimit,explain);
+                                                       if ( ! res.isSuccess() 
) {
+                                                               return res;
+                                                       }
                                                        
suggest(iid,searchterm,parser,res,offset,nsfw);
                                                }
                                                return res;
@@ -716,14 +745,23 @@
                        try{
                                // query 
                                Wildcards wildcards = new 
Wildcards(searcher.getAllHosts(),exactCase);
+                               // can fail with "RuntimeException: Trying to 
extract field from zero-length list of terms"
                                q = 
parseQuery(searchterm,parser,iid,raw,nsfw,searchAll,wildcards);
                                                                
+                               // can fail with "NullPointerException at 
org.apache.lucene.search.MultiSearcherBase.rewrite"
                                hits = 
searcher.search(q,nsfw.getFilterOrNull(),offset+limit);
+
                                res = 
makeSearchResults(searcher,hits,offset,limit,iid,searchterm,q,searchStart,explain);
                                
res.addInfo("search",formatHosts(searcher.getAllHosts().values()));
                                if(!searchOnly){
                                        
highlight(iid,q,parser.getWordsClean(),searcher,parser.getHighlightTerms(),res,exactCase,parser.hasPhrases(),false,commonsWiki);
+                                       if ( ! res.isSuccess() ) {
+                                               return res;
+                                       }
                                        
fetchTitles(res,searchterm,nsfw,iid,parser,offset,iwoffset,iwlimit,explain);
+                                       if ( ! res.isSuccess() ) {
+                                               return res;
+                                       }
                                        
suggest(iid,searchterm,parser,res,offset,nsfw);
                                }
                                return res;
@@ -736,15 +774,10 @@
                                } */
                                e.printStackTrace();
                                res = new SearchResults();
-                               res.retry();
-                               log.warn("Retry, temporal error for query: 
["+searchterm+"] on "+iid+" : "+e.getMessage(),e);
+                               res.setErrorMsg( "Internal error in 
SearchEngine: " + e.getMessage() );
+                               log.error( "Internal error in SearchEngine -- 
parseQuery/search: searchterm = " + searchterm + e.getMessage(), e );
                                return res;
                        }                       
-               } catch(ParseException e){
-                       res = new SearchResults();
-                       res.setErrorMsg("Error parsing query: "+searchterm);
-                       log.error("Cannot parse query: "+searchterm+", error: 
"+e.getMessage(),e);
-                       return res;
                } catch (Exception e) {
                        res = new SearchResults();
                        e.printStackTrace();
@@ -794,6 +827,10 @@
                                return; // no available 
                        Suggest.ExtraInfo info = new 
Suggest.ExtraInfo(res.getPhrases(),res.getFoundInContext(),res.getFoundInTitles(),res.getFirstHitRank(),res.isFoundAllInAltTitle());
                        SuggestQuery sq = 
messenger.suggest(host,iid.toString(),searchterm,tokens,info,nsfw.getNamespaceFilter());
+                       if ( null == sq ) {
+                               res.setErrorMsg( "Error invoking suggest() on " 
+ host );
+                               return;
+                       }
                        res.setSuggest(sq);     
                        res.addInfo("suggest",formatHost(host));
                }
@@ -807,7 +844,8 @@
                return true;
        }
                
-       protected Query parseQuery(String searchterm, WikiQueryParser parser, 
IndexId iid, boolean raw, FilterWrapper nsfw, boolean searchAll, Wildcards 
wildcards) throws ParseException {
+       protected Query parseQuery(String searchterm, WikiQueryParser parser, 
IndexId iid, boolean raw, FilterWrapper nsfw,
+                                  boolean searchAll, Wildcards wildcards) {
                Query q = null;
                Fuzzy fuzzy = null;
                if(iid.hasSpell()){
@@ -900,14 +938,16 @@
                        SearchResults r = 
makeTitlesSearchResults(searcher,hits,iwoffset,iwlimit,main,searchterm,q,searchStart,explain);
                        
highlightTitles(main,q,words,searcher,r,parser.hasWildcards(),false,null);
 
-                       if(r.isSuccess()){
+                       if ( r.isSuccess() ) {
                                res.setTitles(r.getResults());                  
        
                                //if(r.isFoundAllInTitle())
                                //      res.setFoundAllInTitle(true);
                                //res.addToFirstHitRank(r.getNumHits());
-                       } else
+                               res.addInfo( "interwiki", formatHosts( 
searcher.getAllHosts().values() ) );
+                       } else {
                                log.error("Error getting grouped titles search 
results: "+r.getErrorMsg());
-                       
res.addInfo("interwiki",formatHosts(searcher.getAllHosts().values()));
+                               res.setErrorMsg( "highlightTitles failed: " + 
r.getErrorMsg() );
+                       }
                        
                } catch(Exception e){
                        e.printStackTrace();
@@ -1044,6 +1084,9 @@
                int[] df = searcher.docFreqs(terms); 
                int maxDoc = searcher.maxDoc();
                
highlight(iid,q,words,terms,df,maxDoc,res,false,null,sortByPhrases,alwaysIncludeFirst,commonsWiki);
+               if ( ! res.isSuccess() ) {
+                       return;    // highlight failed
+               }
                resolveInterwikiNamespaces(res,iid);
        }
        
@@ -1089,9 +1132,13 @@
                                } else{ 
                                        // remote call
                                        String host = cache.getRandomHost(hiid);
-                                       if(host == null)
+                                       if ( host == null || host.equals( 
nullHost ) )
                                                continue; // no available hosts
                                        rs = 
messenger.highlight(host,e.getValue(),hiid.toString(),terms,df,maxDoc,words,exactCase,sortByPhrases,alwaysIncludeFirst);
+                                       if ( null == rs ) {
+                                               res.setErrorMsg( "Internal 
error when highlighting, host = %s" + host );
+                                               return;
+                                       }
                                        hosts.add(host);
                                }
                                results.putAll(rs.highlighted);

-- 
To view, visit https://gerrit.wikimedia.org/r/56354
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibeef63f45a3276e870afbcadbd08c7bd2967b9e6
Gerrit-PatchSet: 1
Gerrit-Project: operations/debs/lucene-search-2
Gerrit-Branch: master
Gerrit-Owner: Ram <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to