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

kfaraz pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/druid.git


The following commit(s) were added to refs/heads/master by this push:
     new d9221e46e4 Completely disable cachingCost balancer strategy (#14798)
d9221e46e4 is described below

commit d9221e46e4b30dde80724dc49355a3ba5abcb312
Author: Kashif Faraz <[email protected]>
AuthorDate: Wed Aug 16 11:43:52 2023 +0530

    Completely disable cachingCost balancer strategy (#14798)
    
    `cachingCost` has been deprecated in #14484 and is not advised to be used in
    production clusters as it may cause usage skew across historicals which the
    coordinator is unable to rectify. This PR completely disables `cachingCost` 
strategy
    as it has now been rendered redundant due to recent performance improvements
    made to `cost` strategy.
    
    Changes
    - Disable `cachingCost` strategy
    - Add `DisabledCachingCostBalancerStrategyFactory` for the time being so 
that we
    can give a proper error message before falling back to 
`CostBalancerStrategy`. This
    will be removed in subsequent releases.
    - Retain `CachingCostBalancerStrategy` for testing/benchmarking purposes.
    - Add javadocs to `DiskNormalizedCostBalancerStrategy`
---
 .../balancer/BalancerStrategyFactory.java          |  2 +-
 .../balancer/CachingCostBalancerStrategy.java      |  5 ++
 .../CachingCostBalancerStrategyFactory.java        |  5 ++
 .../balancer/CostBalancerStrategyFactory.java      |  2 +-
 ...isabledCachingCostBalancerStrategyFactory.java} |  8 ++-
 .../DiskNormalizedCostBalancerStrategy.java        | 21 ++++++--
 .../balancer/BalancerStrategyFactoryTest.java      | 63 ++++++++++++++++++++++
 7 files changed, 98 insertions(+), 8 deletions(-)

diff --git 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/BalancerStrategyFactory.java
 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/BalancerStrategyFactory.java
index f27341fd3e..d0d426f7b5 100644
--- 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/BalancerStrategyFactory.java
+++ 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/BalancerStrategyFactory.java
@@ -26,7 +26,7 @@ import 
com.google.common.util.concurrent.ListeningExecutorService;
 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "strategy", defaultImpl = 
CostBalancerStrategyFactory.class)
 @JsonSubTypes(value = {
     @JsonSubTypes.Type(name = "cost", value = 
CostBalancerStrategyFactory.class),
-    @JsonSubTypes.Type(name = "cachingCost", value = 
CachingCostBalancerStrategyFactory.class),
+    @JsonSubTypes.Type(name = "cachingCost", value = 
DisabledCachingCostBalancerStrategyFactory.class),
     @JsonSubTypes.Type(name = "diskNormalized", value = 
DiskNormalizedCostBalancerStrategyFactory.class),
     @JsonSubTypes.Type(name = "random", value = 
RandomBalancerStrategyFactory.class)
 })
diff --git 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/CachingCostBalancerStrategy.java
 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/CachingCostBalancerStrategy.java
index eda9928915..64d77842e3 100644
--- 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/CachingCostBalancerStrategy.java
+++ 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/CachingCostBalancerStrategy.java
@@ -28,6 +28,11 @@ import org.apache.druid.timeline.DataSegment;
 import java.util.Collections;
 import java.util.Set;
 
+/**
+ * @deprecated This is currently being used only in tests for benchmarking 
purposes
+ * and will be removed in future releases.
+ */
+@Deprecated
 public class CachingCostBalancerStrategy extends CostBalancerStrategy
 {
   private final ClusterCostCache clusterCostCache;
diff --git 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/CachingCostBalancerStrategyFactory.java
 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/CachingCostBalancerStrategyFactory.java
index 0ddacaead7..89b7cf7546 100644
--- 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/CachingCostBalancerStrategyFactory.java
+++ 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/CachingCostBalancerStrategyFactory.java
@@ -39,6 +39,11 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.RejectedExecutionException;
 
+/**
+ * @deprecated This is currently being used only in tests for benchmarking 
purposes
+ * and will be removed in future releases.
+ */
+@Deprecated
 public class CachingCostBalancerStrategyFactory implements 
BalancerStrategyFactory
 {
   private static final EmittingLogger LOG = new 
EmittingLogger(CachingCostBalancerStrategyFactory.class);
diff --git 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/CostBalancerStrategyFactory.java
 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/CostBalancerStrategyFactory.java
index 3085f35b6b..10d5952390 100644
--- 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/CostBalancerStrategyFactory.java
+++ 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/CostBalancerStrategyFactory.java
@@ -24,7 +24,7 @@ import 
com.google.common.util.concurrent.ListeningExecutorService;
 public class CostBalancerStrategyFactory implements BalancerStrategyFactory
 {
   @Override
-  public CostBalancerStrategy createBalancerStrategy(ListeningExecutorService 
exec)
+  public BalancerStrategy createBalancerStrategy(ListeningExecutorService exec)
   {
     return new CostBalancerStrategy(exec);
   }
diff --git 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/CostBalancerStrategyFactory.java
 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/DisabledCachingCostBalancerStrategyFactory.java
similarity index 71%
copy from 
server/src/main/java/org/apache/druid/server/coordinator/balancer/CostBalancerStrategyFactory.java
copy to 
server/src/main/java/org/apache/druid/server/coordinator/balancer/DisabledCachingCostBalancerStrategyFactory.java
index 3085f35b6b..7d2f0d96bc 100644
--- 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/CostBalancerStrategyFactory.java
+++ 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/DisabledCachingCostBalancerStrategyFactory.java
@@ -20,12 +20,16 @@
 package org.apache.druid.server.coordinator.balancer;
 
 import com.google.common.util.concurrent.ListeningExecutorService;
+import org.apache.druid.java.util.common.logger.Logger;
 
-public class CostBalancerStrategyFactory implements BalancerStrategyFactory
+public class DisabledCachingCostBalancerStrategyFactory implements 
BalancerStrategyFactory
 {
+  private static final Logger log = new Logger(BalancerStrategyFactory.class);
+
   @Override
-  public CostBalancerStrategy createBalancerStrategy(ListeningExecutorService 
exec)
+  public BalancerStrategy createBalancerStrategy(ListeningExecutorService exec)
   {
+    log.warn("Balancer strategy 'cachingCost' is disabled. Using 'cost' 
strategy instead.");
     return new CostBalancerStrategy(exec);
   }
 }
diff --git 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/DiskNormalizedCostBalancerStrategy.java
 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/DiskNormalizedCostBalancerStrategy.java
index 601e5b042e..1d16c4785b 100644
--- 
a/server/src/main/java/org/apache/druid/server/coordinator/balancer/DiskNormalizedCostBalancerStrategy.java
+++ 
b/server/src/main/java/org/apache/druid/server/coordinator/balancer/DiskNormalizedCostBalancerStrategy.java
@@ -23,6 +23,23 @@ import 
com.google.common.util.concurrent.ListeningExecutorService;
 import org.apache.druid.server.coordinator.ServerHolder;
 import org.apache.druid.timeline.DataSegment;
 
+/**
+ * A {@link BalancerStrategy} which can be used when historicals in a tier have
+ * varying disk capacities. This strategy normalizes the cost of placing a 
segment on
+ * a server as calculated by {@link CostBalancerStrategy} by doing the 
following:
+ * <ul>
+ * <li>Divide the cost by the number of segments on the server. This ensures 
that
+ * cost does not increase just because the number of segments on a server is 
higher.</li>
+ * <li>Multiply the resulting value by disk usage ratio. This ensures that all
+ * hosts have equivalent levels of percentage disk utilization.</li>
+ * </ul>
+ * i.e. to place a segment on a given server
+ * <pre>
+ * cost = as computed by CostBalancerStrategy
+ * normalizedCost = (cost / numSegments) * usageRatio
+ *                = (cost / numSegments) * (diskUsed / totalDiskSpace)
+ * </pre>
+ */
 public class DiskNormalizedCostBalancerStrategy extends CostBalancerStrategy
 {
   public DiskNormalizedCostBalancerStrategy(ListeningExecutorService exec)
@@ -30,10 +47,6 @@ public class DiskNormalizedCostBalancerStrategy extends 
CostBalancerStrategy
     super(exec);
   }
 
-  /**
-   * Averages the cost obtained from CostBalancerStrategy. Also the costs are 
weighted according to their usage ratios.
-   * This ensures that all the hosts will have the same % disk utilization.
-   */
   @Override
   protected double computePlacementCost(
       final DataSegment proposalSegment,
diff --git 
a/server/src/test/java/org/apache/druid/server/coordinator/balancer/BalancerStrategyFactoryTest.java
 
b/server/src/test/java/org/apache/druid/server/coordinator/balancer/BalancerStrategyFactoryTest.java
new file mode 100644
index 0000000000..d08b8ff104
--- /dev/null
+++ 
b/server/src/test/java/org/apache/druid/server/coordinator/balancer/BalancerStrategyFactoryTest.java
@@ -0,0 +1,63 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.druid.server.coordinator.balancer;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.common.util.concurrent.ListeningExecutorService;
+import com.google.common.util.concurrent.MoreExecutors;
+import org.apache.druid.segment.TestHelper;
+import org.apache.druid.server.coordinator.simulate.BlockingExecutorService;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+public class BalancerStrategyFactoryTest
+{
+  private final ObjectMapper MAPPER = TestHelper.makeJsonMapper();
+
+  private ListeningExecutorService executorService;
+
+  @Before
+  public void setup()
+  {
+    executorService = MoreExecutors.listeningDecorator(
+        new BlockingExecutorService("StrategyFactoryTest-%s")
+    );
+  }
+
+  @After
+  public void tearDown()
+  {
+    executorService.shutdownNow();
+  }
+
+  @Test
+  public void testCachingCostStrategyFallsBackToCost() throws 
JsonProcessingException
+  {
+    final String json = "{\"strategy\":\"cachingCost\"}";
+    BalancerStrategyFactory factory = MAPPER.readValue(json, 
BalancerStrategyFactory.class);
+    BalancerStrategy strategy = 
factory.createBalancerStrategy(executorService);
+
+    Assert.assertTrue(strategy instanceof CostBalancerStrategy);
+    Assert.assertFalse(strategy instanceof CachingCostBalancerStrategy);
+  }
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to