This is an automated email from the ASF dual-hosted git repository.
dlmarion pushed a commit to branch 2.1
in repository https://gitbox.apache.org/repos/asf/accumulo.git
The following commit(s) were added to refs/heads/2.1 by this push:
new b9e227b712 Fixed issue with balancer property updates (#5575)
b9e227b712 is described below
commit b9e227b71268fa81322adf6ad405bc89e4aa86a3
Author: Dave Marion <[email protected]>
AuthorDate: Tue May 27 15:06:31 2025 -0400
Fixed issue with balancer property updates (#5575)
The change in #5530 added code to clear the
property cache in initializeBalancer because
the property change was not immediately seen.
BrokenBalancerIT was changing the property
then checking the balance to see if the new
balancer had taken effect.
This commit changes BrokenBalancerIT to give
it more time in the test thread for the
property change to take effect in the Manager
and changes how the Manager responds to system
property changes so that the property cache
invalidation can be removed.
Related to #5530
---
.../java/org/apache/accumulo/manager/Manager.java | 36 ++++++++++++----------
.../manager/ManagerClientServiceHandler.java | 16 ----------
.../org/apache/accumulo/test/BrokenBalancerIT.java | 10 ++++--
3 files changed, 27 insertions(+), 35 deletions(-)
diff --git
a/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java
b/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java
index c69142fd80..6a7ecb86fd 100644
--- a/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java
+++ b/server/manager/src/main/java/org/apache/accumulo/manager/Manager.java
@@ -201,7 +201,7 @@ public class Manager extends AbstractServer implements
LiveTServerSet.Listener,
ServiceLock managerLock = null;
private TServer clientService = null;
- private volatile TabletBalancer tabletBalancer;
+ private volatile TabletBalancer tabletBalancer = null;
private final BalancerEnvironment balancerEnvironment;
private final BalancerMetrics balancerMetrics = new BalancerMetrics();
@@ -1022,6 +1022,9 @@ public class Manager extends AbstractServer implements
LiveTServerSet.Listener,
private long balanceTablets() {
+ // Check for balancer property change
+ initializeBalancer();
+
final int tabletsNotHosted = notHosted();
BalanceParamsImpl params = null;
long wait = 0;
@@ -1917,29 +1920,29 @@ public class Manager extends AbstractServer implements
LiveTServerSet.Listener,
return upgradeCoordinator.getStatus() !=
UpgradeCoordinator.UpgradeStatus.COMPLETE;
}
- void initializeBalancer() {
+ private void initializeBalancer() {
+ String configuredBalancerClass =
getConfiguration().get(Property.MANAGER_TABLET_BALANCER);
try {
- getContext().getPropStore().getCache().removeAll();
- getConfiguration().invalidateCache();
- log.debug("Attempting to reinitialize balancer using class {}",
- getConfiguration().get(Property.MANAGER_TABLET_BALANCER));
- var localTabletBalancer =
Property.createInstanceFromPropertyName(getConfiguration(),
- Property.MANAGER_TABLET_BALANCER, TabletBalancer.class, new
DoNothingBalancer());
- localTabletBalancer.init(balancerEnvironment);
- tabletBalancer = localTabletBalancer;
+ if (tabletBalancer == null
+ ||
!tabletBalancer.getClass().getName().equals(configuredBalancerClass)) {
+ log.debug("Attempting to initialize balancer using class {}, was {}",
+ configuredBalancerClass,
+ tabletBalancer == null ? "null" :
tabletBalancer.getClass().getName());
+ var localTabletBalancer =
Property.createInstanceFromPropertyName(getConfiguration(),
+ Property.MANAGER_TABLET_BALANCER, TabletBalancer.class, new
DoNothingBalancer());
+ localTabletBalancer.init(balancerEnvironment);
+ tabletBalancer = localTabletBalancer;
+ log.info("tablet balancer changed to {}",
localTabletBalancer.getClass().getName());
+ }
} catch (Exception e) {
- log.warn("Failed to create balancer {} using {} instead",
- getConfiguration().get(Property.MANAGER_TABLET_BALANCER),
DoNothingBalancer.class, e);
+ log.warn("Failed to create balancer {} using {} instead",
configuredBalancerClass,
+ DoNothingBalancer.class, e);
var localTabletBalancer = new DoNothingBalancer();
localTabletBalancer.init(balancerEnvironment);
tabletBalancer = localTabletBalancer;
}
}
- Class<?> getBalancerClass() {
- return tabletBalancer.getClass();
- }
-
void getAssignments(SortedMap<TServerInstance,TabletServerStatus>
currentStatus,
Map<KeyExtent,UnassignedTablet> unassigned,
Map<KeyExtent,TServerInstance> assignedOut) {
AssignmentParamsImpl params =
AssignmentParamsImpl.fromThrift(currentStatus,
@@ -1953,5 +1956,4 @@ public class Manager extends AbstractServer implements
LiveTServerSet.Listener,
public ServiceLock getLock() {
return managerLock;
}
-
}
diff --git
a/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java
b/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java
index 5a5b022e31..505eefab7f 100644
---
a/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java
+++
b/server/manager/src/main/java/org/apache/accumulo/manager/ManagerClientServiceHandler.java
@@ -52,8 +52,6 @@ import
org.apache.accumulo.core.clientImpl.thrift.ThriftConcurrentModificationEx
import
org.apache.accumulo.core.clientImpl.thrift.ThriftNotActiveServiceException;
import org.apache.accumulo.core.clientImpl.thrift.ThriftSecurityException;
import
org.apache.accumulo.core.clientImpl.thrift.ThriftTableOperationException;
-import org.apache.accumulo.core.conf.DeprecatedPropertyUtil;
-import org.apache.accumulo.core.conf.Property;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.data.NamespaceId;
import org.apache.accumulo.core.data.Range;
@@ -431,7 +429,6 @@ public class ManagerClientServiceHandler implements
ManagerClientService.Iface {
try {
SystemPropUtil.removeSystemProperty(manager.getContext(), property);
- updatePlugins(property);
} catch (Exception e) {
Manager.log.error("Problem removing config property in zookeeper", e);
throw new RuntimeException(e.getMessage());
@@ -447,7 +444,6 @@ public class ManagerClientServiceHandler implements
ManagerClientService.Iface {
try {
SystemPropUtil.setSystemProperty(manager.getContext(), property, value);
- updatePlugins(property);
} catch (IllegalArgumentException iae) {
Manager.log.error("Problem setting invalid property", iae);
throw new ThriftPropertyException(property, value, "Property is
invalid");
@@ -467,9 +463,6 @@ public class ManagerClientServiceHandler implements
ManagerClientService.Iface {
try {
SystemPropUtil.modifyProperties(manager.getContext(),
properties.getVersion(),
properties.getProperties());
- for (Map.Entry<String,String> entry :
properties.getProperties().entrySet()) {
- updatePlugins(entry.getKey());
- }
} catch (IllegalArgumentException iae) {
Manager.log.error("Problem setting invalid property", iae);
throw new ThriftPropertyException("Modify properties", "failed",
iae.getMessage());
@@ -591,15 +584,6 @@ public class ManagerClientServiceHandler implements
ManagerClientService.Iface {
}
}
- private void updatePlugins(String property) {
- // resolve without warning; any warnings should have already occurred
- String resolved = DeprecatedPropertyUtil.getReplacementName(property,
(log, replacement) -> {});
- if (resolved.equals(Property.MANAGER_TABLET_BALANCER.getKey())) {
- manager.initializeBalancer();
- log.info("tablet balancer changed to {}",
manager.getBalancerClass().getName());
- }
- }
-
@Override
public void waitForBalance(TInfo tinfo) {
manager.waitForBalance();
diff --git a/test/src/main/java/org/apache/accumulo/test/BrokenBalancerIT.java
b/test/src/main/java/org/apache/accumulo/test/BrokenBalancerIT.java
index fafdaf9c5b..9cde44080e 100644
--- a/test/src/main/java/org/apache/accumulo/test/BrokenBalancerIT.java
+++ b/test/src/main/java/org/apache/accumulo/test/BrokenBalancerIT.java
@@ -119,7 +119,13 @@ public class BrokenBalancerIT extends ConfigurableMacBase {
getCluster().getConfig().setNumTservers(5);
getCluster().getClusterControl().start(ServerType.TABLET_SERVER);
- UtilWaitThread.sleep(5000);
+ Wait.waitFor(() -> c.instanceOperations().getTabletServers().size() ==
5);
+ Wait.waitFor(() -> c.instanceOperations().getSystemConfiguration()
+
.get(Property.MANAGER_TABLET_BALANCER.getKey()).equals(balancerClass));
+ c.instanceOperations().waitForBalance();
+
+ // Give enough time for property change and Status Thread in Manager
+ UtilWaitThread.sleep(30000);
// should not have balanced across the two new tservers
assertEquals(2, BalanceIT.countLocations(c, tableName).size());
@@ -130,7 +136,7 @@ public class BrokenBalancerIT extends ConfigurableMacBase {
TableLoadBalancer.class.getName());
// should eventually balance across all 5 tabletsevers
- Wait.waitFor(() -> 5 == BalanceIT.countLocations(c, tableName).size());
+ Wait.waitFor(() -> 5 == BalanceIT.countLocations(c, tableName).size(),
60_000);
}
}
}