mirror of https://github.com/apache/lucene.git
SOLR-13066: A failure while reloading a SolrCore can result in the SolrCore not being closed.
This commit is contained in:
parent
9728dbc167
commit
7de72c9bc7
|
@ -169,6 +169,8 @@ Bug Fixes
|
|||
|
||||
* SOLR-13014: URI Too Long with large streaming expressions in SolrJ (janhoy)
|
||||
|
||||
* SOLR-13066: A failure while reloading a SolrCore can result in the SolrCore not being closed. (Mark Miller)
|
||||
|
||||
Improvements
|
||||
----------------------
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@ import static org.apache.solr.common.params.CommonParams.ZK_STATUS_PATH;
|
|||
import static org.apache.solr.core.CorePropertiesLocator.PROPERTIES_FILENAME;
|
||||
import static org.apache.solr.security.AuthenticationPlugin.AUTHENTICATION_PLUGIN_PROP;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
import java.lang.invoke.MethodHandles;
|
||||
import java.nio.file.Path;
|
||||
|
@ -1432,6 +1433,7 @@ public class CoreContainer {
|
|||
if (isShutDown) {
|
||||
throw new AlreadyClosedException();
|
||||
}
|
||||
SolrCore newCore = null;
|
||||
SolrCore core = solrCores.getCoreFromAnyList(name, false);
|
||||
if (core != null) {
|
||||
|
||||
|
@ -1439,34 +1441,41 @@ public class CoreContainer {
|
|||
// CoreDescriptor and we need to reload it from the disk files
|
||||
CoreDescriptor cd = reloadCoreDescriptor(core.getCoreDescriptor());
|
||||
solrCores.addCoreDescriptor(cd);
|
||||
Closeable oldCore = null;
|
||||
boolean success = false;
|
||||
try {
|
||||
solrCores.waitAddPendingCoreOps(cd.getName());
|
||||
ConfigSet coreConfig = coreConfigService.getConfig(cd);
|
||||
log.info("Reloading SolrCore '{}' using configuration from {}", cd.getName(), coreConfig.getName());
|
||||
SolrCore newCore = core.reload(coreConfig);
|
||||
newCore = core.reload(coreConfig);
|
||||
|
||||
registerCore(cd, newCore, false, false);
|
||||
|
||||
if (getZkController() != null) {
|
||||
DocCollection docCollection = getZkController().getClusterState().getCollection(cd.getCollectionName());
|
||||
Replica replica = docCollection.getReplica(cd.getCloudDescriptor().getCoreNodeName());
|
||||
assert replica != null;
|
||||
if (replica.getType() == Replica.Type.TLOG) { //TODO: needed here?
|
||||
if (replica.getType() == Replica.Type.TLOG) { // TODO: needed here?
|
||||
getZkController().stopReplicationFromLeader(core.getName());
|
||||
if (!cd.getCloudDescriptor().isLeader()) {
|
||||
getZkController().startReplicationFromLeader(newCore.getName(), true);
|
||||
}
|
||||
|
||||
} else if(replica.getType() == Replica.Type.PULL) {
|
||||
} else if (replica.getType() == Replica.Type.PULL) {
|
||||
getZkController().stopReplicationFromLeader(core.getName());
|
||||
getZkController().startReplicationFromLeader(newCore.getName(), false);
|
||||
}
|
||||
}
|
||||
success = true;
|
||||
} catch (SolrCoreState.CoreIsClosedException e) {
|
||||
throw e;
|
||||
} catch (Exception e) {
|
||||
coreInitFailures.put(cd.getName(), new CoreLoadFailure(cd, e));
|
||||
coreInitFailures.put(cd.getName(), new CoreLoadFailure(cd, (Exception) e));
|
||||
throw new SolrException(ErrorCode.SERVER_ERROR, "Unable to reload core [" + cd.getName() + "]", e);
|
||||
} finally {
|
||||
if (!success && newCore != null && newCore.getOpenCount() > 0) {
|
||||
IOUtils.closeQuietly(newCore);
|
||||
}
|
||||
finally {
|
||||
solrCores.removeFromPendingOps(cd.getName());
|
||||
}
|
||||
} else {
|
||||
|
@ -1479,7 +1488,7 @@ public class CoreContainer {
|
|||
solrCores.removeFromPendingOps(clf.cd.getName());
|
||||
}
|
||||
} else {
|
||||
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No such core: " + name );
|
||||
throw new SolrException(SolrException.ErrorCode.BAD_REQUEST, "No such core: " + name);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -674,7 +674,7 @@ public final class SolrCore implements SolrInfoBean, SolrMetricProducer, Closeab
|
|||
return core;
|
||||
} finally {
|
||||
// close the new core on any errors that have occurred.
|
||||
if (!success) {
|
||||
if (!success && core != null && core.getOpenCount() > 0) {
|
||||
IOUtils.closeQuietly(core);
|
||||
}
|
||||
}
|
||||
|
@ -898,9 +898,13 @@ public final class SolrCore implements SolrInfoBean, SolrMetricProducer, Closeab
|
|||
CoreDescriptor coreDescriptor, UpdateHandler updateHandler,
|
||||
IndexDeletionPolicyWrapper delPolicy, SolrCore prev, boolean reload) {
|
||||
|
||||
assert ObjectReleaseTracker.track(searcherExecutor); // ensure that in unclean shutdown tests we still close this
|
||||
|
||||
this.coreContainer = coreContainer;
|
||||
|
||||
assert ObjectReleaseTracker.track(searcherExecutor); // ensure that in unclean shutdown tests we still close this
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
|
||||
try {
|
||||
|
||||
CoreDescriptor cd = Objects.requireNonNull(coreDescriptor, "coreDescriptor cannot be null");
|
||||
coreContainer.solrCores.addCoreDescriptor(cd);
|
||||
|
@ -929,7 +933,8 @@ public final class SolrCore implements SolrInfoBean, SolrMetricProducer, Closeab
|
|||
this.dataDir = initDataDir(dataDir, config, coreDescriptor);
|
||||
this.ulogDir = initUpdateLogDir(coreDescriptor);
|
||||
|
||||
log.info("[{}] Opening new SolrCore at [{}], dataDir=[{}]", logid, resourceLoader.getInstancePath(), this.dataDir);
|
||||
log.info("[{}] Opening new SolrCore at [{}], dataDir=[{}]", logid, resourceLoader.getInstancePath(),
|
||||
this.dataDir);
|
||||
|
||||
checkVersionFieldExistsInSchema(schema, coreDescriptor);
|
||||
|
||||
|
@ -944,16 +949,11 @@ public final class SolrCore implements SolrInfoBean, SolrMetricProducer, Closeab
|
|||
solrFieldCacheBean.initializeMetrics(metricManager, coreMetricManager.getRegistryName(), metricTag, "core");
|
||||
infoRegistry.put("fieldCache", solrFieldCacheBean);
|
||||
|
||||
|
||||
initSchema(config, schema);
|
||||
|
||||
this.maxWarmingSearchers = config.maxWarmingSearchers;
|
||||
this.slowQueryThresholdMillis = config.slowQueryThresholdMillis;
|
||||
|
||||
final CountDownLatch latch = new CountDownLatch(1);
|
||||
|
||||
try {
|
||||
|
||||
initListeners();
|
||||
|
||||
this.snapshotMgr = initSnapshotMetaDataManager();
|
||||
|
@ -961,7 +961,9 @@ public final class SolrCore implements SolrInfoBean, SolrMetricProducer, Closeab
|
|||
|
||||
this.codec = initCodec(solrConfig, this.schema);
|
||||
|
||||
memClassLoader = new MemClassLoader(PluginBag.RuntimeLib.getLibObjects(this, solrConfig.getPluginInfos(PluginBag.RuntimeLib.class.getName())), getResourceLoader());
|
||||
memClassLoader = new MemClassLoader(
|
||||
PluginBag.RuntimeLib.getLibObjects(this, solrConfig.getPluginInfos(PluginBag.RuntimeLib.class.getName())),
|
||||
getResourceLoader());
|
||||
initIndex(prev != null, reload);
|
||||
|
||||
initWriters();
|
||||
|
@ -1029,7 +1031,7 @@ public final class SolrCore implements SolrInfoBean, SolrMetricProducer, Closeab
|
|||
// should be fine, since counting down on a latch of 0 is still fine
|
||||
latch.countDown();
|
||||
if (e instanceof OutOfMemoryError) {
|
||||
throw (OutOfMemoryError)e;
|
||||
throw (OutOfMemoryError) e;
|
||||
}
|
||||
|
||||
try {
|
||||
|
|
Loading…
Reference in New Issue