blob: e711feaa2db85d76250affd82e03fc15033a9eaf [file] [log] [blame]
package org.apache.helix.model;
/*
* 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.
*/
import java.util.Map;
import org.apache.helix.HelixProperty;
import org.apache.helix.task.TaskConstants;
import org.apache.helix.zookeeper.datamodel.ZNRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Instance that connects to zookeeper (stored ephemerally)
*/
public class LiveInstance extends HelixProperty {
/**
* Saved properties of a live instance
*/
public enum LiveInstanceProperty {
SESSION_ID,
HELIX_VERSION,
LIVE_INSTANCE,
ZKPROPERTYTRANSFERURL,
RESOURCE_CAPACITY,
CURRENT_TASK_THREAD_POOL_SIZE,
/** Represents the status of live instance, eg. PAUSED */
STATUS
}
/**
* Saved values for the {@link LiveInstanceProperty#STATUS} field
*/
public enum LiveInstanceStatus {
PAUSED,
NORMAL
}
/**
* Resource this instance can provide, i.e. thread, memory heap size, CPU cores, etc
*/
public enum InstanceResourceType {
TASK_EXEC_THREAD
}
private static final Logger _logger = LoggerFactory.getLogger(LiveInstance.class.getName());
/**
* Instantiate with an instance identifier
* @param id instance identifier
*/
public LiveInstance(String id) {
super(id);
}
/**
* Instantiate with a pre-populated record
* @param record ZNRecord corresponding to a live instance
*/
public LiveInstance(ZNRecord record) {
super(record);
}
/**
* Set the session that this instance corresponds to in the content of the LiveInstance node.
* Please only use this method for testing or logging purposes. The source of truth should be the node's ephemeral owner.
* @param sessionId session identifier
*/
@Deprecated
public void setSessionId(String sessionId) {
_record.setSimpleField(LiveInstanceProperty.SESSION_ID.toString(), sessionId);
}
/**
* Get the session that this instance corresponds to from the content of the LiveInstance node.
* Please only use this method for testing or logging purposes. The source of truth should be the node's ephemeral owner.
* @return session identifier
*/
@Deprecated
public String getSessionId() {
return _record.getSimpleField(LiveInstanceProperty.SESSION_ID.toString());
}
/**
* Get the ephemeral owner of the LiveInstance node.
*
* TODO This field should be "SessionId", we used getEphemeralOwner to avoid conflict with the existing method.
* Note that we cannot rename or remove the existing method for backward compatibility for now.
* Once the Deprecated method is removed, we shall change the name back to getSessionId.
*
* @return session identifier
*/
public String getEphemeralOwner() {
long ephemeralOwner = _record.getEphemeralOwner();
if (ephemeralOwner <= 0) {
// For backward compatibility, if the ephemeral owner is empty in ZNRecord, still read from node content.
return _record.getSimpleField(LiveInstanceProperty.SESSION_ID.toString());
}
return Long.toHexString(ephemeralOwner);
}
/**
* Get the name of this instance
* @return the instance name
*/
public String getInstanceName() {
return _record.getId();
}
/**
* Get the version of Helix that this instance is running
* @return the version
*/
public String getHelixVersion() {
return _record.getSimpleField(LiveInstanceProperty.HELIX_VERSION.toString());
}
/**
* Set the version of Helix that this instance is running
* @param helixVersion the version
*/
public void setHelixVersion(String helixVersion) {
_record.setSimpleField(LiveInstanceProperty.HELIX_VERSION.toString(), helixVersion);
}
/**
* Gets the live instance's status. Returns {@link LiveInstanceStatus#NORMAL} if the status
* field is not set.
*/
public LiveInstanceStatus getStatus() {
return _record.getEnumField(LiveInstanceProperty.STATUS.name(), LiveInstanceStatus.class,
LiveInstanceStatus.NORMAL);
}
/**
* Sets the status in simple field.
*
* @param status status value
*/
public void setStatus(LiveInstanceStatus status) {
_record.setEnumField(LiveInstanceProperty.STATUS.name(), status);
}
/**
* Get an identifier that represents the instance and where it is located
* @return identifier, e.g. process_id@host
*/
public String getLiveInstance() {
return _record.getSimpleField(LiveInstanceProperty.LIVE_INSTANCE.toString());
}
/**
* Set an identifier that represents the process
* @param liveInstance process identifier, e.g. process_id@host
*/
public void setLiveInstance(String liveInstance) {
_record.setSimpleField(LiveInstanceProperty.LIVE_INSTANCE.toString(), liveInstance);
}
/**
* Get resource quota map of the live instance. Note that this resource name
* refers to compute / storage / network resource that this liveinstance
* has, i.e. thread count, CPU cores, heap size, etc.
* @return resource quota map: key=resourceName, value=quota
*/
public Map<String, String> getResourceCapacityMap() {
return _record.getMapField(LiveInstanceProperty.RESOURCE_CAPACITY.name());
}
/**
* Add a resource quota map to this LiveInstance. For resource quota map, key=resourceName;
* value=quota of that resource. We assume that value can be casted into integers. Note that
* this resourceName refers to compute / storage / network resource that this liveinstance
* has, i.e. thread count, CPU cores, heap size, etc.
*
* @param resourceQuotaMap resourceQuotaMap
*/
public void setResourceCapacityMap(Map<String, String> resourceQuotaMap) {
_record.setMapField(LiveInstanceProperty.RESOURCE_CAPACITY.name(), resourceQuotaMap);
}
/**
* Get the last modified time of this live instance
* @return UNIX timestamp
*/
public long getModifiedTime() {
return _record.getModifiedTime();
}
/**
* Get a web service URL where ZK properties can be transferred to
* @return a fully-qualified URL
*/
public String getWebserviceUrl() {
return _record.getSimpleField(LiveInstanceProperty.ZKPROPERTYTRANSFERURL.toString());
}
/**
* Set a web service URL where ZK properties can be transferred to
* @param url a fully-qualified URL
*/
public void setWebserviceUrl(String url) {
_record.setSimpleField(LiveInstanceProperty.ZKPROPERTYTRANSFERURL.toString(), url);
}
/**
* Get the current task thread pool size of the instance. For backward compatibility, return
* DEFAULT_TASK_THREAD_POOL_SIZE if it's not defined
* @return the current task thread pool size
*/
public int getCurrentTaskThreadPoolSize() {
return _record.getIntField(LiveInstanceProperty.CURRENT_TASK_THREAD_POOL_SIZE.name(),
TaskConstants.DEFAULT_TASK_THREAD_POOL_SIZE);
}
/**
* Set the current task thread pool size of the instance
* @param currentTaskThreadPoolSize the current task thread pool size
*/
public void setCurrentTaskThreadPoolSize(int currentTaskThreadPoolSize) {
_record.setIntField(LiveInstanceProperty.CURRENT_TASK_THREAD_POOL_SIZE.name(),
currentTaskThreadPoolSize);
}
@Override
public boolean isValid() {
if (getEphemeralOwner() == null) {
_logger.error("liveInstance does not have session id. id:" + _record.getId());
return false;
}
if (getHelixVersion() == null) {
_logger.error("liveInstance does not have CLM verion. id:" + _record.getId());
return false;
}
return true;
}
}