Search in sources :

Example 1 with ManagementServer

use of org.corfudb.infrastructure.ManagementServer in project CorfuDB by CorfuDB.

the class QCSMRobject method main.

public static String[] main(String[] args) {
    if (args != null && args.length > 0 && args[0].contentEquals("reboot")) {
        ManagementServer ms = CorfuServer.getManagementServer();
        ms.shutdown();
        CorfuServer.addManagementServer();
        LogUnitServer ls = CorfuServer.getLogUnitServer();
        if (ls != null) {
            ls.shutdown();
            CorfuServer.addLogUnit();
            return replyOk();
        } else {
            return replyErr("No active log server");
        }
    }
    // Parse the options given, using docopt.
    Map<String, Object> opts = new Docopt(USAGE).withVersion(GitRepositoryState.getRepositoryState().describe).parse(args);
    // Get a org.corfudb.runtime instance from the options.
    String config = (String) opts.get("--config");
    String qapp = (String) opts.get("--quickcheck-ap-prefix");
    String addressportPrefix = "";
    if (qapp != null) {
        addressportPrefix = qapp;
    }
    CorfuRuntime rt;
    if (rtMap.get(addressportPrefix + config) == null) {
        rt = configureRuntime(opts);
        rtMap.putIfAbsent(addressportPrefix + config, rt);
    }
    rt = (CorfuRuntime) rtMap.get(addressportPrefix + config);
    String argz = ((String) opts.get("<args>"));
    int arity;
    String[] split;
    if (argz == null) {
        split = new String[0];
        arity = 0;
    } else {
        split = argz.split(",");
        if (argz.charAt(argz.length() - 1) == ',') {
            arity = split.length + 1;
            String[] new_split = new String[arity];
            for (int i = 0; i < arity - 1; i++) {
                new_split[i] = split[i];
            }
            new_split[arity - 1] = "";
            split = new_split;
        } else {
            arity = split.length;
        }
    }
    // Attempt to open the object
    Class<?> cls;
    try {
        cls = Class.forName((String) opts.get("<class>"));
    } catch (ClassNotFoundException cnfe) {
        throw new RuntimeException(cnfe);
    }
    Object o = rt.getObjectsView().build().setStreamName((String) opts.get("--stream-id")).setType(cls).open();
    // Use reflection to find the method...
    Method m;
    try {
        m = Arrays.stream(cls.getDeclaredMethods()).filter(x -> x.getName().equals(opts.get("<method>"))).filter(x -> x.getParameterCount() == arity).findFirst().get();
    } catch (NoSuchElementException nsee) {
        return replyErr("Method " + opts.get("<method>") + " with " + arity + " arguments not found!");
    }
    if (m == null) {
        return replyErr("Method " + opts.get("<method>") + " with " + arity + " arguments not found!");
    }
    Object ret;
    final int c10 = 10, c50 = 50;
    for (int i = 0; i < c10; i++) {
        try {
            ret = m.invoke(o, split);
        } catch (InvocationTargetException e) {
            Throwable c = ExceptionUtils.getCause(e);
            if (c.getClass() == org.corfudb.runtime.exceptions.NetworkException.class && c.toString().matches(".*Disconnected endpoint.*")) {
                // caused by a disconnection with the remote endpoint.
                try {
                    Thread.sleep(c50);
                } catch (InterruptedException ie) {
                }
                ;
                continue;
            } else {
                return replyErr("exception", e.getClass().getSimpleName(), "stack: " + ExceptionUtils.getStackTrace(e), "cause: " + ExceptionUtils.getCause(e));
            }
        } catch (IllegalAccessException e) {
            return replyErr("exception", e.getClass().getSimpleName(), "stack: " + ExceptionUtils.getStackTrace(e));
        } catch (Exception e) {
            return replyErr("Exception on object: " + e, "stack: " + ExceptionUtils.getStackTrace(e), "cause: " + ExceptionUtils.getCause(e));
        }
        if (ret != null) {
            return replyOk(ret.toString());
        } else {
            return replyOk();
        }
    }
    return replyErr("Exhausted for loop retries");
}
Also used : QCUtil.replyErr(org.corfudb.util.quickcheck.QCUtil.replyErr) Arrays(java.util.Arrays) GitRepositoryState(org.corfudb.util.GitRepositoryState) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) LogUnitServer(org.corfudb.infrastructure.LogUnitServer) Docopt(org.docopt.Docopt) QCUtil.replyOk(org.corfudb.util.quickcheck.QCUtil.replyOk) ManagementServer(org.corfudb.infrastructure.ManagementServer) InvocationTargetException(java.lang.reflect.InvocationTargetException) ExceptionUtils(org.codehaus.plexus.util.ExceptionUtils) Map(java.util.Map) CorfuRuntime(org.corfudb.runtime.CorfuRuntime) CorfuServer(org.corfudb.infrastructure.CorfuServer) QCUtil.configureRuntime(org.corfudb.util.quickcheck.QCUtil.configureRuntime) NoSuchElementException(java.util.NoSuchElementException) Method(java.lang.reflect.Method) Method(java.lang.reflect.Method) InvocationTargetException(java.lang.reflect.InvocationTargetException) InvocationTargetException(java.lang.reflect.InvocationTargetException) NoSuchElementException(java.util.NoSuchElementException) ManagementServer(org.corfudb.infrastructure.ManagementServer) Docopt(org.docopt.Docopt) CorfuRuntime(org.corfudb.runtime.CorfuRuntime) LogUnitServer(org.corfudb.infrastructure.LogUnitServer) NoSuchElementException(java.util.NoSuchElementException)

Aggregations

InvocationTargetException (java.lang.reflect.InvocationTargetException)1 Method (java.lang.reflect.Method)1 Arrays (java.util.Arrays)1 Map (java.util.Map)1 NoSuchElementException (java.util.NoSuchElementException)1 ConcurrentHashMap (java.util.concurrent.ConcurrentHashMap)1 ExceptionUtils (org.codehaus.plexus.util.ExceptionUtils)1 CorfuServer (org.corfudb.infrastructure.CorfuServer)1 LogUnitServer (org.corfudb.infrastructure.LogUnitServer)1 ManagementServer (org.corfudb.infrastructure.ManagementServer)1 CorfuRuntime (org.corfudb.runtime.CorfuRuntime)1 GitRepositoryState (org.corfudb.util.GitRepositoryState)1 QCUtil.configureRuntime (org.corfudb.util.quickcheck.QCUtil.configureRuntime)1 QCUtil.replyErr (org.corfudb.util.quickcheck.QCUtil.replyErr)1 QCUtil.replyOk (org.corfudb.util.quickcheck.QCUtil.replyOk)1 Docopt (org.docopt.Docopt)1