Author: bpoussin Date: 2010-12-26 16:19:52 +0100 (Sun, 26 Dec 2010) New Revision: 669 Url: http://nuiton.org/repositories/revision/wikitty/669 Log: Anomalie #1167: In memory Solr, create directory and fail if reuse Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolr.java trunk/wikitty-jdbc-impl/src/test/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolrTest.java trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/RAMDirectoryFactory.java trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/storage/solr/TreeTest.java Modified: trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java =================================================================== --- trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-12-26 15:00:45 UTC (rev 668) +++ trunk/wikitty-api/src/main/java/org/nuiton/wikitty/WikittyConfig.java 2010-12-26 15:19:52 UTC (rev 669) @@ -174,6 +174,11 @@ _("JDBC xadatasource property h2 password"), "${"+WIKITTY_STORAGE_JDBC_PASSWORD.getKey() + "}", String.class, false, false), + WIKITTY_SEARCHENGINE_SOLR_HOME( + "wikitty.searchengine.solr.home", + _("SolR directory home. You can put solr.xml config file in. If" + + " not null, replace solr.solr.home environment vairable"), + null, String.class, false, false), /* Solr config name are used directly in solr config file. If * you change it, change too in module * wikitty-solr-impl/src/main/resources/solrconfig.xml */ Modified: trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolr.java =================================================================== --- trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolr.java 2010-12-26 15:00:45 UTC (rev 668) +++ trunk/wikitty-jdbc-impl/src/main/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolr.java 2010-12-26 15:19:52 UTC (rev 669) @@ -25,6 +25,7 @@ package org.nuiton.wikitty.services; +import java.io.File; import java.util.UUID; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -54,11 +55,16 @@ // we use unique db name (this permit to use simultaneously many // WikittyServiceInMemoryJdbcSolr) - String dbName = UUID.randomUUID().toString(); + String dbName = "wikitty-tx-" + UUID.randomUUID().toString(); ApplicationConfig config = new WikittyConfig(); config.setOption(WikittyConfig.WikittyOption. WIKITTY_STORAGE_JDBC_URL.getKey(), "jdbc:h2:mem:" + dbName); + // solr meme en RAMDirectoryFactory peut creer des fichiers si + // la config est mauvaise, pour prevenir tous problemes on fixe un + // repertoire unique si jamais ca arrive pour eviter les problemes + config.setOption(WikittyConfig.WikittyOption.WIKITTY_DATA_DIR.getKey(), + config.getOption("java.io.tmpdir") + File.separator + dbName); config.setOption(WikittyConfig.WikittyOption. WIKITTY_SEARCHENGINE_SOLR_DIRECTORY_FACTORY.getKey(), RAMDirectoryFactory.class.getName()); Modified: trunk/wikitty-jdbc-impl/src/test/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolrTest.java =================================================================== --- trunk/wikitty-jdbc-impl/src/test/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolrTest.java 2010-12-26 15:00:45 UTC (rev 668) +++ trunk/wikitty-jdbc-impl/src/test/java/org/nuiton/wikitty/services/WikittyServiceInMemoryJdbcSolrTest.java 2010-12-26 15:19:52 UTC (rev 669) @@ -49,6 +49,7 @@ result.setOption(WikittyConfig.WikittyOption. WIKITTY_TRANSACTION_WIKITTYSERVICE_COMPONENTS.getKey(), WikittyServiceInMemoryJdbcSolr.class.getName()); + log.info(result.getPrintableConfig("wikitty.*", 50)); return result; } Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/RAMDirectoryFactory.java =================================================================== --- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/RAMDirectoryFactory.java 2010-12-26 15:00:45 UTC (rev 668) +++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/RAMDirectoryFactory.java 2010-12-26 15:19:52 UTC (rev 669) @@ -20,6 +20,7 @@ import java.io.File; import java.util.HashMap; import java.util.Map; +import org.apache.lucene.store.LockFactory; import org.apache.solr.core.StandardDirectoryFactory; import java.io.IOException; @@ -27,6 +28,7 @@ import org.apache.lucene.store.Directory; import org.apache.lucene.store.RAMDirectory; +import org.apache.lucene.store.SingleInstanceLockFactory; /** * Directory provider for using lucene RAMDirectory @@ -91,12 +93,33 @@ public RefCntRamDirectory(Directory dir) throws IOException { this(); + // CODELUTIN Directory.copy(dir, this, false); // for (String file : dir.listAll()) { // dir.copy(this, file, file); // } + // CODELUTIN } + // CODELUTIN + @Override + public void setLockFactory(LockFactory lockFactory) { + // on accept que SingleInstanceLockFactory, sinon on ecrit + // des locks sur disque ce qui cree le repertoire index + // et ensuite on croit que l'index existe et donc s'initialise mal + // puisque le repertoire est en fait vide + + // cela provient de la methode dans SolrIndexWriter + // public static Directory getDirectory(...) + // qui instancie bien un RAMDirectory, mais ensuite change le + // LockFactory avec celui trouve dans le fichier de config, fait + // pour les autre Directory de type FS + if (lockFactory instanceof SingleInstanceLockFactory) { + super.setLockFactory(lockFactory); + } + } + // CODELUTIN + public void incRef() { ensureOpen(); refCount.incrementAndGet(); Modified: trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java =================================================================== --- trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2010-12-26 15:00:45 UTC (rev 668) +++ trunk/wikitty-solr-impl/src/main/java/org/nuiton/wikitty/storage/solr/WikittySearchEngineSolr.java 2010-12-26 15:19:52 UTC (rev 669) @@ -331,6 +331,12 @@ // init system env solr.data.dir if (config != null) { + String solrHome = config.getOption(WikittyConfig.WikittyOption + .WIKITTY_SEARCHENGINE_SOLR_HOME.getKey()); + if (solrHome != null) { + System.setProperty("solr.solr.home", solrHome); + } + // choix du storage (file or Ram) String solrDirFactoryKey = WikittyConfig.WikittyOption.WIKITTY_SEARCHENGINE_SOLR_DIRECTORY_FACTORY.getKey(); @@ -339,16 +345,22 @@ System.setProperty(solrDirFactoryKey, solrDirFactory); } - // on utilise le directory que si on est pas en Ram - if (solrDirFactory != null && !solrDirFactory.contains("RAMDirectoryFactory")) { + // on utilise le directory meme si on est en RAM, solr peut ecrire des fichiers :( + if (solrDirFactory != null) { String solrDataDirKey = WikittyConfig.WikittyOption.WIKITTY_SEARCHENGINE_SOLR_DIRECTORY_DATA.getKey(); String solrDataDir = config.getOption(solrDataDirKey); // make sure that dir exists if (solrDataDir != null) { File file = new File(solrDataDir); - file.mkdirs(); System.setProperty(solrDataDirKey, solrDataDir); + // si on est en RAM normalement on ne devrait pas ecrire + // de fichier, si SolR veut tout de meme le faire, c'est + // que la config est mauvaise. Mais dans ce cas on aide + // pas Solr en creant les repertoires pere + if (!solrDirFactory.contains("RAMDirectoryFactory")) { + file.mkdirs(); + } } } } Modified: trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/storage/solr/TreeTest.java =================================================================== --- trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/storage/solr/TreeTest.java 2010-12-26 15:00:45 UTC (rev 668) +++ trunk/wikitty-solr-impl/src/test/java/org/nuiton/wikitty/storage/solr/TreeTest.java 2010-12-26 15:19:52 UTC (rev 669) @@ -237,7 +237,7 @@ Wikitty root = findNode("root"); String rootId = root.getId(); - WikittyTree tree = ws.restoreTree(null, rootId); + WikittyTree tree = getProxy().restoreTree(rootId); assertNotNull(tree); }