Author: ssmiweve Date: 2008-11-28 20:51:03 +0100 (Fri, 28 Nov 2008) New Revision: 7001
Modified: branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/FastQueryMatchingEvaluatorFactory.java branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/JepEvaluatorFactory.java branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/RegExpEvaluatorFactory.java branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/SolrEvaluatorFactory.java branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/VeryFastTokenEvaluator.java Log: performance improvements: check for empty instance before going into writeLock configure timeout on waiting for construction thread Modified: branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/FastQueryMatchingEvaluatorFactory.java =================================================================== --- branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/FastQueryMatchingEvaluatorFactory.java 2008-11-28 11:52:30 UTC (rev 7000) +++ branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/FastQueryMatchingEvaluatorFactory.java 2008-11-28 19:51:03 UTC (rev 7001) @@ -25,6 +25,8 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import no.sesat.search.site.SiteKeyedFactoryInstantiationException; import org.apache.log4j.Logger; import org.apache.log4j.MDC; @@ -109,7 +111,7 @@ private VeryFastTokenEvaluator getFastEvaluator() throws EvaluationException { try { - fastEvaluatorCreator.get(); + fastEvaluatorCreator.get(1000, TimeUnit.MILLISECONDS); } catch (InterruptedException ex) { LOG.error(ERR_FAST_EVALUATOR_CREATOR_INTERRUPTED, ex); @@ -117,6 +119,9 @@ } catch (ExecutionException ex) { LOG.error(ERR_FAST_EVALUATOR_CREATOR_INTERRUPTED, ex); throw new EvaluationException(ERR_FAILED_CONSTRUCTING_FAST_EVALUATOR, ex); + } catch (TimeoutException ex) { + LOG.error(ERR_FAST_EVALUATOR_CREATOR_INTERRUPTED, ex); + throw new EvaluationException(ERR_FAILED_CONSTRUCTING_FAST_EVALUATOR, ex); } if( null == fastEvaluator ){ throw new EvaluationException(ERR_FAILED_CONSTRUCTING_FAST_EVALUATOR, new NullPointerException()); Modified: branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/JepEvaluatorFactory.java =================================================================== --- branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/JepEvaluatorFactory.java 2008-11-28 11:52:30 UTC (rev 7000) +++ branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/JepEvaluatorFactory.java 2008-11-28 19:51:03 UTC (rev 7001) @@ -95,58 +95,59 @@ )); } - try{ - EVALUATORS_LOCK.writeLock().lock(); + if(null == EVALUATORS.get(site)){ - if(null == EVALUATORS.get(site)){ + try{ + EVALUATORS_LOCK.writeLock().lock(); - // create map entry for this site - EVALUATORS.put(site, new HashMap<TokenPredicate,JepTokenEvaluator>()); - final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setValidating(false); - final DocumentBuilder builder = factory.newDocumentBuilder(); + // create map entry for this site + EVALUATORS.put(site, new HashMap<TokenPredicate,JepTokenEvaluator>()); - final DocumentLoader loader = cxt.newDocumentLoader(cxt, JEP_EVALUATOR_XMLFILE, builder); + final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(false); + final DocumentBuilder builder = factory.newDocumentBuilder(); - loader.abut(); - LOG.info("Parsing " + JEP_EVALUATOR_XMLFILE + " started"); - final Document doc = loader.getDocument(); + final DocumentLoader loader = cxt.newDocumentLoader(cxt, JEP_EVALUATOR_XMLFILE, builder); - assert null != doc : "No document loaded for " + site.getName(); + loader.abut(); + LOG.info("Parsing " + JEP_EVALUATOR_XMLFILE + " started"); + final Document doc = loader.getDocument(); - final Element root = doc.getDocumentElement(); - if(null != root){ - final NodeList evaluators = root.getElementsByTagName("evaluator"); - for (int i = 0; i < evaluators.getLength(); ++i) { + assert null != doc : "No document loaded for " + site.getName(); - final Element evaluator = (Element) evaluators.item(i); + final Element root = doc.getDocumentElement(); + if(null != root){ + final NodeList evaluators = root.getElementsByTagName("evaluator"); + for (int i = 0; i < evaluators.getLength(); ++i) { - final String tokenName = evaluator.getAttribute("token"); - LOG.info(" ->[EMAIL PROTECTED]: " + tokenName); + final Element evaluator = (Element) evaluators.item(i); - TokenPredicate token; - try{ - token = TokenPredicateUtility.getTokenPredicate(tokenName); + final String tokenName = evaluator.getAttribute("token"); + LOG.info(" ->[EMAIL PROTECTED]: " + tokenName); - }catch(IllegalArgumentException iae){ - LOG.debug(tokenName + " does not exist. Will create it. Underlying exception was " + iae); - token = TokenPredicateUtility.createAnonymousTokenPredicate( - tokenName); - } + TokenPredicate token; + try{ + token = TokenPredicateUtility.getTokenPredicate(tokenName); - final boolean queryDep = Boolean.parseBoolean(evaluator.getAttribute("query-dependant")); - LOG.info(" ->[EMAIL PROTECTED]: " + queryDep); + }catch(IllegalArgumentException iae){ + LOG.debug(tokenName + " does not exist. Will create it. Underlying exception was " + iae); + token = TokenPredicateUtility.createAnonymousTokenPredicate( + tokenName); + } - final JepTokenEvaluator jepTokenEvaluator = new JepTokenEvaluator("*", queryDep); - EVALUATORS.get(site).put(token, jepTokenEvaluator); + final boolean queryDep = Boolean.parseBoolean(evaluator.getAttribute("query-dependant")); + LOG.info(" ->[EMAIL PROTECTED]: " + queryDep); + final JepTokenEvaluator jepTokenEvaluator = new JepTokenEvaluator("*", queryDep); + EVALUATORS.get(site).put(token, jepTokenEvaluator); + + } } - } - LOG.info("Parsing " + JEP_EVALUATOR_XMLFILE + " finished"); + LOG.info("Parsing " + JEP_EVALUATOR_XMLFILE + " finished"); + }finally{ + EVALUATORS_LOCK.writeLock().unlock(); } - }finally{ - EVALUATORS_LOCK.writeLock().unlock(); } } Modified: branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/RegExpEvaluatorFactory.java =================================================================== --- branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/RegExpEvaluatorFactory.java 2008-11-28 11:52:30 UTC (rev 7000) +++ branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/RegExpEvaluatorFactory.java 2008-11-28 19:51:03 UTC (rev 7001) @@ -99,76 +99,77 @@ )); } - try{ - EVALUATORS_LOCK.writeLock().lock(); + if(null == EVALUATORS.get(site)){ - if(null == EVALUATORS.get(site)){ - // create map entry for this site - EVALUATORS.put(site, new HashMap<TokenPredicate,RegExpTokenEvaluator>()); + try{ + EVALUATORS_LOCK.writeLock().lock(); + // create map entry for this site + EVALUATORS.put(site, new HashMap<TokenPredicate,RegExpTokenEvaluator>()); - final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - factory.setValidating(false); - final DocumentBuilder builder = factory.newDocumentBuilder(); - final DocumentLoader loader - = cxt.newDocumentLoader(cxt, REGEXP_EVALUATOR_XMLFILE, builder); - loader.abut(); - LOG.info("Parsing " + REGEXP_EVALUATOR_XMLFILE + " started"); - final Document doc = loader.getDocument(); + final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setValidating(false); + final DocumentBuilder builder = factory.newDocumentBuilder(); + final DocumentLoader loader + = cxt.newDocumentLoader(cxt, REGEXP_EVALUATOR_XMLFILE, builder); - assert null != doc : "No document loaded for " + site.getName(); + loader.abut(); + LOG.info("Parsing " + REGEXP_EVALUATOR_XMLFILE + " started"); + final Document doc = loader.getDocument(); - final Element root = doc.getDocumentElement(); - if(null != root){ - final NodeList evaluators = root.getElementsByTagName("evaluator"); - for (int i = 0; i < evaluators.getLength(); ++i) { + assert null != doc : "No document loaded for " + site.getName(); - final Element evaluator = (Element) evaluators.item(i); + final Element root = doc.getDocumentElement(); + if(null != root){ + final NodeList evaluators = root.getElementsByTagName("evaluator"); + for (int i = 0; i < evaluators.getLength(); ++i) { - final String tokenName = evaluator.getAttribute("token"); - LOG.info(" ->[EMAIL PROTECTED]: " + tokenName); + final Element evaluator = (Element) evaluators.item(i); - TokenPredicate token; - try{ - token = TokenPredicateUtility.getTokenPredicate(tokenName); + final String tokenName = evaluator.getAttribute("token"); + LOG.info(" ->[EMAIL PROTECTED]: " + tokenName); - }catch(IllegalArgumentException iae){ - LOG.debug(tokenName + " does not exist. Will create it. Underlying exception was " + iae); - token = TokenPredicateUtility.createAnonymousTokenPredicate( - tokenName); - } + TokenPredicate token; + try{ + token = TokenPredicateUtility.getTokenPredicate(tokenName); - final boolean queryDep = Boolean.parseBoolean(evaluator.getAttribute("query-dependant")); - LOG.info(" ->[EMAIL PROTECTED]: " + queryDep); + }catch(IllegalArgumentException iae){ + LOG.debug(tokenName + " does not exist. Will create it. Underlying exception was " + iae); + token = TokenPredicateUtility.createAnonymousTokenPredicate( + tokenName); + } - final Collection<Pattern> compiled = new ArrayList<Pattern>(); + final boolean queryDep = Boolean.parseBoolean(evaluator.getAttribute("query-dependant")); + LOG.info(" ->[EMAIL PROTECTED]: " + queryDep); - final NodeList patterns = evaluator.getElementsByTagName("pattern"); - for (int j = 0; j < patterns.getLength(); ++j) { - final Element pattern = (Element) patterns.item(j); + final Collection<Pattern> compiled = new ArrayList<Pattern>(); - final String expression = pattern.getFirstChild().getNodeValue(); - LOG.info(" --->pattern: " + expression); + final NodeList patterns = evaluator.getElementsByTagName("pattern"); + for (int j = 0; j < patterns.getLength(); ++j) { + final Element pattern = (Element) patterns.item(j); - // (^|\s) or ($|\s) is neccessary to avoid matching fragments of words. - final String prefix = expression.startsWith("^") ? "" : "(^|\\s)"; - final String suffix = expression.endsWith("$") ? "" : "(\\:|$|\\s)"; - // compile pattern - final Pattern p = Pattern.compile(prefix + expression + suffix, REG_EXP_OPTIONS); - compiled.add(p); - } + final String expression = pattern.getFirstChild().getNodeValue(); + LOG.info(" --->pattern: " + expression); - final RegExpTokenEvaluator regExpTokenEvaluator = new RegExpTokenEvaluator(compiled, queryDep); - EVALUATORS.get(site).put(token, regExpTokenEvaluator); + // (^|\s) or ($|\s) is neccessary to avoid matching fragments of words. + final String prefix = expression.startsWith("^") ? "" : "(^|\\s)"; + final String suffix = expression.endsWith("$") ? "" : "(\\:|$|\\s)"; + // compile pattern + final Pattern p = Pattern.compile(prefix + expression + suffix, REG_EXP_OPTIONS); + compiled.add(p); + } + final RegExpTokenEvaluator regExpTokenEvaluator = new RegExpTokenEvaluator(compiled, queryDep); + EVALUATORS.get(site).put(token, regExpTokenEvaluator); + + } } - } - LOG.info("Parsing " + REGEXP_EVALUATOR_XMLFILE + " finished"); + LOG.info("Parsing " + REGEXP_EVALUATOR_XMLFILE + " finished"); + + }finally{ + EVALUATORS_LOCK.writeLock().unlock(); } - - }finally{ - EVALUATORS_LOCK.writeLock().unlock(); } } Modified: branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/SolrEvaluatorFactory.java =================================================================== --- branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/SolrEvaluatorFactory.java 2008-11-28 11:52:30 UTC (rev 7000) +++ branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/SolrEvaluatorFactory.java 2008-11-28 19:51:03 UTC (rev 7001) @@ -28,6 +28,8 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; @@ -214,73 +216,73 @@ )); } - try{ - LIST_NAMES_LOCK.writeLock().lock(); + if(null == LIST_NAMES.get(site)){ - if(null == LIST_NAMES.get(site)){ + try{ + LIST_NAMES_LOCK.writeLock().lock(); - // create map entry for this site - LIST_NAMES.put(site, new HashMap<TokenPredicate,String[]>()); + // create map entry for this site + LIST_NAMES.put(site, new HashMap<TokenPredicate,String[]>()); - // initialise this site's configuration - final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - final DocumentBuilder builder = factory.newDocumentBuilder(); + // initialise this site's configuration + final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + final DocumentBuilder builder = factory.newDocumentBuilder(); - final DocumentLoader loader = cxt.newDocumentLoader(cxt, SOLR_EVALUATOR_XMLFILE, builder); - loader.abut(); + final DocumentLoader loader = cxt.newDocumentLoader(cxt, SOLR_EVALUATOR_XMLFILE, builder); + loader.abut(); - LOG.info("Parsing " + SOLR_EVALUATOR_XMLFILE + " started"); - final Map<TokenPredicate,String[]> listNames = LIST_NAMES.get(site); - final Document doc = loader.getDocument(); + LOG.info("Parsing " + SOLR_EVALUATOR_XMLFILE + " started"); + final Map<TokenPredicate,String[]> listNames = LIST_NAMES.get(site); + final Document doc = loader.getDocument(); - if(null != doc && null != doc.getDocumentElement()){ + if(null != doc && null != doc.getDocumentElement()){ - final Element root = doc.getDocumentElement(); - final NodeList lists = root.getElementsByTagName("list"); - for (int i = 0; i < lists.getLength(); ++i) { + final Element root = doc.getDocumentElement(); + final NodeList lists = root.getElementsByTagName("list"); + for (int i = 0; i < lists.getLength(); ++i) { - final Element list = (Element) lists.item(i); + final Element list = (Element) lists.item(i); - final String tokenName = list.getAttribute("token"); - LOG.info(" ->[EMAIL PROTECTED]: " + tokenName); + final String tokenName = list.getAttribute("token"); + LOG.info(" ->[EMAIL PROTECTED]: " + tokenName); - TokenPredicate token; - try{ - token = TokenPredicateUtility.getTokenPredicate(tokenName); + TokenPredicate token; + try{ + token = TokenPredicateUtility.getTokenPredicate(tokenName); - }catch(IllegalArgumentException iae){ - LOG.debug(tokenName + " does not exist. Will create it. Underlying exception was " + iae); - token = TokenPredicateUtility.createAnonymousTokenPredicate(tokenName); - } + }catch(IllegalArgumentException iae){ + LOG.debug(tokenName + " does not exist. Will create it. Underlying exception was " + iae); + token = TokenPredicateUtility.createAnonymousTokenPredicate(tokenName); + } - final String[] listNameArr = list.getAttribute("list-name").split(","); - LOG.info(" ->lists: " + list.getAttribute("list-name")); + final String[] listNameArr = list.getAttribute("list-name").split(","); + LOG.info(" ->lists: " + list.getAttribute("list-name")); - // update each listname to the format the fast query matching servers use - if(null != listNameArr){ - for(int j = 0; j < listNameArr.length; ++j){ - listNameArr[j] = listNameArr[j]; + // update each listname to the format the fast query matching servers use + if(null != listNameArr){ + for(int j = 0; j < listNameArr.length; ++j){ + listNameArr[j] = listNameArr[j]; + } + + // put the listnames in + Arrays.sort(listNameArr, null); + listNames.put(token, listNameArr); } - // put the listnames in - Arrays.sort(listNameArr, null); - listNames.put(token, listNameArr); + } - - } - } - LOG.info("Parsing " + SOLR_EVALUATOR_XMLFILE + " finished"); + LOG.info("Parsing " + SOLR_EVALUATOR_XMLFILE + " finished"); + }finally{ + LIST_NAMES_LOCK.writeLock().unlock(); } - }finally{ - LIST_NAMES_LOCK.writeLock().unlock(); } } private SolrTokenEvaluator getSolrEvaluator() throws EvaluationException { try { - solrEvaluatorCreator.get(); + solrEvaluatorCreator.get(1000, TimeUnit.MILLISECONDS); } catch (InterruptedException ex) { LOG.error(ex.getMessage(), ex); @@ -288,6 +290,9 @@ } catch (ExecutionException ex) { LOG.error(ex.getMessage(), ex); throw new EvaluationException(ex.getMessage(), ex); + } catch (TimeoutException ex) { + LOG.error(ex.getMessage(), ex); + throw new EvaluationException(ex.getMessage(), ex); } if( null == solrEvaluator ){ throw new EvaluationException("NPE", new NullPointerException()); Modified: branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/VeryFastTokenEvaluator.java =================================================================== --- branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/VeryFastTokenEvaluator.java 2008-11-28 11:52:30 UTC (rev 7000) +++ branches/2.18/generic.sesam/query-evaluation/src/main/java/no/sesat/search/query/token/VeryFastTokenEvaluator.java 2008-11-28 19:51:03 UTC (rev 7001) @@ -279,65 +279,65 @@ )); } - try{ - LIST_NAMES_LOCK.writeLock().lock(); + if(null == LIST_NAMES.get(site)){ + try{ + LIST_NAMES_LOCK.writeLock().lock(); - if(null == LIST_NAMES.get(site)){ - // create map entry for this site - LIST_NAMES.put(site, new HashMap<TokenPredicate,String[]>()); + // create map entry for this site + LIST_NAMES.put(site, new HashMap<TokenPredicate,String[]>()); - // initialise this site's configuration - final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); - final DocumentBuilder builder = factory.newDocumentBuilder(); - final DocumentLoader loader = cxt.newDocumentLoader(cxt, VERYFAST_EVALUATOR_XMLFILE, builder); - loader.abut(); + // initialise this site's configuration + final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + final DocumentBuilder builder = factory.newDocumentBuilder(); + final DocumentLoader loader = cxt.newDocumentLoader(cxt, VERYFAST_EVALUATOR_XMLFILE, builder); + loader.abut(); - LOG.info("Parsing " + VERYFAST_EVALUATOR_XMLFILE + " started"); - final Map<TokenPredicate,String[]> listNames = LIST_NAMES.get(site); - final Document doc = loader.getDocument(); + LOG.info("Parsing " + VERYFAST_EVALUATOR_XMLFILE + " started"); + final Map<TokenPredicate,String[]> listNames = LIST_NAMES.get(site); + final Document doc = loader.getDocument(); - if(null != doc && null != doc.getDocumentElement()){ + if(null != doc && null != doc.getDocumentElement()){ - final Element root = doc.getDocumentElement(); - final NodeList lists = root.getElementsByTagName("list"); - for (int i = 0; i < lists.getLength(); ++i) { + final Element root = doc.getDocumentElement(); + final NodeList lists = root.getElementsByTagName("list"); + for (int i = 0; i < lists.getLength(); ++i) { - final Element list = (Element) lists.item(i); + final Element list = (Element) lists.item(i); - final String tokenName = list.getAttribute("token"); - LOG.info(" ->[EMAIL PROTECTED]: " + tokenName); + final String tokenName = list.getAttribute("token"); + LOG.info(" ->[EMAIL PROTECTED]: " + tokenName); - TokenPredicate token; - try{ - token = TokenPredicateUtility.getTokenPredicate(tokenName); + TokenPredicate token; + try{ + token = TokenPredicateUtility.getTokenPredicate(tokenName); - }catch(IllegalArgumentException iae){ - LOG.debug(tokenName + " does not exist. Will create it. Underlying exception was " + iae); - token = TokenPredicateUtility.createAnonymousTokenPredicate(tokenName); - } + }catch(IllegalArgumentException iae){ + LOG.debug(tokenName + " does not exist. Will create it. Underlying exception was " + iae); + token = TokenPredicateUtility.createAnonymousTokenPredicate(tokenName); + } - final String[] listNameArr = list.getAttribute("list-name").split(","); - LOG.info(" ->lists: " + list.getAttribute("list-name")); + final String[] listNameArr = list.getAttribute("list-name").split(","); + LOG.info(" ->lists: " + list.getAttribute("list-name")); - // update each listname to the format the fast query matching servers use - if(null != listNameArr){ - for(int j = 0; j < listNameArr.length; ++j){ - listNameArr[j] = LIST_PREFIX + listNameArr[j] + LIST_SUFFIX; + // update each listname to the format the fast query matching servers use + if(null != listNameArr){ + for(int j = 0; j < listNameArr.length; ++j){ + listNameArr[j] = LIST_PREFIX + listNameArr[j] + LIST_SUFFIX; + } + + // put the listnames in + Arrays.sort(listNameArr, null); + listNames.put(token, listNameArr); } - // put the listnames in - Arrays.sort(listNameArr, null); - listNames.put(token, listNameArr); + } - - } - } - LOG.info("Parsing " + VERYFAST_EVALUATOR_XMLFILE + " finished"); + LOG.info("Parsing " + VERYFAST_EVALUATOR_XMLFILE + " finished"); + }finally{ + LIST_NAMES_LOCK.writeLock().unlock(); } - }finally{ - LIST_NAMES_LOCK.writeLock().unlock(); } } _______________________________________________ Kernel-commits mailing list Kernel-commits@sesat.no http://sesat.no/mailman/listinfo/kernel-commits