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

Reply via email to