You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by ab...@apache.org on 2019/12/18 16:38:49 UTC

[lucene-solr] 11/36: Support generic limits (eg. boolean, enum, etc).

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

ab pushed a commit to branch jira/solr-13579
in repository https://gitbox.apache.org/repos/asf/lucene-solr.git

commit 56309ce5a5aad0144faa56e9cb7d84abefdaae3d
Author: Andrzej Bialecki <ab...@apache.org>
AuthorDate: Tue Jul 16 12:05:59 2019 +0200

    Support generic limits (eg. boolean, enum, etc).
---
 .../apache/solr/managed/DefaultResourceManager.java |  4 ++--
 .../apache/solr/managed/ManagedMetricProducer.java  |  8 ++++----
 .../org/apache/solr/managed/ManagedResource.java    |  8 ++++----
 .../org/apache/solr/managed/ResourceManager.java    |  4 ++--
 .../apache/solr/managed/ResourceManagerPool.java    | 20 ++++++++++++--------
 .../solr/managed/plugins/CacheManagerPlugin.java    | 21 +++++++++++++++------
 6 files changed, 39 insertions(+), 26 deletions(-)

diff --git a/solr/core/src/java/org/apache/solr/managed/DefaultResourceManager.java b/solr/core/src/java/org/apache/solr/managed/DefaultResourceManager.java
index e6005c8..5e708b7 100644
--- a/solr/core/src/java/org/apache/solr/managed/DefaultResourceManager.java
+++ b/solr/core/src/java/org/apache/solr/managed/DefaultResourceManager.java
@@ -93,7 +93,7 @@ public class DefaultResourceManager extends ResourceManager {
   }
 
   @Override
-  public void createPool(String name, String type, Map<String, Float> poolLimits, Map<String, Object> params) throws Exception {
+  public void createPool(String name, String type, Map<String, Object> poolLimits, Map<String, Object> params) throws Exception {
     ensureNotClosed();
     if (resourcePools.containsKey(name)) {
       throw new IllegalArgumentException("Pool '" + name + "' already exists.");
@@ -110,7 +110,7 @@ public class DefaultResourceManager extends ResourceManager {
   }
 
   @Override
-  public void modifyPoolLimits(String name, Map<String, Float> poolLimits) throws Exception {
+  public void modifyPoolLimits(String name, Map<String, Object> poolLimits) throws Exception {
     ensureNotClosed();
     ResourceManagerPool pool = resourcePools.get(name);
     if (pool == null) {
diff --git a/solr/core/src/java/org/apache/solr/managed/ManagedMetricProducer.java b/solr/core/src/java/org/apache/solr/managed/ManagedMetricProducer.java
index 7885d0f..00167ab6 100644
--- a/solr/core/src/java/org/apache/solr/managed/ManagedMetricProducer.java
+++ b/solr/core/src/java/org/apache/solr/managed/ManagedMetricProducer.java
@@ -29,18 +29,18 @@ import org.apache.solr.core.SolrInfoBean;
 public interface ManagedMetricProducer extends SolrInfoBean, ManagedResource {
 
   @Override
-  default Map<String, Float> getMonitoredValues(Collection<String> tags) {
+  default Map<String, Object> getMonitoredValues(Collection<String> tags) {
     Map<String, Object> metrics = getMetricsSnapshot();
     if (metrics == null) {
       return Collections.emptyMap();
     }
-    Map<String, Float> result = new HashMap<>();
+    Map<String, Object> result = new HashMap<>();
     tags.forEach(tag -> {
       Object value = metrics.get(tag);
-      if (value == null || !(value instanceof Number)) {
+      if (value == null) {
         return;
       }
-      result.put(tag, ((Number)value).floatValue());
+      result.put(tag, value);
     });
     return result;
   }
diff --git a/solr/core/src/java/org/apache/solr/managed/ManagedResource.java b/solr/core/src/java/org/apache/solr/managed/ManagedResource.java
index 0f18028..261d857 100644
--- a/solr/core/src/java/org/apache/solr/managed/ManagedResource.java
+++ b/solr/core/src/java/org/apache/solr/managed/ManagedResource.java
@@ -44,7 +44,7 @@ public interface ManagedResource {
    * Set values of managed limits.
    * @param limits map of limit names and values
    */
-  default void setManagedLimits(Map<String, Float> limits) {
+  default void setManagedLimits(Map<String, Object> limits) {
     if (limits == null) {
       return;
     }
@@ -63,18 +63,18 @@ public interface ManagedResource {
    * @param key limit name
    * @param value limit value
    */
-  void setManagedLimit(String key, float value) throws Exception;
+  void setManagedLimit(String key, Object value) throws Exception;
 
   /**
    * Returns current values of managed limits.
    * @return map where keys are controlled tags and values are current limits
    */
-  Map<String, Float> getManagedLimits();
+  Map<String, Object> getManagedLimits();
 
   /**
    * Returns monitored values that are used for calculating optimal settings of managed limits.
    * @param tags monitored tags
    * @return map of tags to current values.
    */
-  Map<String, Float> getMonitoredValues(Collection<String> tags) throws Exception;
+  Map<String, Object> getMonitoredValues(Collection<String> tags) throws Exception;
 }
diff --git a/solr/core/src/java/org/apache/solr/managed/ResourceManager.java b/solr/core/src/java/org/apache/solr/managed/ResourceManager.java
index 867e3f9..41dd690 100644
--- a/solr/core/src/java/org/apache/solr/managed/ResourceManager.java
+++ b/solr/core/src/java/org/apache/solr/managed/ResourceManager.java
@@ -88,14 +88,14 @@ public abstract class ResourceManager implements SolrCloseable, PluginInfoInitia
    * @param poolLimits pool limits
    * @param params other parameters. These are also used for creating a {@link ResourceManagerPlugin}
    */
-  public abstract void createPool(String name, String type, Map<String, Float> poolLimits, Map<String, Object> params) throws Exception;
+  public abstract void createPool(String name, String type, Map<String, Object> poolLimits, Map<String, Object> params) throws Exception;
 
   /**
    * Modify pool limits.
    * @param name existing pool name
    * @param poolLimits new pool limits
    */
-  public abstract void modifyPoolLimits(String name, Map<String, Float> poolLimits) throws Exception;
+  public abstract void modifyPoolLimits(String name, Map<String, Object> poolLimits) throws Exception;
 
   /**
    * Remove pool. This also stops the management of resources registered with that pool.
diff --git a/solr/core/src/java/org/apache/solr/managed/ResourceManagerPool.java b/solr/core/src/java/org/apache/solr/managed/ResourceManagerPool.java
index bfb1b8c..79ecbb0 100644
--- a/solr/core/src/java/org/apache/solr/managed/ResourceManagerPool.java
+++ b/solr/core/src/java/org/apache/solr/managed/ResourceManagerPool.java
@@ -39,7 +39,7 @@ public class ResourceManagerPool implements Runnable, Closeable {
   private static final Logger log = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass());
 
   private final Map<String, ManagedResource> resources = new ConcurrentHashMap<>();
-  private Map<String, Float> poolLimits;
+  private Map<String, Object> poolLimits;
   private final String type;
   private final String name;
   private final ResourceManagerPlugin resourceManagerPlugin;
@@ -58,7 +58,7 @@ public class ResourceManagerPool implements Runnable, Closeable {
    * @param params parameters for the {@link ResourceManagerPlugin}
    * @throws Exception
    */
-  public ResourceManagerPool(String name, String type, ResourceManagerPluginFactory factory, Map<String, Float> poolLimits, Map<String, Object> params) throws Exception {
+  public ResourceManagerPool(String name, String type, ResourceManagerPluginFactory factory, Map<String, Object> poolLimits, Map<String, Object> params) throws Exception {
     this.name = name;
     this.type = type;
     this.resourceManagerPlugin = factory.create(type, params);
@@ -94,11 +94,11 @@ public class ResourceManagerPool implements Runnable, Closeable {
    * Get the current monitored values from all resources. Result is a map with resource names as keys,
    * and tag/value maps as values.
    */
-  public Map<String, Map<String, Float>> getCurrentValues() throws InterruptedException {
+  public Map<String, Map<String, Object>> getCurrentValues() throws InterruptedException {
     updateLock.lockInterruptibly();
     try {
       // collect current values
-      Map<String, Map<String, Float>> currentValues = new HashMap<>();
+      Map<String, Map<String, Object>> currentValues = new HashMap<>();
       for (ManagedResource resource : resources.values()) {
         try {
           currentValues.put(resource.getResourceName(), resource.getMonitoredValues(resourceManagerPlugin.getMonitoredTags()));
@@ -109,11 +109,15 @@ public class ResourceManagerPool implements Runnable, Closeable {
       // calculate totals
       Map<String, Float> newTotalValues = new HashMap<>();
       currentValues.values().forEach(map -> map.forEach((k, v) -> {
+        // only calculate totals for numbers
+        if (!(v instanceof Number)) {
+          return;
+        }
         Float total = newTotalValues.get(k);
         if (total == null) {
-          newTotalValues.put(k, v);
+          newTotalValues.put(k, ((Number)v).floatValue());
         } else {
-          newTotalValues.put(k, total + v);
+          newTotalValues.put(k, total + ((Number)v).floatValue());
         }
       }));
       totalValues = newTotalValues;
@@ -136,14 +140,14 @@ public class ResourceManagerPool implements Runnable, Closeable {
     }
   }
 
-  public Map<String, Float> getPoolLimits() {
+  public Map<String, Object> getPoolLimits() {
     return poolLimits;
   }
 
   /**
    * Pool limits are defined using controlled tags.
    */
-  public void setPoolLimits(Map<String, Float> poolLimits) {
+  public void setPoolLimits(Map<String, Object> poolLimits) {
     this.poolLimits = new HashMap(poolLimits);
   }
 
diff --git a/solr/core/src/java/org/apache/solr/managed/plugins/CacheManagerPlugin.java b/solr/core/src/java/org/apache/solr/managed/plugins/CacheManagerPlugin.java
index 8783334..5adf7ef 100644
--- a/solr/core/src/java/org/apache/solr/managed/plugins/CacheManagerPlugin.java
+++ b/solr/core/src/java/org/apache/solr/managed/plugins/CacheManagerPlugin.java
@@ -80,11 +80,16 @@ public class CacheManagerPlugin extends AbstractResourceManagerPlugin {
 
   @Override
   public void manage(ResourceManagerPool pool) throws Exception {
-    Map<String, Map<String, Float>> currentValues = pool.getCurrentValues();
+    Map<String, Map<String, Object>> currentValues = pool.getCurrentValues();
     Map<String, Float> totalValues = pool.getTotalValues();
     // pool limits are defined using controlled tags
-    pool.getPoolLimits().forEach((poolLimitName, poolLimitValue) -> {
-      if (poolLimitValue == null || poolLimitValue <= 0) {
+    pool.getPoolLimits().forEach((poolLimitName, value) -> {
+      // only numeric limits are supported
+      if (value == null || !(value instanceof Number)) {
+        return;
+      }
+      float poolLimitValue = ((Number)value).floatValue();
+      if (poolLimitValue <= 0) {
         return;
       }
       String monitoredTag = controlledToMonitored.get(poolLimitName);
@@ -105,9 +110,13 @@ public class CacheManagerPlugin extends AbstractResourceManagerPlugin {
       float changeRatio = poolLimitValue / totalValue;
       // modify current limits by the changeRatio
       pool.getResources().forEach((name, resource) -> {
-        Map<String, Float> resourceLimits = resource.getManagedLimits();
-        Float currentResourceLimit = resourceLimits.get(poolLimitName);
-        if (currentResourceLimit == null || currentResourceLimit <= 0) {
+        Map<String, Object> resourceLimits = resource.getManagedLimits();
+        Object limit = resourceLimits.get(poolLimitName);
+        if (limit == null || !(limit instanceof Number)) {
+          return;
+        }
+        float currentResourceLimit = ((Number)limit).floatValue();
+        if (currentResourceLimit <= 0) {
           return;
         }
         float newLimit = currentResourceLimit * changeRatio;