/**
* Copyright 2016 Yahoo Inc.
*
* Licensed 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 com.yahoo.pulsar.broker.loadbalance.impl;
import java.util.Map;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.yahoo.pulsar.broker.PulsarService;
import com.yahoo.pulsar.broker.admin.AdminResource;
import com.yahoo.pulsar.broker.loadbalance.LoadReport;
import com.yahoo.pulsar.broker.loadbalance.ResourceUnit;
import com.yahoo.pulsar.broker.loadbalance.ServiceUnit;
import com.yahoo.pulsar.common.naming.NamespaceName;
import com.yahoo.pulsar.common.policies.NamespaceIsolationPolicy;
import com.yahoo.pulsar.common.policies.impl.NamespaceIsolationPolicies;
import com.yahoo.pulsar.zookeeper.ZooKeeperDataCache;
public class SimpleResourceAllocationPolicies {
private static final Logger LOG = LoggerFactory.getLogger(SimpleResourceAllocationPolicies.class);
private final ZooKeeperDataCache<NamespaceIsolationPolicies> namespaceIsolationPolicies;
private final PulsarService pulsar;
SimpleResourceAllocationPolicies(PulsarService pulsar) {
this.namespaceIsolationPolicies = pulsar.getConfigurationCache().namespaceIsolationPoliciesCache();
this.pulsar = pulsar;
}
public boolean canAssign(ServiceUnit srvUnit, ResourceUnit rescrUnit, Map<ResourceUnit, LoadReport> loadReports) {
// TODO: need to apply the policies to the assignment and decide whether it can be assigned or not
return true;
}
private NamespaceIsolationPolicies getIsolationPolicies(String clusterName) {
NamespaceIsolationPolicies policies = null;
try {
policies = namespaceIsolationPolicies
.get(AdminResource.path("clusters", clusterName, "namespaceIsolationPolicies")).orElse(null);
} catch (Exception e) {
LOG.warn("GetIsolationPolicies: Unable to get the namespaceIsolationPolicies [{}]", e);
}
return policies;
}
public boolean IsIsolationPoliciesPresent(NamespaceName namespace) {
try {
NamespaceIsolationPolicies policies = null;
policies = getIsolationPolicies(pulsar.getConfiguration().getClusterName());
if (policies != null)
return policies.getPolicyByNamespace(namespace) != null;
} catch (Exception e) {
LOG.warn("IsIsolationPoliciesPresent: Unable to get the namespaceIsolationPolicies [{}]", e);
}
return false;
}
private NamespaceIsolationPolicy getNamespaceIsolationPolicy(NamespaceName namespace) {
NamespaceIsolationPolicies policies = null;
NamespaceIsolationPolicy policy = null;
try {
policies = getIsolationPolicies(pulsar.getConfiguration().getClusterName());
policy = policies.getPolicyByNamespace(namespace);
} catch (Exception e) {
LOG.warn("Unable to get the namespaceIsolationPolicies [{}]", e);
}
return policy;
}
public boolean isPrimaryBroker(NamespaceName namespace, String broker) {
NamespaceIsolationPolicy nsPolicy = getNamespaceIsolationPolicy(namespace);
return (nsPolicy != null) ? nsPolicy.isPrimaryBroker(broker) : false;
}
public boolean isSecondaryBroker(NamespaceName namespace, String broker) {
NamespaceIsolationPolicy nsPolicy = getNamespaceIsolationPolicy(namespace);
return (nsPolicy != null) ? nsPolicy.isSecondaryBroker(broker) : false;
}
public boolean isSharedBroker(String broker) {
try {
NamespaceIsolationPolicies policies = getIsolationPolicies(pulsar.getConfiguration().getClusterName());
if (policies == null)
return true;
return policies.isSharedBroker(broker);
} catch (Exception e) {
LOG.warn("isPrimaryForAnyNamespace: [{}]", e);
}
return false;
}
public boolean shouldFailoverToSecondaries(NamespaceName namespace, int totalPrimaryCandidates) {
NamespaceIsolationPolicy nsPolicy = getNamespaceIsolationPolicy(namespace);
return (nsPolicy != null) ? nsPolicy.shouldFailover(totalPrimaryCandidates) : false;
}
}