blob: dc0ce18ae0b8fdcecbcc33dd94ee3769fd77e48e [file] [log] [blame]
/**
* 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.hdds.scm.node;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import java.util.Objects;
/**
* This class is used to capture the current status of a datanode. This
* includes its health (healthy, stale or dead) and its operation status (
* in_service, decommissioned and maintenance mode) along with the expiry time
* for the operational state (used with maintenance mode).
*/
public class NodeStatus {
private HddsProtos.NodeOperationalState operationalState;
private HddsProtos.NodeState health;
private long opStateExpiryEpochSeconds;
public NodeStatus(HddsProtos.NodeOperationalState operationalState,
HddsProtos.NodeState health) {
this.operationalState = operationalState;
this.health = health;
this.opStateExpiryEpochSeconds = 0;
}
public NodeStatus(HddsProtos.NodeOperationalState operationalState,
HddsProtos.NodeState health,
long opStateExpireEpocSeconds) {
this.operationalState = operationalState;
this.health = health;
this.opStateExpiryEpochSeconds = opStateExpireEpocSeconds;
}
public static NodeStatus inServiceHealthy() {
return new NodeStatus(HddsProtos.NodeOperationalState.IN_SERVICE,
HddsProtos.NodeState.HEALTHY);
}
public static NodeStatus inServiceHealthyReadOnly() {
return new NodeStatus(HddsProtos.NodeOperationalState.IN_SERVICE,
HddsProtos.NodeState.HEALTHY_READONLY);
}
public static NodeStatus inServiceStale() {
return new NodeStatus(HddsProtos.NodeOperationalState.IN_SERVICE,
HddsProtos.NodeState.STALE);
}
public static NodeStatus inServiceDead() {
return new NodeStatus(HddsProtos.NodeOperationalState.IN_SERVICE,
HddsProtos.NodeState.DEAD);
}
public HddsProtos.NodeState getHealth() {
return health;
}
public HddsProtos.NodeOperationalState getOperationalState() {
return operationalState;
}
public long getOpStateExpiryEpochSeconds() {
return opStateExpiryEpochSeconds;
}
public boolean operationalStateExpired() {
if (0 == opStateExpiryEpochSeconds) {
return false;
}
return System.currentTimeMillis() / 1000 >= opStateExpiryEpochSeconds;
}
/**
* Returns true if the nodeStatus indicates the node is in any decommission
* state.
*
* @return True if the node is in any decommission state, false otherwise
*/
public boolean isDecommission() {
return operationalState == HddsProtos.NodeOperationalState.DECOMMISSIONING
|| operationalState == HddsProtos.NodeOperationalState.DECOMMISSIONED;
}
/**
* Returns true if the node is currently decommissioning.
*
* @return True if the node is decommissioning, false otherwise
*/
public boolean isDecommissioning() {
return operationalState == HddsProtos.NodeOperationalState.DECOMMISSIONING;
}
/**
* Returns true if the node is decommissioned.
*
* @return True if the node is decommissioned, false otherwise
*/
public boolean isDecommissioned() {
return operationalState == HddsProtos.NodeOperationalState.DECOMMISSIONED;
}
/**
* Returns true if the node is in any maintenance state.
*
* @return True if the node is in any maintenance state, false otherwise
*/
public boolean isMaintenance() {
return operationalState
== HddsProtos.NodeOperationalState.ENTERING_MAINTENANCE
|| operationalState == HddsProtos.NodeOperationalState.IN_MAINTENANCE;
}
/**
* Returns true if the node is currently entering maintenance.
*
* @return True if the node is entering maintenance, false otherwise
*/
public boolean isEnteringMaintenance() {
return operationalState
== HddsProtos.NodeOperationalState.ENTERING_MAINTENANCE;
}
/**
* Returns true if the node is currently in maintenance.
*
* @return True if the node is in maintenance, false otherwise.
*/
public boolean isInMaintenance() {
return operationalState == HddsProtos.NodeOperationalState.IN_MAINTENANCE;
}
/**
* Returns true if the nodeStatus is healthy (ie not stale or dead) and false
* otherwise.
*
* @return True if the node is Healthy, false otherwise
*/
public boolean isHealthy() {
return health == HddsProtos.NodeState.HEALTHY;
}
/**
* Returns true if the nodeStatus is either healthy or stale and false
* otherwise.
*
* @return True is the node is Healthy or Stale, false otherwise.
*/
public boolean isAlive() {
return health == HddsProtos.NodeState.HEALTHY
|| health == HddsProtos.NodeState.STALE;
}
/**
* Returns true if the nodeStatus is dead and false otherwise.
*
* @return True is the node is Dead, false otherwise.
*/
public boolean isDead() {
return health == HddsProtos.NodeState.DEAD;
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
NodeStatus other = (NodeStatus) obj;
if (this.operationalState == other.operationalState &&
this.health == other.health
&& this.opStateExpiryEpochSeconds == other.opStateExpiryEpochSeconds) {
return true;
}
return false;
}
@Override
public int hashCode() {
return Objects.hash(health, operationalState, opStateExpiryEpochSeconds);
}
@Override
public String toString() {
return "OperationalState: "+operationalState+" Health: "+health+
" OperastionStateExpiry: "+opStateExpiryEpochSeconds;
}
}