This is an automated email from the ASF dual-hosted git repository.
dsmiley pushed a commit to branch branch_9x
in repository https://gitbox.apache.org/repos/asf/solr.git
The following commit(s) were added to refs/heads/branch_9x by this push:
new 8299d43bdf3 SOLR-18144: fix schema designer to auto-create .system in
9x (#4202)
8299d43bdf3 is described below
commit 8299d43bdf37bc2a51d93842497327bbe86299eb
Author: David Smiley <[email protected]>
AuthorDate: Wed Mar 11 21:54:45 2026 -0400
SOLR-18144: fix schema designer to auto-create .system in 9x (#4202)
Moved auto-creation logic from HttpSolrCall to ZkController
---
changelog/unreleased/SOLR-18144.yml | 9 ++++
.../java/org/apache/solr/cloud/ZkController.java | 44 +++++++++++++++++++
.../designer/SchemaDesignerConfigSetHelper.java | 32 ++++----------
.../java/org/apache/solr/servlet/HttpSolrCall.java | 49 ++--------------------
.../TestSchemaDesignerConfigSetHelper.java | 4 --
5 files changed, 63 insertions(+), 75 deletions(-)
diff --git a/changelog/unreleased/SOLR-18144.yml
b/changelog/unreleased/SOLR-18144.yml
new file mode 100644
index 00000000000..04ee5eaec3c
--- /dev/null
+++ b/changelog/unreleased/SOLR-18144.yml
@@ -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
diff --git a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
index 78d3267023c..26ba27b82e3 100644
--- a/solr/core/src/java/org/apache/solr/cloud/ZkController.java
+++ b/solr/core/src/java/org/apache/solr/cloud/ZkController.java
@@ -26,8 +26,13 @@ import static
org.apache.solr.common.cloud.ZkStateReader.LIVE_NODE_ROLES;
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;
@@ -104,6 +109,7 @@ import org.apache.solr.common.cloud.ZkStateReader;
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;
@@ -125,6 +131,8 @@ import org.apache.solr.core.SolrCoreInitializationException;
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;
@@ -3143,4 +3151,40 @@ public class ZkController implements Closeable {
}
}
}
+
+ /** Creates the .system collection if it doesn't exist. Returns true iff
this created it. */
+ public boolean createSystemColl() throws Exception {
+ 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;
+ }
}
diff --git
a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
index f24fe26ed61..efbd8805fec 100644
---
a/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
+++
b/solr/core/src/java/org/apache/solr/handler/designer/SchemaDesignerConfigSetHelper.java
@@ -45,7 +45,6 @@ import java.util.HashSet;
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;
@@ -72,7 +71,6 @@ import org.apache.solr.common.SolrException;
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;
@@ -521,29 +519,6 @@ class SchemaDesignerConfigSetHelper implements
SchemaDesignerConstants {
}
}
- private String getBaseUrl(final String collection) {
- 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);
}
@@ -658,6 +633,13 @@ class SchemaDesignerConfigSetHelper implements
SchemaDesignerConstants {
}
protected CloudSolrClient cloudClient() {
+ // create the system collection if it doesn't exist
+ try {
+ cc.getZkController().createSystemColl();
+ } catch (Exception e) {
+ throw new SolrException(ErrorCode.SERVER_ERROR, "Error creating system
collection", e);
+ }
+
return cc.getZkController().getSolrClient();
}
diff --git a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
index 4fab7a6af83..c894dc43158 100644
--- a/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
+++ b/solr/core/src/java/org/apache/solr/servlet/HttpSolrCall.java
@@ -19,11 +19,7 @@ package org.apache.solr.servlet;
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;
@@ -55,8 +51,6 @@ import java.util.Map;
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;
@@ -111,7 +105,6 @@ import org.apache.solr.core.CoreContainer;
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;
@@ -375,46 +368,10 @@ public class HttpSolrCall {
}
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;
}
}
diff --git
a/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerConfigSetHelper.java
b/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerConfigSetHelper.java
index 861261c9904..3f666039fa1 100644
---
a/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerConfigSetHelper.java
+++
b/solr/core/src/test/org/apache/solr/handler/designer/TestSchemaDesignerConfigSetHelper.java
@@ -32,7 +32,6 @@ import java.util.List;
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;
@@ -60,9 +59,6 @@ public class TestSchemaDesignerConfigSetHelper extends
SolrCloudTestCase
configureCluster(1)
.addConfig(DEFAULT_CONFIGSET_NAME, new
File(ExternalPaths.DEFAULT_CONFIGSET).toPath())
.configure();
- // SchemaDesignerConfigSetHelper depends on the blob store
- CollectionAdminRequest.createCollection(BLOB_STORE_ID, 1,
1).process(cluster.getSolrClient());
- cluster.waitForActiveCollection(BLOB_STORE_ID, 1, 1);
}
@AfterClass