This is an automated email from the ASF dual-hosted git repository.

dsmiley pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/solr.git


The following commit(s) were added to refs/heads/main by this push:
     new 07ff1338525 SOLR-17347: Remove ENV storage/retrieval in EnvUtils 
(#2534)
07ff1338525 is described below

commit 07ff133852545054d4fe13473588343e3e4d33b5
Author: David Smiley <[email protected]>
AuthorDate: Wed Jul 3 16:02:48 2024 +0200

    SOLR-17347: Remove ENV storage/retrieval in EnvUtils (#2534)
    
    Removed "env" methods because Solr code should almost always access global 
configuration via system properties.  Properties are augmented with the "env" 
nonetheless.
---
 solr/CHANGES.txt                                   |  3 +
 .../core/src/java/org/apache/solr/cli/SolrCLI.java |  7 +-
 .../cloud/api/collections/CreateCollectionCmd.java |  2 +-
 .../src/test/org/apache/solr/cli/PostToolTest.java |  4 +-
 .../solr/opentelemetry/OtelTracerConfigurator.java |  2 +-
 .../java/org/apache/solr/common/util/EnvUtils.java | 87 +++-------------------
 .../org/apache/solr/common/util/EnvUtilsTest.java  | 63 ++++++----------
 .../org/apache/solr/cloud/SolrCloudTestCase.java   |  4 +-
 8 files changed, 44 insertions(+), 128 deletions(-)

diff --git a/solr/CHANGES.txt b/solr/CHANGES.txt
index b4c7dd8301a..568b13051b6 100644
--- a/solr/CHANGES.txt
+++ b/solr/CHANGES.txt
@@ -206,6 +206,9 @@ Other Changes
 * PR#2524: QueryResult refactoring so that it's only returned from 
SolrIndexSearcher instead of
   being provided to it.  Deprecated APIs in 9x; should be removed later. 
(David Smiley)
 
+* SOLR-17347: EnvUtils: Removed "env" methods, as they were problematic.  Code 
should almost never
+  refer to env vars.  (David Smiley)
+
 ==================  9.6.1 ==================
 Bug Fixes
 ---------------------
diff --git a/solr/core/src/java/org/apache/solr/cli/SolrCLI.java 
b/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
index f422586aaee..06e0714b722 100755
--- a/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
+++ b/solr/core/src/java/org/apache/solr/cli/SolrCLI.java
@@ -245,9 +245,10 @@ public class SolrCLI implements CLIO {
   }
 
   public static String getDefaultSolrUrl() {
-    String scheme = EnvUtils.getEnv("SOLR_URL_SCHEME", "http");
-    String host = EnvUtils.getEnv("SOLR_TOOL_HOST", "localhost");
-    String port = EnvUtils.getEnv("SOLR_PORT", "8983");
+    // note that ENV_VAR syntax (and the env vars too) are mapped to env.var 
sys props
+    String scheme = EnvUtils.getProperty("solr.url.scheme", "http");
+    String host = EnvUtils.getProperty("solr.tool.host", "localhost");
+    String port = EnvUtils.getProperty("jetty.port", "8983"); // from 
SOLR_PORT env
     return String.format(Locale.ROOT, "%s://%s:%s", 
scheme.toLowerCase(Locale.ROOT), host, port);
   }
 
diff --git 
a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
 
b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
index 46c9b4e5a42..ccfd4a1e5e2 100644
--- 
a/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
+++ 
b/solr/core/src/java/org/apache/solr/cloud/api/collections/CreateCollectionCmd.java
@@ -112,7 +112,7 @@ public class CreateCollectionCmd implements 
CollApiCmds.CollectionApiCommand {
     final boolean waitForFinalState = message.getBool(WAIT_FOR_FINAL_STATE, 
false);
     final String alias = message.getStr(ALIAS, collectionName);
     log.info("Create collection {}", collectionName);
-    boolean prsDefault = EnvUtils.getEnvAsBool(PRS_DEFAULT_PROP, false);
+    boolean prsDefault = EnvUtils.getPropertyAsBool(PRS_DEFAULT_PROP, false);
     final boolean isPRS = 
message.getBool(CollectionStateProps.PER_REPLICA_STATE, prsDefault);
     if (log.isInfoEnabled()) {
       log.info(
diff --git a/solr/core/src/test/org/apache/solr/cli/PostToolTest.java 
b/solr/core/src/test/org/apache/solr/cli/PostToolTest.java
index a6e60f84bed..98686c277e2 100644
--- a/solr/core/src/test/org/apache/solr/cli/PostToolTest.java
+++ b/solr/core/src/test/org/apache/solr/cli/PostToolTest.java
@@ -114,8 +114,8 @@ public class PostToolTest extends SolrCloudTestCase {
   public void testRunWithCollectionParam() throws Exception {
     final String collection = "testRunWithCollectionParam";
 
-    // Provide the port as an environment variable for the PostTool to look up.
-    EnvUtils.setEnv("SOLR_PORT", cluster.getJettySolrRunner(0).getLocalPort() 
+ "");
+    // Provide the port for the PostTool to look up.
+    EnvUtils.setProperty("jetty.port", 
cluster.getJettySolrRunner(0).getLocalPort() + "");
 
     withBasicAuth(CollectionAdminRequest.createCollection(collection, "conf1", 
1, 1, 0, 0))
         .processAndWait(cluster.getSolrClient(), 10);
diff --git 
a/solr/modules/opentelemetry/src/java/org/apache/solr/opentelemetry/OtelTracerConfigurator.java
 
b/solr/modules/opentelemetry/src/java/org/apache/solr/opentelemetry/OtelTracerConfigurator.java
index f4a5384e633..0d2dd5df9de 100644
--- 
a/solr/modules/opentelemetry/src/java/org/apache/solr/opentelemetry/OtelTracerConfigurator.java
+++ 
b/solr/modules/opentelemetry/src/java/org/apache/solr/opentelemetry/OtelTracerConfigurator.java
@@ -41,7 +41,7 @@ public class OtelTracerConfigurator extends 
TracerConfigurator {
   private final Map<String, String> currentEnv;
 
   public OtelTracerConfigurator() {
-    this(EnvUtils.getEnvs());
+    this(System.getenv());
   }
 
   OtelTracerConfigurator(Map<String, String> currentEnv) {
diff --git a/solr/solrj/src/java/org/apache/solr/common/util/EnvUtils.java 
b/solr/solrj/src/java/org/apache/solr/common/util/EnvUtils.java
index 29c9586ca96..40bb7c0fdb3 100644
--- a/solr/solrj/src/java/org/apache/solr/common/util/EnvUtils.java
+++ b/solr/solrj/src/java/org/apache/solr/common/util/EnvUtils.java
@@ -34,13 +34,14 @@ import java.util.stream.Collectors;
 import org.apache.solr.common.SolrException;
 
 /**
- * This class is a unified provider of environment variables and system 
properties. It exposes a
- * mutable copy of the environment variables. It also converts 'SOLR_FOO' 
variables to system
- * properties 'solr.foo' and provide various convenience accessors for them.
+ * Provides convenient access to System Properties for Solr. It also converts 
'SOLR_FOO' env vars to
+ * system properties 'solr.foo', which is done on first access of this class. 
All Solr code should
+ * use this in lieu of JDK equivalents.
  */
 public class EnvUtils {
-  private static final SortedMap<String, String> ENV = new 
TreeMap<>(System.getenv());
+  /** Maps ENV keys to sys prop keys for special/custom mappings */
   private static final Map<String, String> CUSTOM_MAPPINGS = new HashMap<>();
+
   private static final Map<String, String> camelCaseToDotsMap = new 
ConcurrentHashMap<>();
 
   static {
@@ -52,7 +53,7 @@ public class EnvUtils {
         for (String key : props.stringPropertyNames()) {
           CUSTOM_MAPPINGS.put(key, props.getProperty(key));
         }
-        init(false);
+        init(false, System.getenv());
       }
     } catch (IOException e) {
       throw new SolrException(
@@ -60,74 +61,6 @@ public class EnvUtils {
     }
   }
 
-  /**
-   * Get Solr's mutable copy of all environment variables.
-   *
-   * @return sorted map of environment variables
-   */
-  public static SortedMap<String, String> getEnvs() {
-    return ENV;
-  }
-
-  /** Get a single environment variable as string */
-  public static String getEnv(String key) {
-    return ENV.get(key);
-  }
-
-  /** Get a single environment variable as string, or default */
-  public static String getEnv(String key, String defaultValue) {
-    return ENV.getOrDefault(key, defaultValue);
-  }
-
-  /** Get an environment variable as long */
-  public static long getEnvAsLong(String key) {
-    return Long.parseLong(ENV.get(key));
-  }
-
-  /** Get an environment variable as long, or default value */
-  public static long getEnvAsLong(String key, long defaultValue) {
-    String value = ENV.get(key);
-    if (value == null) {
-      return defaultValue;
-    }
-    return Long.parseLong(value);
-  }
-
-  /** Get an env var as boolean */
-  public static boolean getEnvAsBool(String key) {
-    return StrUtils.parseBool(ENV.get(key));
-  }
-
-  /** Get an env var as boolean, or default value */
-  public static boolean getEnvAsBool(String key, boolean defaultValue) {
-    String value = ENV.get(key);
-    if (value == null) {
-      return defaultValue;
-    }
-    return StrUtils.parseBool(value);
-  }
-
-  /** Get comma separated strings from env as List */
-  public static List<String> getEnvAsList(String key) {
-    return getEnv(key) != null ? stringValueToList(getEnv(key)) : null;
-  }
-
-  /** Get comma separated strings from env as List */
-  public static List<String> getEnvAsList(String key, List<String> 
defaultValue) {
-    return ENV.get(key) != null ? getEnvAsList(key) : defaultValue;
-  }
-
-  /** Set an environment variable */
-  public static void setEnv(String key, String value) {
-    ENV.put(key, value);
-  }
-
-  /** Set all environment variables */
-  public static synchronized void setEnvs(Map<String, String> env) {
-    ENV.clear();
-    ENV.putAll(env);
-  }
-
   /** Get all Solr system properties as a sorted map */
   public static SortedMap<String, String> getProperties() {
     return System.getProperties().entrySet().stream()
@@ -231,17 +164,15 @@ public class EnvUtils {
 
   /**
    * Re-reads environment variables and updates the internal map. Mainly for 
internal and test use.
-   *
-   * @param overwrite if true, overwrite existing system properties with 
environment variables
    */
-  static synchronized void init(boolean overwrite) {
+  static synchronized void init(boolean overwrite, Map<String, String> env) {
     // Convert eligible environment variables to system properties
-    for (String key : ENV.keySet()) {
+    for (String key : env.keySet()) {
       if (key.startsWith("SOLR_") || CUSTOM_MAPPINGS.containsKey(key)) {
         String sysPropKey = envNameToSyspropName(key);
         // Existing system properties take precedence
         if (!sysPropKey.isBlank() && (overwrite || getProperty(sysPropKey, 
null) == null)) {
-          setProperty(sysPropKey, ENV.get(key));
+          setProperty(sysPropKey, env.get(key));
         }
       }
     }
diff --git a/solr/solrj/src/test/org/apache/solr/common/util/EnvUtilsTest.java 
b/solr/solrj/src/test/org/apache/solr/common/util/EnvUtilsTest.java
index b6af3f56d40..d2cd63795f9 100644
--- a/solr/solrj/src/test/org/apache/solr/common/util/EnvUtilsTest.java
+++ b/solr/solrj/src/test/org/apache/solr/common/util/EnvUtilsTest.java
@@ -24,43 +24,24 @@ import org.junit.BeforeClass;
 import org.junit.Test;
 
 public class EnvUtilsTest extends SolrTestCase {
+
+  private static final Map<String, String> ENV =
+      Map.of(
+          "SOLR_HOME", "/home/solr",
+          "SOLR_PORT", "8983",
+          "SOLR_HOST", "localhost",
+          "SOLR_LOG_LEVEL", "INFO",
+          "SOLR_BOOLEAN", "true",
+          "SOLR_LONG", "1234567890",
+          "SOLR_COMMASEP", "one,two, three",
+          "SOLR_JSON_LIST", "[\"one\", \"two\", \"three\"]",
+          "SOLR_ALWAYS_ON_TRACE_ID", "true",
+          "SOLR_STR_WITH_NEWLINE", "foo\nbar,baz");
+
   @BeforeClass
   public static void beforeClass() throws Exception {
     // Make a map of some common Solr environment variables for testing, and 
initialize EnvUtils
-    EnvUtils.setEnvs(
-        Map.of(
-            "SOLR_HOME", "/home/solr",
-            "SOLR_PORT", "8983",
-            "SOLR_HOST", "localhost",
-            "SOLR_LOG_LEVEL", "INFO",
-            "SOLR_BOOLEAN", "true",
-            "SOLR_LONG", "1234567890",
-            "SOLR_COMMASEP", "one,two, three",
-            "SOLR_JSON_LIST", "[\"one\", \"two\", \"three\"]",
-            "SOLR_ALWAYS_ON_TRACE_ID", "true",
-            "SOLR_STR_WITH_NEWLINE", "foo\nbar,baz"));
-    EnvUtils.init(true);
-  }
-
-  @Test
-  public void testGetEnv() {
-    assertEquals("INFO", EnvUtils.getEnv("SOLR_LOG_LEVEL"));
-
-    assertNull(EnvUtils.getEnv("SOLR_NONEXIST"));
-    assertEquals("myString", EnvUtils.getEnv("SOLR_NONEXIST", "myString"));
-
-    assertTrue(EnvUtils.getEnvAsBool("SOLR_BOOLEAN"));
-    assertFalse(EnvUtils.getEnvAsBool("SOLR_BOOLEAN_NONEXIST", false));
-
-    assertEquals("1234567890", EnvUtils.getEnv("SOLR_LONG"));
-    assertEquals(1234567890L, EnvUtils.getEnvAsLong("SOLR_LONG"));
-    assertEquals(987L, EnvUtils.getEnvAsLong("SOLR_LONG_NONEXIST", 987L));
-
-    assertEquals("one,two, three", EnvUtils.getEnv("SOLR_COMMASEP"));
-    assertEquals(List.of("one", "two", "three"), 
EnvUtils.getEnvAsList("SOLR_COMMASEP"));
-    assertEquals(List.of("one", "two", "three"), 
EnvUtils.getEnvAsList("SOLR_JSON_LIST"));
-    assertEquals(List.of("fallback"), EnvUtils.getEnvAsList("SOLR_MISSING", 
List.of("fallback")));
-    assertEquals(List.of("foo\nbar", "baz"), 
EnvUtils.getEnvAsList("SOLR_STR_WITH_NEWLINE"));
+    EnvUtils.init(true, ENV);
   }
 
   @Test
@@ -96,10 +77,10 @@ public class EnvUtilsTest extends SolrTestCase {
   @Test
   public void testEnvsWithCustomKeyNameMappings() {
     // These have different names than the environment variables
-    assertEquals(EnvUtils.getEnv("SOLR_HOME"), 
EnvUtils.getProperty("solr.solr.home"));
-    assertEquals(EnvUtils.getEnv("SOLR_PORT"), 
EnvUtils.getProperty("jetty.port"));
-    assertEquals(EnvUtils.getEnv("SOLR_HOST"), EnvUtils.getProperty("host"));
-    assertEquals(EnvUtils.getEnv("SOLR_LOGS_DIR"), 
EnvUtils.getProperty("solr.log.dir"));
+    assertEquals(ENV.get("SOLR_HOME"), EnvUtils.getProperty("solr.solr.home"));
+    assertEquals(ENV.get("SOLR_PORT"), EnvUtils.getProperty("jetty.port"));
+    assertEquals(ENV.get("SOLR_HOST"), EnvUtils.getProperty("host"));
+    assertEquals(ENV.get("SOLR_LOGS_DIR"), 
EnvUtils.getProperty("solr.log.dir"));
   }
 
   @Test
@@ -111,10 +92,10 @@ public class EnvUtilsTest extends SolrTestCase {
   @Test
   public void testOverwrite() {
     EnvUtils.setProperty("solr.overwrite", "original");
-    EnvUtils.setEnv("SOLR_OVERWRITE", "overwritten");
-    EnvUtils.init(false);
+    var env2 = Map.of("SOLR_OVERWRITE", "overwritten");
+    EnvUtils.init(false, env2);
     assertEquals("original", EnvUtils.getProperty("solr.overwrite"));
-    EnvUtils.init(true);
+    EnvUtils.init(true, env2);
     assertEquals("overwritten", EnvUtils.getProperty("solr.overwrite"));
   }
 }
diff --git 
a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java 
b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
index 37d200f0f02..d410c3abeb4 100644
--- a/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
+++ b/solr/test-framework/src/java/org/apache/solr/cloud/SolrCloudTestCase.java
@@ -101,7 +101,7 @@ public class SolrCloudTestCase extends SolrTestCaseJ4 {
    * beforeClass method.
    */
   public static boolean isPRS() {
-    return EnvUtils.getEnvAsBool(PRS_DEFAULT_PROP, false);
+    return EnvUtils.getPropertyAsBool(PRS_DEFAULT_PROP, false);
   }
 
   /**
@@ -134,7 +134,7 @@ public class SolrCloudTestCase extends SolrTestCaseJ4 {
     if (target != null && target.isAnnotationPresent(NoPrs.class)) {
       usePrs = false;
     } else {
-      usePrs = EnvUtils.getEnvAsBool(PRS_DEFAULT_PROP, 
LuceneTestCase.random().nextBoolean());
+      usePrs = EnvUtils.getPropertyAsBool(PRS_DEFAULT_PROP, 
LuceneTestCase.random().nextBoolean());
     }
     System.setProperty(PRS_DEFAULT_PROP, usePrs ? "true" : "false");
   }

Reply via email to