@Override public void onNodeRemoved(OperationsNodeInfo node) { for (int i = 0; i < replicas; i++) { LOG.trace("Removing node {} replica {} from the circle", node.getConnectionInfo(), i); circle.remove(hash(node, i)); } }
private static String toString(OperationsNodeInfo node) { return "[" + node.getConnectionInfo().getThriftHost() + ":" + node.getConnectionInfo().getThriftPort() + ":" + node.getTimeStarted() + "]-[" + node.getLoadInfo() + "]"; }
/** * Use when one need to write an OperationsNodeInfo instance to logs. The OperationsNodeInfo * instance has ByteBuffer fields which should be represented in log files as null because their * values are unrepresentative and redundant. * * @param format the format string * @param node the instance of OperationsNodeInfo * @param resolver the instance of OperationsServerResolver */ private void writeLogWithoutByteBuffer(String format, OperationsNodeInfo node, OperationsServerResolver resolver) { // Temporary remove connection info for transports Map<TransportMetaData, Map<VersionConnectionInfoPair, ByteBuffer>> transportMetaData = new HashMap<>(); node.getTransports().forEach(transport -> transportMetaData.put(transport, removeTransportConnectionInfo(transport))); // Temporary remove public key final ByteBuffer publicKey = node.getConnectionInfo().getPublicKey(); node.getConnectionInfo().setPublicKey(null); LOG.info(format, node, resolver); // Restore connection info for transports node.getTransports().forEach(transport -> restoreTransportConnectionInfo(transport, transportMetaData.get(transport))); // Restore public key node.getConnectionInfo().setPublicKey(publicKey); }
@Override public String toString() { return "OperationsNode {" + "host =" + nodeInfo.getConnectionInfo().getThriftHost() + "port =" + nodeInfo.getConnectionInfo().getThriftPort() + "timeStarted =" + nodeInfo.getTimeStarted() + '}'; } }
@Override public void onNodeUpdated(OperationsNodeInfo nodeInfo) { String dnsName = getNameFromConnectionInfo(nodeInfo.getConnectionInfo()); int accessPointId = ServerNameUtil.crc32(nodeInfo.getConnectionInfo()); LOG.info("Operations server [{}][{}] updated", accessPointId, dnsName); if (opsServersMap.containsKey(accessPointId)) { opsServersMap.get(accessPointId).history.addOpsServerLoad(nodeInfo.getLoadInfo()); } else { addNewOperationsServer(accessPointId, dnsName, nodeInfo); } }
OperationsNodeInfo nodeInfo = new OperationsNodeInfo(); ByteBuffer keyData = ByteBuffer.wrap(operationsKeyStoreService.getPublicKey().getEncoded()); nodeInfo.setConnectionInfo(new ConnectionInfo(getNodeConfig().getThriftHost(), getNodeConfig().getThriftPort(), keyData)); nodeInfo.setLoadInfo(new LoadInfo(DEFAULT_LOAD_INDEX, 1.0)); nodeInfo.setTransports(new ArrayList<TransportMetaData>()); operationsNode = new OperationsNode(nodeInfo, zkClient); try {
/** * Operations Node removed. * * @param data the data */ protected void endpointRemoved(ChildData data) { OperationsNodeInfo nodeInfo = extractOperationServerInfo(data); String endpointAddress = constructEndpointAddress(nodeInfo); Long removeTime = nodeInfo.getTimeStarted(); Long updateTime = operationNodesStartTimes.get(endpointAddress); if (updateTime == null || removeTime >= updateTime) { operationNodesStartTimes.remove(endpointAddress); for (OperationsNodeListener listener : endpointListeners) { listener.onNodeRemoved(nodeInfo); } } else { LOG.debug("Ignoring [{}] endpoint removal, as it was before add/update", endpointAddress); } }
@Override public void onStatusUpdate(AkkaServiceStatus status) { try { OperationsNodeInfo nodeInfo = operationsNode.getNodeInfo(); OperatingSystemMXBean operatingSystemMxBean = ManagementFactory.getOperatingSystemMXBean(); nodeInfo.setLoadInfo(new LoadInfo( status.getEndpointCount(), operatingSystemMxBean.getSystemLoadAverage())); operationsNode.updateNodeData(nodeInfo); LOG.info("Updated load info: {}", nodeInfo.getLoadInfo()); } catch (Exception ex) { LOG.error("Failed to report status update to control service", ex); } } }
@Override public OperationsNodeInfo build() { try { OperationsNodeInfo record = new OperationsNodeInfo(); record.connectionInfo = fieldSetFlags()[0] ? this.connectionInfo : (org.kaaproject.kaa.server.common.zk.gen.ConnectionInfo) defaultValue(fields()[0]); record.loadInfo = fieldSetFlags()[1] ? this.loadInfo : (org.kaaproject.kaa.server.common.zk.gen.LoadInfo) defaultValue(fields()[1]); record.timeStarted = fieldSetFlags()[2] ? this.timeStarted : (java.lang.Long) defaultValue(fields()[2]); record.transports = fieldSetFlags()[3] ? this.transports : (java.util.List<org.kaaproject.kaa.server.common.zk.gen.TransportMetaData>) defaultValue(fields()[3]); return record; } catch (Exception e) { throw new org.apache.avro.AvroRuntimeException(e); } } }
/** * Instantiates a new endpoint node. * * @param nodeInfo the node info */ public OperationsNode(OperationsNodeInfo nodeInfo) { super(); this.nodeInfo = nodeInfo; this.nodeInfo.setTimeStarted(System.currentTimeMillis()); }
@Override public void onTransportsStarted(List<TransportMetaData> mdList) { if (operationsNode != null) { OperationsNodeInfo info = operationsNode.getNodeInfo(); info.setTransports(mdList); try { operationsNode.updateNodeData(info); } catch (IOException ex) { LOG.error("Failed to update bootstrap node info", ex); } } }
/** * The Constructor. * * @param opsServer the Operations Server * @param nodeInfo the node info */ public OperationsServerMeta(ThriftOperationsServer opsServer, OperationsNodeInfo nodeInfo) { this.opsServer = opsServer; this.nodeInfo = nodeInfo; history = new OperationsServerLoadHistory(opsLoadHistoryTtl); history.addOpsServerLoad(nodeInfo.getLoadInfo()); } }
protected Set<ProtocolConnectionData> filterProtocolInstances(List<ProtocolVersionId> keys) { Set<ProtocolConnectionData> result = new HashSet<>(); for (ProtocolVersionId key : keys) { for (OperationsNodeInfo node : opsMap.values()) { for (TransportMetaData md : node.getTransports()) { if (md.getId() == key.getProtocolId() && md.getMinSupportedVersion() <= key.getVersion() && key.getVersion() <= md.getMaxSupportedVersion()) { result.addAll(toProtocolConnectionData(node, md, key.getVersion())); } } } } return result; }
/** * Gets the current endpoint nodes. * * @return the current endpoint nodes */ public List<OperationsNodeInfo> getCurrentOperationServerNodes() { List<ChildData> nodesData = endpointCache != null ? endpointCache .getCurrentData() : new ArrayList<ChildData>(); Map<ConnectionInfoKey, OperationsNodeInfo> uniqueMap = new HashMap<>(); for (ChildData data : nodesData) { OperationsNodeInfo newNodeInfo = extractOperationServerInfo(data); ConnectionInfoKey key = new ConnectionInfoKey(newNodeInfo.getConnectionInfo()); OperationsNodeInfo oldNodeInfo = uniqueMap.get(key); if (oldNodeInfo != null) { if (newNodeInfo.getTimeStarted() >= oldNodeInfo.getTimeStarted()) { uniqueMap.put(key, newNodeInfo); } } else { uniqueMap.put(key, newNodeInfo); } } return new ArrayList<>(uniqueMap.values()); }
/** * Operations Node added. * * @param data the data */ protected void endpointAdded(ChildData data) { OperationsNodeInfo nodeInfo = extractOperationServerInfo(data); String endpointAddress = constructEndpointAddress(nodeInfo); operationNodesStartTimes.put(endpointAddress, nodeInfo.getTimeStarted()); for (OperationsNodeListener listener : endpointListeners) { listener.onNodeAdded(nodeInfo); } }
/** * Instantiates a new endpoint node. * * @param nodeInfo the node info * @param zkClient Zookeeper client */ public OperationsNode(OperationsNodeInfo nodeInfo, CuratorFramework zkClient) { super(zkClient); this.nodeInfo = nodeInfo; this.nodeInfo.setTimeStarted(System.currentTimeMillis()); }
@Override public void onNodeAdded(OperationsNodeInfo node) { for (int i = 0; i < replicas; i++) { LOG.trace("Adding node {} replica {} to the circle", node.getConnectionInfo(), i); circle.put(hash(node, i), node); } }
/** * Operations Node updated. * * @param data the data */ protected void endpointUpdated(ChildData data) { OperationsNodeInfo nodeInfo = extractOperationServerInfo(data); String endpointAddress = constructEndpointAddress(nodeInfo); operationNodesStartTimes.put(endpointAddress, nodeInfo.getTimeStarted()); for (OperationsNodeListener listener : endpointListeners) { listener.onNodeUpdated(nodeInfo); } }
@Override public void doWithZkClient(CuratorFramework client) throws Exception { nodeInfo.setTimeStarted(System.currentTimeMillis()); nodePath = client .create() .creatingParentsIfNeeded() .withMode(CreateMode.EPHEMERAL_SEQUENTIAL) .forPath(OPERATIONS_SERVER_NODE_PATH + OPERATIONS_SERVER_NODE_PATH, operationsNodeAvroConverter.get().toByteArray(nodeInfo)); LOG.info("Created node with path: " + nodePath); } });
@Override public boolean isMainUserNode(String userId) { OperationsNodeInfo info = resolver.getNode(userId); if (info == null) { return false; } LOG.trace("comparing {} to {} for user {}", id, info.getConnectionInfo(), userId); return id.equals(Neighbors.getServerId(info.getConnectionInfo())); }