Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions changelog/unreleased/SOLR-18144.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
title: Fixed schema designer to create a missing .system collection. This is a regression specific to 9.x.
type: fixed # added, changed, fixed, deprecated, removed, dependency_update, security, other
authors:
- name: David Smiley
- name: Eric Pugh
- name: Jan Høydahl
links:
- name: SOLR-18144
url: https://issues.apache.org/jira/browse/SOLR-18144
44 changes: 44 additions & 0 deletions solr/core/src/java/org/apache/solr/cloud/ZkController.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,13 @@
import static org.apache.solr.common.cloud.ZkStateReader.LIVE_NODE_SOLR_VERSION;
import static org.apache.solr.common.cloud.ZkStateReader.NODE_NAME_PROP;
import static org.apache.solr.common.cloud.ZkStateReader.REJOIN_AT_HEAD_PROP;
import static org.apache.solr.common.cloud.ZkStateReader.REPLICATION_FACTOR;
import static org.apache.solr.common.cloud.ZkStateReader.SHARD_ID_PROP;
import static org.apache.solr.common.params.CollectionAdminParams.SYSTEM_COLL;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.ADDROLE;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.CREATE;
import static org.apache.solr.common.params.CommonParams.NAME;
import static org.apache.solr.common.params.CoreAdminParams.ACTION;
import static org.apache.zookeeper.ZooDefs.Ids.OPEN_ACL_UNSAFE;

import java.io.Closeable;
Expand Down Expand Up @@ -104,6 +109,7 @@
import org.apache.solr.common.cloud.ZooKeeperException;
import org.apache.solr.common.params.CollectionAdminParams;
import org.apache.solr.common.params.CommonParams;
import org.apache.solr.common.params.ModifiableSolrParams;
import org.apache.solr.common.params.SolrParams;
import org.apache.solr.common.util.Compressor;
import org.apache.solr.common.util.EnvUtils;
Expand All @@ -125,6 +131,8 @@
import org.apache.solr.handler.component.HttpShardHandler;
import org.apache.solr.handler.component.HttpShardHandlerFactory;
import org.apache.solr.logging.MDCLoggingContext;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.response.SolrQueryResponse;
import org.apache.solr.search.SolrIndexSearcher;
import org.apache.solr.update.UpdateLog;
import org.apache.solr.util.AddressUtils;
Expand Down Expand Up @@ -3143,4 +3151,40 @@ private static void ensureRegisteredSearcher(SolrCore core) throws InterruptedEx
}
}
}

/** Creates the .system collection if it doesn't exist. Returns true iff this created it. */
public boolean createSystemColl() throws Exception {
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

moved from HttpSolrCall to a more suitable place as the same logic now has 2 callers

if (getClusterState().hasCollection(SYSTEM_COLL)) {
return false;
}
log.info("Going to auto-create {} collection", SYSTEM_COLL);
SolrQueryResponse rsp = new SolrQueryResponse();
String repFactor = String.valueOf(Math.min(3, getClusterState().getLiveNodes().size()));
cc.getCollectionsHandler()
.handleRequestBody(
new LocalSolrQueryRequest(
null,
new ModifiableSolrParams()
.add(ACTION, CREATE.toString())
.add(NAME, SYSTEM_COLL)
.add(REPLICATION_FACTOR, repFactor)),
rsp);
if (rsp.getValues().get("success") == null) {
throw new SolrException(
ErrorCode.SERVER_ERROR,
"Could not auto-create "
+ SYSTEM_COLL
+ " collection: "
+ Utils.toJSONString(rsp.getValues()));
}

try {
getZkStateReader().waitForState(SYSTEM_COLL, 3, TimeUnit.SECONDS, Objects::nonNull);
} catch (TimeoutException e) {
throw new SolrException(
ErrorCode.SERVER_ERROR,
"Could not find " + SYSTEM_COLL + " collection even after 3 seconds");
}
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
Expand All @@ -72,7 +71,6 @@
import org.apache.solr.common.SolrException.ErrorCode;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.cloud.DocCollection;
import org.apache.solr.common.cloud.Replica;
import org.apache.solr.common.cloud.SolrZkClient;
import org.apache.solr.common.cloud.ZkMaintenanceUtils;
import org.apache.solr.common.cloud.ZkStateReader;
Expand Down Expand Up @@ -521,29 +519,6 @@ protected void postDataToBlobStore(CloudSolrClient cloudClient, String blobName,
}
}

private String getBaseUrl(final String collection) {
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

unused

String baseUrl = null;
try {
Set<String> liveNodes = zkStateReader().getClusterState().getLiveNodes();
DocCollection docColl = zkStateReader().getCollection(collection);
if (docColl != null && !liveNodes.isEmpty()) {
Optional<Replica> maybeActive =
docColl.getReplicas().stream().filter(r -> r.isActive(liveNodes)).findAny();
if (maybeActive.isPresent()) {
baseUrl = maybeActive.get().getBaseUrl();
}
}
} catch (Exception exc) {
log.warn("Failed to lookup base URL for collection {}", collection, exc);
}

if (baseUrl == null) {
baseUrl = zkStateReader().getBaseUrlForNodeName(cc.getZkController().getNodeName());
}

return baseUrl;
}

protected String getManagedSchemaZkPath(final String configSet) {
return getConfigSetZkPath(configSet, DEFAULT_MANAGED_SCHEMA_RESOURCE_NAME);
}
Expand Down Expand Up @@ -658,6 +633,13 @@ void createCollection(
}

protected CloudSolrClient cloudClient() {
// create the system collection if it doesn't exist
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

doing this here means pretty minimal change to this class

try {
cc.getZkController().createSystemColl();
} catch (Exception e) {
throw new SolrException(ErrorCode.SERVER_ERROR, "Error creating system collection", e);
}

return cc.getZkController().getSolrClient();
}

Expand Down
49 changes: 3 additions & 46 deletions solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,7 @@
import static org.apache.solr.common.cloud.ZkStateReader.COLLECTION_PROP;
import static org.apache.solr.common.cloud.ZkStateReader.CORE_NAME_PROP;
import static org.apache.solr.common.cloud.ZkStateReader.NODE_NAME_PROP;
import static org.apache.solr.common.cloud.ZkStateReader.REPLICATION_FACTOR;
import static org.apache.solr.common.params.CollectionAdminParams.SYSTEM_COLL;
import static org.apache.solr.common.params.CollectionParams.CollectionAction.CREATE;
import static org.apache.solr.common.params.CommonParams.NAME;
import static org.apache.solr.common.params.CoreAdminParams.ACTION;
import static org.apache.solr.servlet.SolrDispatchFilter.Action.ADMIN;
import static org.apache.solr.servlet.SolrDispatchFilter.Action.FORWARD;
import static org.apache.solr.servlet.SolrDispatchFilter.Action.PASSTHROUGH;
Expand Down Expand Up @@ -55,8 +51,6 @@
import java.util.Objects;
import java.util.Random;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
Expand Down Expand Up @@ -111,7 +105,6 @@
import org.apache.solr.core.SolrConfig;
import org.apache.solr.core.SolrCore;
import org.apache.solr.handler.ContentStreamHandlerBase;
import org.apache.solr.request.LocalSolrQueryRequest;
import org.apache.solr.request.SolrQueryRequest;
import org.apache.solr.request.SolrQueryRequestBase;
import org.apache.solr.request.SolrRequestHandler;
Expand Down Expand Up @@ -375,46 +368,10 @@ protected DocCollection resolveDocCollection(String collectionName) {
}

protected void autoCreateSystemColl(String corename) throws Exception {
if (core == null
&& SYSTEM_COLL.equals(corename)
&& "POST".equals(req.getMethod())
&& !cores.getZkController().getClusterState().hasCollection(SYSTEM_COLL)) {
log.info("Going to auto-create {} collection", SYSTEM_COLL);
SolrQueryResponse rsp = new SolrQueryResponse();
String repFactor =
String.valueOf(
Math.min(3, cores.getZkController().getClusterState().getLiveNodes().size()));
cores
.getCollectionsHandler()
.handleRequestBody(
new LocalSolrQueryRequest(
null,
new ModifiableSolrParams()
.add(ACTION, CREATE.toString())
.add(NAME, SYSTEM_COLL)
.add(REPLICATION_FACTOR, repFactor)),
rsp);
if (rsp.getValues().get("success") == null) {
throw new SolrException(
ErrorCode.SERVER_ERROR,
"Could not auto-create "
+ SYSTEM_COLL
+ " collection: "
+ Utils.toJSONString(rsp.getValues()));
}

try {
cores
.getZkController()
.getZkStateReader()
.waitForState(SYSTEM_COLL, 3, TimeUnit.SECONDS, Objects::nonNull);
} catch (TimeoutException e) {
throw new SolrException(
ErrorCode.SERVER_ERROR,
"Could not find " + SYSTEM_COLL + " collection even after 3 seconds");
if (core == null && SYSTEM_COLL.equals(corename) && "POST".equals(req.getMethod())) {
if (cores.getZkController().createSystemColl()) {
action = RETRY;
}

action = RETRY;
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,6 @@
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import org.apache.solr.client.solrj.request.CollectionAdminRequest;
import org.apache.solr.cloud.SolrCloudTestCase;
import org.apache.solr.common.SolrInputDocument;
import org.apache.solr.common.util.SimpleOrderedMap;
Expand Down Expand Up @@ -60,9 +59,6 @@ public static void createCluster() throws Exception {
configureCluster(1)
.addConfig(DEFAULT_CONFIGSET_NAME, new File(ExternalPaths.DEFAULT_CONFIGSET).toPath())
.configure();
// SchemaDesignerConfigSetHelper depends on the blob store
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yay; it's tested now.

CollectionAdminRequest.createCollection(BLOB_STORE_ID, 1, 1).process(cluster.getSolrClient());
cluster.waitForActiveCollection(BLOB_STORE_ID, 1, 1);
}

@AfterClass
Expand Down