package ai.h2o.api.proto.core;
import ai.h2o.api.GrpcUtils;
import io.grpc.stub.StreamObserver;
import water.H2O;
import water.H2ONode;
import water.HeartBeat;
import water.Paxos;
import water.util.PrettyPrint;
import java.util.Date;
/**
*/
public class ClusterService extends ClusterGrpc.ClusterImplBase {
@Override
public void status(Empty request, StreamObserver<ClusterInfo> responseObserver) {
try {
int numUnhealthy = 0;
long now = System.currentTimeMillis();
for (H2ONode node: H2O.CLOUD.members()) {
if (!node.isHealthy(now))
numUnhealthy ++;
}
ClusterInfo cluster = ClusterInfo.newBuilder()
.setVersion(H2O.ABV.projectVersion())
.setBranchName(H2O.ABV.branchName())
.setBuildNumber(H2O.ABV.buildNumber())
.setBuildAge(PrettyPrint.toAge(H2O.ABV.compiledOnDate(), new Date()))
.setName(H2O.ARGS.name)
.setNumNodes(H2O.CLOUD.size())
.setUptimeMs(System.currentTimeMillis() - H2O.START_TIME_MILLIS.get())
.setHasConsensus(Paxos._commonKnowledge)
.setIsLocked(Paxos._cloudLocked)
.setNumNodesUnhealthy(numUnhealthy)
.setClientMode(H2O.ARGS.client)
.build();
responseObserver.onNext(cluster);
responseObserver.onCompleted();
} catch (Throwable ex) {
GrpcUtils.sendError(ex, responseObserver, ClusterInfo.class);
}
}
@Override
public void nodes(Empty request, StreamObserver<NodesInfo> responseObserver) {
try {
NodesInfo.Builder nb = NodesInfo.newBuilder();
for (H2ONode node : H2O.CLOUD.members()) {
HeartBeat heartBeat = node._heartbeat;
NodeInfo.Builder nib = NodeInfo.newBuilder()
.setAddress(node.getIpPortString())
.setIsHealthy(node.isHealthy())
.setPid(heartBeat._pid)
.setNumCpus(heartBeat._num_cpus)
.setNumCpusAllowed(heartBeat._cpus_allowed)
.setSysLoad(heartBeat._system_load_average)
.setMyCpuPercentage(Float.NaN)
.setSysCpuPercentage(Float.NaN)
.setGflops(heartBeat._gflops)
.setMemoryBandwidth(heartBeat._membw)
.setMemoryData(heartBeat.get_kv_mem())
.setMemoryJava(heartBeat.get_pojo_mem())
.setMemoryFree(heartBeat.get_free_mem())
.setNumKeys(heartBeat._keys)
.setNumThreads(heartBeat._nthreads)
.setNumActiveRpcs(heartBeat._rpcs)
.setNumOpenTcps(heartBeat._tcps_active)
.setNumOpenFds(heartBeat._process_num_open_fds);
int nValidPriorities = 0;
for (int priority = 0; priority <= H2O.MAX_PRIORITY; priority++) {
short fjq = heartBeat._fjqueue[priority];
short fjt = heartBeat._fjthrds[priority];
assert (fjq == -1) == (fjt == -1) : "fjqueue and fjthreads are out of sync at priority " + priority;
if (fjq >= 0) {
nib.addFjQueueCount(fjq);
nib.addFjThreadCount(fjt);
nValidPriorities ++;
}
}
// This is just a sanity check that the number of queues was not increased
// surreptitiously without verifying that client code still works
assert nValidPriorities == 8 : "Unexpected number of priority queues";
nb.addNode(nib);
}
responseObserver.onNext(nb.build());
responseObserver.onCompleted();
} catch (Throwable ex) {
GrpcUtils.sendError(ex, responseObserver, NodesInfo.class);
}
}
}