Search in sources :

Example 16 with StringValue

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

the class DummyVdsNode method sendGetNodeStateReply.

public boolean sendGetNodeStateReply(int index) {
    for (Iterator<Req> it = waitingRequests.iterator(); it.hasNext(); ) {
        Req r = it.next();
        if (r.request.parameters().size() > 2 && r.request.parameters().get(2).asInt32() == index) {
            log.log(LogLevel.DEBUG, "Dummy node " + DummyVdsNode.this.toString() + ": Responding to node state reply from controller " + index + " as we received new one");
            r.request.returnValues().add(new StringValue(nodeState.serialize()));
            r.request.returnValues().add(new StringValue("No host info from dummy implementation"));
            r.request.returnRequest();
            it.remove();
            ++outdatedStateReplies;
            return true;
        }
    }
    return false;
}
Also used : StringValue(com.yahoo.jrt.StringValue)

Example 17 with StringValue

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

the class ContainerRpcAdaptor method list.

public void list(Request request) {
    try {
        StringBuilder buffer = new StringBuilder("Installed bundles:");
        for (Bundle bundle : osgi.getBundles()) {
            if (bundle.getSymbolicName().equals("system.bundle"))
                continue;
            buffer.append("\n");
            buffer.append(bundle.getSymbolicName());
            buffer.append(" (");
            buffer.append(bundle.getLocation());
            buffer.append(")");
        }
        request.returnValues().add(new StringValue(buffer.toString()));
    } catch (Exception e) {
        request.setError(ErrorCode.METHOD_FAILED, Exceptions.toMessageString(e));
    }
}
Also used : Bundle(org.osgi.framework.Bundle) StringValue(com.yahoo.jrt.StringValue) ListenFailedException(com.yahoo.jrt.ListenFailedException)

Example 18 with StringValue

use of com.yahoo.jrt.StringValue 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 19 with StringValue

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

the class ConfigProxyRpcServerTest method testRpcMethodUpdateSources.

/**
 * Tests updateSources RPC command
 */
@Test
public void testRpcMethodUpdateSources() {
    Request req = new Request("updateSources");
    String spec1 = "tcp/a:19070";
    String spec2 = "tcp/b:19070";
    req.parameters().add(new StringValue(spec1 + "," + spec2));
    rpcServer.updateSources(req);
    assertFalse(req.errorMessage(), req.isError());
    assertThat(req.returnValues().size(), is(1));
    assertThat(req.returnValues().get(0).asString(), is("Updated config sources to: " + spec1 + "," + spec2));
    proxyServer.setMode(Mode.ModeName.MEMORYCACHE.name());
    req = new Request("updateSources");
    req.parameters().add(new StringValue(spec1 + "," + spec2));
    rpcServer.updateSources(req);
    assertFalse(req.errorMessage(), req.isError());
    assertThat(req.returnValues().size(), is(1));
    assertThat(req.returnValues().get(0).asString(), is("Cannot update sources when in '" + Mode.ModeName.MEMORYCACHE.name().toLowerCase() + "' mode"));
// TODO source connections needs to have deterministic order to work
/*req = new Request("listSourceConnections");
        rpcServer.listSourceConnections(req);
        assertFalse(req.errorMessage(), req.isError());
        final String[] ret = req.returnValues().get(0).asStringArray();
        assertThat(ret.length, is(2));
        assertThat(ret[0], is("Current source: " + spec1));
        assertThat(ret[1], is("All sources:\n" + spec2 + "\n" + spec1 + "\n"));
        */
}
Also used : Request(com.yahoo.jrt.Request) StringValue(com.yahoo.jrt.StringValue) Test(org.junit.Test)

Example 20 with StringValue

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

the class ConfigProxyRpcServerTest method testRpcMethodDumpCache.

/**
 * Tests dumpCache RPC command
 */
@Test
public void testRpcMethodDumpCache() {
    Request req = new Request("dumpCache");
    String path = "/tmp";
    req.parameters().add(new StringValue(path));
    rpcServer.dumpCache(req);
    assertFalse(req.errorMessage(), req.isError());
    assertThat(req.returnValues().size(), is(1));
    assertThat(req.returnValues().get(0).asString(), is("success"));
}
Also used : Request(com.yahoo.jrt.Request) StringValue(com.yahoo.jrt.StringValue) Test(org.junit.Test)

Aggregations

StringValue (com.yahoo.jrt.StringValue)24 Request (com.yahoo.jrt.Request)14 Spec (com.yahoo.jrt.Spec)8 Supervisor (com.yahoo.jrt.Supervisor)7 Target (com.yahoo.jrt.Target)7 Transport (com.yahoo.jrt.Transport)7 Test (org.junit.Test)7 Int32Value (com.yahoo.jrt.Int32Value)5 NodeState (com.yahoo.vdslib.state.NodeState)4 ConfiguredNode (com.yahoo.vdslib.distribution.ConfiguredNode)3 Node (com.yahoo.vdslib.state.Node)3 UnknownHostException (java.net.UnknownHostException)3 FileReference (com.yahoo.config.FileReference)2 DataValue (com.yahoo.jrt.DataValue)2 ListenFailedException (com.yahoo.jrt.ListenFailedException)2 StringArray (com.yahoo.jrt.StringArray)2 Distribution (com.yahoo.vdslib.distribution.Distribution)2 TreeSet (java.util.TreeSet)2 DoubleValue (com.yahoo.jrt.DoubleValue)1 Int32Array (com.yahoo.jrt.Int32Array)1