Search in sources :

Example 1 with StringArray

use of com.yahoo.jrt.StringArray in project vespa by vespa-engine.

the class BackendStatistics method invoke.

public void invoke(Request request) {
    try {
        Collection<ClusterSearcher> searchers = clusterSearchers(request);
        List<String> backendIdentificators = new ArrayList<>();
        List<Integer> activeConnections = new ArrayList<>();
        List<Integer> totalConnections = new ArrayList<>();
        for (ClusterSearcher searcher : searchers) {
            for (Map.Entry<String, Backend.BackendStatistics> statistics : searcher.getBackendStatistics().entrySet()) {
                backendIdentificators.add(statistics.getKey());
                activeConnections.add(statistics.getValue().activeConnections);
                totalConnections.add(statistics.getValue().totalConnections());
            }
        }
        Values returnValues = request.returnValues();
        returnValues.add(new StringArray(backendIdentificators.toArray(new String[0])));
        addInt32Array(returnValues, activeConnections);
        addInt32Array(returnValues, totalConnections);
    } catch (Exception e) {
        request.setError(1000, Exceptions.toMessageString(e));
    }
}
Also used : ArrayList(java.util.ArrayList) Values(com.yahoo.jrt.Values) StringArray(com.yahoo.jrt.StringArray) ClusterSearcher(com.yahoo.prelude.cluster.ClusterSearcher) Map(java.util.Map)

Example 2 with StringArray

use of com.yahoo.jrt.StringArray in project vespa by vespa-engine.

the class Register method handleRpcList.

private synchronized void handleRpcList(Request req) {
    Values dst = req.returnValues();
    dst.add(new StringArray(names.toArray(new String[names.size()])));
}
Also used : StringArray(com.yahoo.jrt.StringArray) Values(com.yahoo.jrt.Values)

Example 3 with StringArray

use of com.yahoo.jrt.StringArray in project vespa by vespa-engine.

the class FileDistributionRpcServer method getActiveFileReferencesStatus.

@SuppressWarnings({ "UnusedDeclaration" })
public final void getActiveFileReferencesStatus(Request req) {
    Map<FileReference, Double> downloadStatus = downloader.downloadStatus();
    String[] fileRefArray = new String[downloadStatus.keySet().size()];
    fileRefArray = downloadStatus.keySet().stream().map(FileReference::value).collect(Collectors.toList()).toArray(fileRefArray);
    double[] downloadStatusArray = new double[downloadStatus.values().size()];
    int i = 0;
    for (Double d : downloadStatus.values()) {
        downloadStatusArray[i++] = d;
    }
    req.returnValues().add(new StringArray(fileRefArray));
    req.returnValues().add(new DoubleArray(downloadStatusArray));
}
Also used : StringArray(com.yahoo.jrt.StringArray) FileReference(com.yahoo.config.FileReference) DoubleArray(com.yahoo.jrt.DoubleArray)

Example 4 with StringArray

use of com.yahoo.jrt.StringArray in project vespa by vespa-engine.

the class RpcServer method handleRpcRequests.

public boolean handleRpcRequests(ContentCluster cluster, ClusterState systemState, NodeStateOrHostInfoChangeHandler changeListener, NodeAddedOrRemovedListener addedListener) {
    boolean handledAnyRequests = false;
    if (!isConnected()) {
        long time = timer.getCurrentTimeInMillis();
        try {
            connect();
        } catch (ListenFailedException e) {
            if (!e.getMessage().equals(lastConnectError) || time - lastConnectErrorTime > 60 * 1000) {
                lastConnectError = e.getMessage();
                lastConnectErrorTime = time;
                log.log(LogLevel.WARNING, "Failed to bind RPC server to port " + port + ": " + e.getMessage());
            }
        } catch (Exception e) {
            if (!e.getMessage().equals(lastConnectError) || time - lastConnectErrorTime > 60 * 1000) {
                lastConnectError = e.getMessage();
                lastConnectErrorTime = time;
                log.log(LogLevel.WARNING, "Failed to initailize RPC server socket: " + e.getMessage());
            }
        }
    }
    for (int j = 0; j < 10; ++j) {
        // Max perform 10 RPC requests per cycle.
        Request req;
        synchronized (monitor) {
            if (rpcRequests.isEmpty())
                break;
            Iterator<Request> it = rpcRequests.iterator();
            req = it.next();
            it.remove();
            handledAnyRequests = true;
        }
        try {
            if (req.methodName().equals("getMaster")) {
                log.log(LogLevel.DEBUG, "Resolving RPC getMaster request");
                Integer master = masterHandler.getMaster();
                String masterReason = masterHandler.getMasterReason();
                req.returnValues().add(new Int32Value(master == null ? -1 : master));
                req.returnValues().add(new StringValue(masterReason == null ? "No reason given" : masterReason));
                req.returnRequest();
                continue;
            }
            if (!masterHandler.isMaster()) {
                throw new IllegalStateException("Refusing to answer RPC calls as we are not the master fleetcontroller.");
            }
            if (req.methodName().equals("getNodeList")) {
                log.log(LogLevel.DEBUG, "Resolving RPC getNodeList request");
                List<String> slobrok = new ArrayList<String>();
                List<String> rpc = new ArrayList<String>();
                for (NodeInfo node : cluster.getNodeInfo()) {
                    String s1 = node.getSlobrokAddress();
                    String s2 = node.getRpcAddress();
                    assert (s1 != null);
                    slobrok.add(s1);
                    rpc.add(s2 == null ? "" : s2);
                }
                req.returnValues().add(new StringArray(slobrok.toArray(new String[slobrok.size()])));
                req.returnValues().add(new StringArray(rpc.toArray(new String[rpc.size()])));
                req.returnRequest();
            } else if (req.methodName().equals("getSystemState")) {
                log.log(LogLevel.DEBUG, "Resolving RPC getSystemState request");
                req.returnValues().add(new StringValue(""));
                req.returnValues().add(new StringValue(systemState.toString(true)));
                req.returnRequest();
            } else if (req.methodName().equals("getNodeState")) {
                log.log(LogLevel.DEBUG, "Resolving RPC getNodeState request");
                NodeType nodeType = NodeType.get(req.parameters().get(0).asString());
                int nodeIndex = req.parameters().get(1).asInt32();
                Node node = new Node(nodeType, nodeIndex);
                // First parameter is current state in system state
                NodeState ns = systemState.getNodeState(node);
                req.returnValues().add(new StringValue(systemState.getNodeState(node).serialize()));
                // Second parameter is state node is reporting
                NodeInfo nodeInfo = cluster.getNodeInfo(node);
                if (nodeInfo == null)
                    throw new RuntimeException("No node " + node + " exists in cluster " + cluster.getName());
                NodeState fromNode = nodeInfo.getReportedState();
                req.returnValues().add(new StringValue(fromNode == null ? "unknown" : fromNode.serialize()));
                // Third parameter is state node has been requested to be in
                req.returnValues().add(new StringValue(nodeInfo.getWantedState().serialize()));
                // Fourth parameter is RPC address of node
                req.returnValues().add(new StringValue(nodeInfo.getRpcAddress() == null ? "" : nodeInfo.getRpcAddress()));
                req.returnRequest();
            } else if (req.methodName().equals("setNodeState")) {
                String slobrokAddress = req.parameters().get(0).asString();
                int lastSlash = slobrokAddress.lastIndexOf('/');
                int nextButLastSlash = slobrokAddress.lastIndexOf('/', lastSlash - 1);
                if (lastSlash == -1 || nextButLastSlash == -1) {
                    throw new IllegalStateException("Invalid slobrok address '" + slobrokAddress + "'.");
                }
                NodeType nodeType = NodeType.get(slobrokAddress.substring(nextButLastSlash + 1, lastSlash));
                Integer nodeIndex = Integer.valueOf(slobrokAddress.substring(lastSlash + 1));
                NodeInfo node = cluster.getNodeInfo(new Node(nodeType, nodeIndex));
                if (node == null)
                    throw new IllegalStateException("Cannot set wanted state of node " + new Node(nodeType, nodeIndex) + ". Index does not correspond to a configured node.");
                NodeState nodeState = NodeState.deserialize(nodeType, req.parameters().get(1).asString());
                if (nodeState.getDescription().equals("") && !nodeState.getState().equals(State.UP) && !nodeState.getState().equals(State.RETIRED)) {
                    nodeState.setDescription("Set by remote RPC client");
                }
                NodeState oldState = node.getUserWantedState();
                String message = (nodeState.getState().equals(State.UP) ? "Clearing wanted nodeState for node " + node : "New wantedstate '" + nodeState.toString() + "' stored for node " + node);
                if (!oldState.equals(nodeState) || !oldState.getDescription().equals(nodeState.getDescription())) {
                    if (!nodeState.getState().validWantedNodeState(nodeType)) {
                        throw new IllegalStateException("State " + nodeState.getState() + " can not be used as wanted state for node of type " + nodeType);
                    }
                    node.setWantedState(nodeState);
                    changeListener.handleNewWantedNodeState(node, nodeState);
                } else {
                    message = "Node " + node + " already had wanted state " + nodeState.toString();
                    log.log(LogLevel.DEBUG, message);
                }
                req.returnValues().add(new StringValue(message));
                req.returnRequest();
                if (nodeState.getState() == State.UP && node.getPrematureCrashCount() > 0) {
                    log.log(LogLevel.INFO, "Clearing premature crash count of " + node.getPrematureCrashCount() + " as wanted state was set to up");
                    node.setPrematureCrashCount(0);
                }
            }
        } catch (Exception e) {
            if (log.isLoggable(LogLevel.DEBUG)) {
                StringWriter sw = new StringWriter();
                e.printStackTrace(new PrintWriter(sw));
                log.log(LogLevel.DEBUG, "Failed RPC Request: " + sw);
            }
            String errorMsg = e.getMessage();
            if (errorMsg == null) {
                errorMsg = e.toString();
            }
            req.setError(ErrorCode.METHOD_FAILED, errorMsg);
            req.returnRequest();
        }
    }
    return handledAnyRequests;
}
Also used : NodeState(com.yahoo.vdslib.state.NodeState) Node(com.yahoo.vdslib.state.Node) Request(com.yahoo.jrt.Request) ArrayList(java.util.ArrayList) ListenFailedException(com.yahoo.jrt.ListenFailedException) UnknownHostException(java.net.UnknownHostException) ListenFailedException(com.yahoo.jrt.ListenFailedException) StringArray(com.yahoo.jrt.StringArray) StringWriter(java.io.StringWriter) NodeInfo(com.yahoo.vespa.clustercontroller.core.NodeInfo) NodeType(com.yahoo.vdslib.state.NodeType) Int32Value(com.yahoo.jrt.Int32Value) StringValue(com.yahoo.jrt.StringValue) PrintWriter(java.io.PrintWriter)

Example 5 with StringArray

use of com.yahoo.jrt.StringArray in project vespa by vespa-engine.

the class FileDistributionImpl method startDownloadingFileReferences.

// Notifies config proxy which file references it should start downloading. It's OK if the call does not succeed,
// as downloading will then start synchronously when a service requests a file reference instead
private void startDownloadingFileReferences(String hostName, int port, Set<FileReference> fileReferences) {
    Target target = supervisor.connect(new Spec(hostName, port));
    double timeout = 0.1;
    Request request = new Request("filedistribution.setFileReferencesToDownload");
    request.parameters().add(new StringArray(fileReferences.stream().map(FileReference::value).toArray(String[]::new)));
    log.log(LogLevel.DEBUG, "Executing " + request.methodName() + " against " + target.toString());
    target.invokeSync(request, timeout);
    if (request.isError() && request.errorCode() != ErrorCode.CONNECTION) {
        log.log(LogLevel.DEBUG, request.methodName() + " failed: " + request.errorCode() + " (" + request.errorMessage() + ")");
    }
    target.close();
}
Also used : Target(com.yahoo.jrt.Target) StringArray(com.yahoo.jrt.StringArray) Request(com.yahoo.jrt.Request) Spec(com.yahoo.jrt.Spec)

Aggregations

StringArray (com.yahoo.jrt.StringArray)6 Request (com.yahoo.jrt.Request)2 StringValue (com.yahoo.jrt.StringValue)2 Values (com.yahoo.jrt.Values)2 ArrayList (java.util.ArrayList)2 FileReference (com.yahoo.config.FileReference)1 DataValue (com.yahoo.jrt.DataValue)1 DoubleArray (com.yahoo.jrt.DoubleArray)1 DoubleValue (com.yahoo.jrt.DoubleValue)1 Int32Array (com.yahoo.jrt.Int32Array)1 Int32Value (com.yahoo.jrt.Int32Value)1 ListenFailedException (com.yahoo.jrt.ListenFailedException)1 Spec (com.yahoo.jrt.Spec)1 Target (com.yahoo.jrt.Target)1 Error (com.yahoo.messagebus.Error)1 ClusterSearcher (com.yahoo.prelude.cluster.ClusterSearcher)1 Node (com.yahoo.vdslib.state.Node)1 NodeState (com.yahoo.vdslib.state.NodeState)1 NodeType (com.yahoo.vdslib.state.NodeType)1 NodeInfo (com.yahoo.vespa.clustercontroller.core.NodeInfo)1