/**
* This software is licensed to you under the Apache License, Version 2.0 (the
* "Apache License").
*
* LinkedIn's contributions are made under the Apache License. If you contribute
* to the Software, the contributions will be deemed to have been made under the
* Apache License, unless you expressly indicate otherwise. Please do not make any
* contributions that would be inconsistent with the Apache License.
*
* You may obtain a copy of the Apache License at http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, this software
* distributed under the Apache License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the Apache
* License for the specific language governing permissions and limitations for the
* software governed under the Apache License.
*
* © 2012 LinkedIn Corp. All Rights Reserved.
*/
package com.senseidb.search.node.broker;
import com.linkedin.norbert.javacompat.cluster.ZooKeeperClusterClient;
import com.linkedin.norbert.javacompat.network.NetworkClientConfig;
import com.linkedin.norbert.javacompat.network.PartitionedLoadBalancerFactory;
import com.linkedin.norbert.network.Serializer;
import com.senseidb.cluster.client.SenseiNetworkClient;
import com.senseidb.conf.SenseiConfParams;
import com.senseidb.plugin.SenseiPluginRegistry;
import com.senseidb.search.node.SenseiBroker;
import com.senseidb.search.node.SenseiSysBroker;
import com.senseidb.search.req.SenseiRequest;
import com.senseidb.search.req.SenseiRequestCustomizerFactory;
import com.senseidb.search.req.SenseiResult;
import com.senseidb.servlet.SenseiConfigServletContextListener;
import org.apache.commons.configuration.Configuration;
import java.util.Comparator;
public class BrokerConfig {
protected String clusterName;
protected String zkurl;
protected int zkTimeout;
protected int writeTimeoutMillis;
protected int connectTimeoutMillis;
protected int maxConnectionsPerNode;
protected int staleRequestTimeoutMins;
protected int staleRequestCleanupFrequencyMins;
private double outlierMultiplier;
private double outlierConstant;
protected PartitionedLoadBalancerFactory<String> loadBalancerFactory;
protected Serializer<SenseiRequest, SenseiResult> serializer;
private final NetworkClientConfig networkClientConfig = new NetworkClientConfig();
protected boolean allowPartialMerge;
private ZooKeeperClusterClient clusterClient;
private SenseiNetworkClient networkClient;
private SenseiBroker senseiBroker;
private SenseiSysBroker senseiSysBroker;
private SenseiRequestCustomizerFactory requestCustomizerFactory;
protected long brokerTimeout;
public BrokerConfig(Configuration senseiConf,
PartitionedLoadBalancerFactory<String> loadBalancerFactory,
Serializer<SenseiRequest, SenseiResult> serializer,
SenseiPluginRegistry pluginRegistry) {
this.loadBalancerFactory = loadBalancerFactory;
this.serializer = serializer;
clusterName = senseiConf.getString(SenseiConfParams.SENSEI_CLUSTER_NAME);
zkurl = senseiConf.getString(SenseiConfParams.SENSEI_CLUSTER_URL);
zkTimeout = senseiConf.getInt(SenseiConfParams.SENSEI_CLUSTER_TIMEOUT, 300000);
zkurl = senseiConf.getString(SenseiConfigServletContextListener.SENSEI_CONF_ZKURL, zkurl);
clusterName = senseiConf.getString(SenseiConfigServletContextListener.SENSEI_CONF_CLUSTER_NAME, clusterName);
zkTimeout = senseiConf.getInt(SenseiConfigServletContextListener.SENSEI_CONF_ZKTIMEOUT, zkTimeout);
outlierMultiplier = senseiConf.getDouble(SenseiConfigServletContextListener.SENSEI_CONF_NC_OUTLIER_MULTIPLIER, 3.0);
outlierConstant = senseiConf.getDouble(SenseiConfigServletContextListener.SENSEI_CONF_NC_OUTLIER_CONSTANT, 150);
connectTimeoutMillis = senseiConf.getInt(SenseiConfigServletContextListener.SENSEI_CONF_NC_CONN_TIMEOUT, 1000);
writeTimeoutMillis = senseiConf.getInt(SenseiConfigServletContextListener.SENSEI_CONF_NC_WRITE_TIMEOUT, 150);
maxConnectionsPerNode = senseiConf.getInt(SenseiConfigServletContextListener.SENSEI_CONF_NC_MAX_CONN_PER_NODE, 5);
staleRequestTimeoutMins = senseiConf.getInt(SenseiConfigServletContextListener.SENSEI_CONF_NC_STALE_TIMEOUT_MINS, 10);
staleRequestCleanupFrequencyMins = senseiConf.getInt(SenseiConfigServletContextListener.SENSEI_CONF_NC_STALE_CLEANUP_FREQ_MINS, 10);
allowPartialMerge = senseiConf.getBoolean(SenseiConfParams.ALLOW_PARTIAL_MERGE, true);
brokerTimeout = senseiConf.getLong(SenseiConfParams.SERVER_BROKER_TIMEOUT, 8000);
if (pluginRegistry != null)
requestCustomizerFactory = pluginRegistry.getBeanByFullPrefix(SenseiConfParams.SERVER_BROKER_REQUEST_CUSTOMIZER_FACTORY, SenseiRequestCustomizerFactory.class);
}
public void init() {
networkClientConfig.setServiceName(clusterName);
networkClientConfig.setZooKeeperConnectString(zkurl);
networkClientConfig.setZooKeeperSessionTimeoutMillis(zkTimeout);
networkClientConfig.setConnectTimeoutMillis(connectTimeoutMillis);
networkClientConfig.setWriteTimeoutMillis(writeTimeoutMillis);
networkClientConfig.setMaxConnectionsPerNode(maxConnectionsPerNode);
networkClientConfig.setStaleRequestTimeoutMins(staleRequestTimeoutMins);
networkClientConfig.setStaleRequestCleanupFrequencyMins(staleRequestCleanupFrequencyMins);
networkClientConfig.setOutlierMuliplier(outlierMultiplier);
networkClientConfig.setOutlierConstant(outlierConstant);
clusterClient = new ZooKeeperClusterClient(clusterName, zkurl, zkTimeout);
networkClientConfig.setClusterClient(clusterClient);
networkClient = new SenseiNetworkClient(networkClientConfig, this.loadBalancerFactory);
clusterClient.awaitConnectionUninterruptibly();
}
public long getBrokerTimeout() {
return brokerTimeout;
}
public boolean isAllowPartialMerge() {
return allowPartialMerge;
}
public SenseiBroker buildSenseiBroker() {
senseiBroker = new SenseiBroker(networkClient, clusterClient, allowPartialMerge, serializer, brokerTimeout, requestCustomizerFactory);
return senseiBroker;
}
public SenseiSysBroker buildSysSenseiBroker(Comparator<String> versionComparator) {
senseiSysBroker = new SenseiSysBroker(networkClient, clusterClient, versionComparator, brokerTimeout, allowPartialMerge);
return senseiSysBroker;
}
public ZooKeeperClusterClient getClusterClient() {
return clusterClient;
}
public SenseiNetworkClient getNetworkClient() {
return networkClient;
}
public SenseiBroker getSenseiBroker() {
return senseiBroker;
}
public SenseiSysBroker getSenseiSysBroker() {
return senseiSysBroker;
}
public String getClusterName() {
return clusterName;
}
public void setClusterName(String clusterName) {
this.clusterName = clusterName;
}
public void setZkurl(String zkurl) {
this.zkurl = zkurl;
}
public void setZkTimeout(int zkTimeout) {
this.zkTimeout = zkTimeout;
}
public void setWriteTimeoutMillis(int writeTimeoutMillis) {
this.writeTimeoutMillis = writeTimeoutMillis;
}
public void setConnectTimeoutMillis(int connectTimeoutMillis) {
this.connectTimeoutMillis = connectTimeoutMillis;
}
public void setMaxConnectionsPerNode(int maxConnectionsPerNode) {
this.maxConnectionsPerNode = maxConnectionsPerNode;
}
public void setStaleRequestTimeoutMins(int staleRequestTimeoutMins) {
this.staleRequestTimeoutMins = staleRequestTimeoutMins;
}
public void setStaleRequestCleanupFrequencyMins(int staleRequestCleanupFrequencyMins) {
this.staleRequestCleanupFrequencyMins = staleRequestCleanupFrequencyMins;
}
public void setLoadBalancerFactory(PartitionedLoadBalancerFactory<String> loadBalancerFactory) {
this.loadBalancerFactory = loadBalancerFactory;
}
public void setAllowPartialMerge(boolean allowPartialMerge) {
this.allowPartialMerge = allowPartialMerge;
}
public Serializer<SenseiRequest, SenseiResult> getSerializer() {
return serializer;
}
}