Skip to content

Commit

Permalink
Initial Changes
Browse files Browse the repository at this point in the history
  • Loading branch information
ranganathg committed Aug 22, 2024
1 parent 0646151 commit b756ee1
Showing 1 changed file with 80 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
/*
* 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.hadoop.hbase.master.balancer;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.ServerName;
import org.apache.hadoop.hbase.client.RegionInfo;
import org.apache.yetus.audience.InterfaceAudience;

import java.util.*;

/**
* Ensure Tables are mutually exclusive on an RS
* for example: META and SYSTEM.CATALOG can be mutually exclusive Tables
* on same RS
*/
@InterfaceAudience.Private public class MutuallyExclusiveTablesCostFunction extends CostFunction {
private static final String MUTUALLY_EXCLUSIVE_TABLES_KEY =
"hbase.master.balancer.stochastic.mutuallyExclusiveTables";
private static final String MUTUALLY_EXCLUSIVE_TABLES_COST_KEY =
"hbase.master.balancer.stochastic.mutuallyExclusiveTablesCost";
private static final float DEFAULT_MUTUALLY_EXCLUSIVE_TABLES_COST = 10000;
private Set<String> mutuallyExclusiveTables = Collections.emptySet();

public MutuallyExclusiveTablesCostFunction(Configuration conf) {
this.setMultiplier(
conf.getFloat(MUTUALLY_EXCLUSIVE_TABLES_COST_KEY, DEFAULT_MUTUALLY_EXCLUSIVE_TABLES_COST));
initializeMutuallyExclusiveTables(conf);
}

private void initializeMutuallyExclusiveTables(Configuration conf) {
String[] tables = conf.getStrings(MUTUALLY_EXCLUSIVE_TABLES_KEY);
if (tables != null && tables.length > 0) {
this.mutuallyExclusiveTables = new HashSet<>(Arrays.asList(tables));
}
}

@Override void prepare(BalancerClusterState cluster) {
super.prepare(cluster);
}

@Override protected double cost() {
double totalCost = 0;

Map<ServerName, List<RegionInfo>> clusterState = this.cluster.clusterState;

for (Map.Entry<ServerName, List<RegionInfo>> entry : clusterState.entrySet()) {
List<RegionInfo> regions = entry.getValue();

Set<String> tablesOnServer = new HashSet<>();
for (RegionInfo regionInfo : regions) {
String tableName = regionInfo.getTable().getNameAsString();
if (mutuallyExclusiveTables.contains(tableName)) {
if (tablesOnServer.contains(tableName)) {
totalCost += 10000; // Arbitrarily high cost to penalize this configuration
} else {
tablesOnServer.add(tableName);
}
}
}
}

return totalCost;
}
}

0 comments on commit b756ee1

Please sign in to comment.