You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ma...@apache.org on 2013/10/11 03:35:22 UTC
svn commit: r1531162 - in
/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr:
core/SolrXMLCoresLocator.java handler/admin/CoreAdminHandler.java
Author: markrmiller
Date: Fri Oct 11 01:35:22 2013
New Revision: 1531162
URL: http://svn.apache.org/r1531162
Log:
SOLR-5317: Fix race when persisting cores in solr.xml
Modified:
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java
lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java?rev=1531162&r1=1531161&r2=1531162&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/core/SolrXMLCoresLocator.java Fri Oct 11 01:35:22 2013
@@ -20,6 +20,7 @@ package org.apache.solr.core;
import com.google.common.base.Charsets;
import com.google.common.collect.ImmutableList;
+import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -31,9 +32,11 @@ import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Properties;
+import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -142,23 +145,33 @@ public class SolrXMLCoresLocator impleme
}
@Override
- public final void persist(CoreContainer cc, CoreDescriptor... coreDescriptors) {
+ public synchronized final void persist(CoreContainer cc, CoreDescriptor... coreDescriptors) {
List<CoreDescriptor> cds = new ArrayList<CoreDescriptor>(cc.getCoreDescriptors().size() + coreDescriptors.length);
+
+ System.err.println("Persist existing cores:" + cc.getCoreDescriptors());
+ System.err.println("Persist new cores:" + cc.getCoreDescriptors());
cds.addAll(cc.getCoreDescriptors());
cds.addAll(Arrays.asList(coreDescriptors));
+
doPersist(buildSolrXML(cds));
}
- protected synchronized void doPersist(String xml) {
+ protected void doPersist(String xml) {
File file = new File(cfg.config.getResourceLoader().getInstanceDir(), ConfigSolr.SOLR_XML_FILE);
+ Writer writer = null;
+ FileOutputStream fos = null;
try {
- Writer writer = new OutputStreamWriter(new FileOutputStream(file), Charsets.UTF_8);
+ fos = new FileOutputStream(file);
+ writer = new OutputStreamWriter(fos, Charsets.UTF_8);
writer.write(xml);
writer.close();
logger.info("Persisted core descriptions to {}", file.getAbsolutePath());
- }
- catch (IOException e) {
- logger.error("Couldn't persist core descriptions to {} : {}", file.getAbsolutePath(), e);
+ } catch (IOException e) {
+ logger.error("Couldn't persist core descriptions to {} : {}",
+ file.getAbsolutePath(), e);
+ } finally {
+ IOUtils.closeQuietly(writer);
+ IOUtils.closeQuietly(fos);
}
}
Modified: lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java
URL: http://svn.apache.org/viewvc/lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java?rev=1531162&r1=1531161&r2=1531162&view=diff
==============================================================================
--- lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java (original)
+++ lucene/dev/branches/branch_4x/solr/core/src/java/org/apache/solr/handler/admin/CoreAdminHandler.java Fri Oct 11 01:35:22 2013
@@ -19,6 +19,7 @@ package org.apache.solr.handler.admin;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Lists;
+
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.lucene.index.DirectoryReader;
@@ -48,6 +49,7 @@ import org.apache.solr.core.CoreDescript
import org.apache.solr.core.DirectoryFactory;
import org.apache.solr.core.DirectoryFactory.DirContext;
import org.apache.solr.core.SolrCore;
+import org.apache.solr.core.SolrXMLCoresLocator;
import org.apache.solr.handler.RequestHandlerBase;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryRequest;
@@ -485,9 +487,19 @@ public class CoreAdminHandler extends Re
if (coreContainer.getZkController() != null) {
coreContainer.preRegisterInZk(dcore);
}
+
+ // make sure we can write out the descriptor first
coreContainer.getCoresLocator().create(coreContainer, dcore);
+
SolrCore core = coreContainer.create(dcore);
+
coreContainer.register(dcore.getName(), core, false);
+
+ if (coreContainer.getCoresLocator() instanceof SolrXMLCoresLocator) {
+ // hack - in this case we persist once more because a core create race might
+ // have dropped entries.
+ coreContainer.getCoresLocator().create(coreContainer);
+ }
rsp.add("core", core.getName());
}
catch (Exception ex) {