/**
* Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com)
*
* 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.linkedin.pinot.common.metadata.instance;
import com.linkedin.pinot.common.config.TableNameBuilder;
import com.linkedin.pinot.common.metadata.ZKMetadata;
import com.linkedin.pinot.common.utils.StringUtil;
import java.util.HashMap;
import java.util.Map;
import org.apache.helix.ZNRecord;
import static com.linkedin.pinot.common.utils.EqualityUtils.hashCodeOf;
import static com.linkedin.pinot.common.utils.EqualityUtils.isEqual;
import static com.linkedin.pinot.common.utils.EqualityUtils.isNullOrNotSameClass;
import static com.linkedin.pinot.common.utils.EqualityUtils.isSameReference;
public final class InstanceZKMetadata implements ZKMetadata {
private static final String KAFKA_HIGH_LEVEL_CONSUMER_GROUP_MAP = "KAFKA_HLC_GROUP_MAP";
private static final String KAFKA_HIGH_LEVEL_CONSUMER_PARTITION_MAP = "KAFKA_HLC_PARTITION_MAP";
private String _id = null;
private String _instanceName = null;
private int _instancePort;
private String _instanceType = null;
// Only care about realtime resources for now
private Map<String, String> _groupIdMap = new HashMap<String, String>();
private Map<String, String> _partitionMap = new HashMap<String, String>();
public InstanceZKMetadata() {
}
public InstanceZKMetadata(ZNRecord record) {
_id = record.getId();
setInstanceConfigFromId(_id);
_groupIdMap.putAll(record.getMapField(KAFKA_HIGH_LEVEL_CONSUMER_GROUP_MAP));
_partitionMap.putAll(record.getMapField(KAFKA_HIGH_LEVEL_CONSUMER_PARTITION_MAP));
}
private void setInstanceConfigFromId(String id) {
String[] instanceConfigs = id.split("_");
assert instanceConfigs.length == 3;
setInstanceType(instanceConfigs[0]);
setInstanceName(instanceConfigs[1]);
setInstancePort(Integer.parseInt(instanceConfigs[2]));
}
public int getInstancePort() {
return _instancePort;
}
public void setInstancePort(int instancePort) {
_instancePort = instancePort;
}
public String getInstanceType() {
return _instanceType;
}
public void setInstanceType(String instanceType) {
_instanceType = instanceType;
}
public String getId() {
if (_id == null) {
_id = buildIdFromInstanceConfig();
}
return _id;
}
public void setId(String id) {
_id = id;
}
public String getInstanceName() {
return _instanceName;
}
public void setInstanceName(String instanceName) {
_instanceName = instanceName;
}
public String getGroupId(String resourceName) {
return _groupIdMap.get(TableNameBuilder.REALTIME.tableNameWithType(resourceName));
}
public void setGroupId(String resourceName, String groupId) {
_groupIdMap.put(TableNameBuilder.REALTIME.tableNameWithType(resourceName), groupId);
}
public String getPartition(String resourceName) {
return _partitionMap.get(TableNameBuilder.REALTIME.tableNameWithType(resourceName));
}
public void setPartition(String resourceName, String partition) {
_partitionMap.put(TableNameBuilder.REALTIME.tableNameWithType(resourceName), partition);
}
public void removeResource(String resourceName) {
_groupIdMap.remove(resourceName);
_partitionMap.remove(resourceName);
}
@Override
public ZNRecord toZNRecord() {
ZNRecord znRecord = new ZNRecord(getId());
znRecord.setMapField(KAFKA_HIGH_LEVEL_CONSUMER_GROUP_MAP, _groupIdMap);
znRecord.setMapField(KAFKA_HIGH_LEVEL_CONSUMER_PARTITION_MAP, _partitionMap);
return znRecord;
}
private String buildIdFromInstanceConfig() {
return StringUtil.join("_", _instanceType, _instanceName, _instancePort + "");
}
@Override
public boolean equals(Object instanceMetadata) {
if (isSameReference(this, instanceMetadata)) {
return true;
}
if (isNullOrNotSameClass(this, instanceMetadata)) {
return false;
}
InstanceZKMetadata metadata = (InstanceZKMetadata) instanceMetadata;
return isEqual(_id, metadata._id) && isEqual(_instanceName, metadata._instanceName)
&& isEqual(_instanceType, metadata._instanceType) && isEqual(_instancePort, metadata._instancePort)
&& isEqual(_groupIdMap, metadata._groupIdMap) && isEqual(_partitionMap, metadata._partitionMap);
}
@Override
public int hashCode() {
int result = hashCodeOf(_id);
result = hashCodeOf(result, _instanceName);
result = hashCodeOf(result, _instancePort);
result = hashCodeOf(result, _instanceType);
result = hashCodeOf(result, _groupIdMap);
result = hashCodeOf(result, _partitionMap);
return result;
}
}