예제 #1
0
  private void spawnInner(
      int processes,
      int serverIndex,
      int maxHeap,
      String frameworkCode,
      ArrayList<ServerInfo> logins,
      String[] args,
      int terminationPort)
      throws Exception {

    String ownLocation = new File(".").getAbsolutePath();
    System.out.println("ownLocation=" + ownLocation);

    DistributedLockProvider provider = Globals.instantiateLockProvider(frameworkCode);

    String localClasspath;

    if (System.getProperty("java.class.path").contains("Chainbench.jar"))
      localClasspath = ownLocation + "/Chainbench.jar";
    else {
      final String CP_STUB = ".;./bin;./lib/*;./lib/ojdbc6.jar;./lib/aspectjrt.jar";

      localClasspath = provider.getMiniServerClasspath(CP_STUB);
    }

    int pathEnvVarIndex = -1;

    // Need to copy env vars across or get a Windows networking error
    Map<String, String> variables = System.getenv();
    String[] envp = new String[variables.size()];
    int i = 0;
    for (Map.Entry<String, String> entry : variables.entrySet()) {
      String name = entry.getKey();
      String value = entry.getValue();

      if (name.toLowerCase().equals("path")) {
        pathEnvVarIndex = i;
        System.out.println("PATH AT INDEX" + i);
        System.out.println("PATH=" + value);
      }

      envp[i++] = name + "=" + value;
    }

    Params.setServerIndex(args, serverIndex);

    String flattened = Params.spaceSeparatedList(args);
    System.out.println("Flattened=" + flattened);

    String debugFlags =
        (serverIndex == 0)
            ? " -debug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=1234 "
            : "";

    String cmdStub;
    String miniserverClasspath;
    String extraProps = "";

    if (serverIndex != 0 && logins.size() != 0) {
      int remoteBoxIndex = serverIndex % (logins.size());
      ServerInfo login = logins.get(remoteBoxIndex);
      cmdStub =
          "cmd /K start java -cp "
              + localClasspath
              + " com.hp.software.chainbench.SSH "
              + login.getHost()
              + " "
              + login.getUsername()
              + " "
              + login.getPassword()
              + " "
              + terminationPort
              + " "
              + " java ";

      miniserverClasspath = "./Chainbench.jar";

      // Speeds up JDBC cxns on Linux -
      // see http://stackoverflow.com/questions/5503063/oracle-getconnection-slow
      extraProps = "-Djava.security.egd=file:/dev/./urandom";

      ServerInfo remote = (ServerInfo) login.clone();
      remote.setTerminationPort(terminationPort);
      servers.add(remote);
    } else {
      miniserverClasspath = localClasspath;
      cmdStub = "cmd /K start java ";

      ServerInfo local = new ServerInfo("localhost", null, null, terminationPort);
      servers.add(local);
    }

    String loadTimeWeaver = "";
    if (Params.getSlowdownMode(args).equals(Constants.SLOWDOWN_ASPECT)) {
      loadTimeWeaver = " -javaagent:./lib/aspectjweaver.jar ";
    } else if (Params.getSlowdownMode(args).equals(Constants.SLOWDOWN_REVISER)) {
      loadTimeWeaver =
          " -javaagent:./lib/gluonj.jar=debug:com.hp.software.chainbench.SlowdownReviser ";
    }

    String propsStub =
        // " -XX:+HeapDumpOnOutOfMemoryError  " +
        " -Xms"
            + maxHeap
            + "m"
            + " -Xmx"
            + maxHeap
            + "m"
            + loadTimeWeaver
            + debugFlags
            + extraProps;

    String props = provider.getJavaProps(propsStub, args);

    String cmd =
        cmdStub
            + " "
            + props
            + " "
            + " -cp "
            + miniserverClasspath
            + " com.hp.software.chainbench.MiniServer "
            + flattened;
    System.out.println(cmd);

    /* " -Dgemfire.remove-unresponsive-client=true " +
    " -Dgemfire.enable-network-partition-detection=true " +
    " -Dgemfire.departure-correlation-window=30 " +
    " -Dgemfire.conserve-sockets=false " +
    " -Dgemfire.ack-severe-alert-threshold=5  " + */
    //
    /* " -Dhazelcast.initial.min.cluster.size=" + processes +
    // " -Dhazelcast.restart.on.max.idle=true " +
    // " -Dhazelcast.max.no.heartbeat.seconds=15  " +
    // " -Dhazelcast.in.thread.priority=10 " +
    // " -Dhazelcast.out.thread.priority=10 " +
    // " -Dhazelcast.service.thread.priority=10 " + */
    //
    /* " -Djgroups.bind_addr=" + bindAddress + "  " +
    " -Djgroups.diagnostics_addr=" + bindAddress + "  " +
    " -Dsm.ini.groupname=testGroupName   " + */

    File dir = new File(ownLocation);
    Process p = Runtime.getRuntime().exec(cmd, envp, dir);

    localProcesses.add(p);
  }
  /**
   * Detects the current-user-principal for a given WebDavResource. At first, /.well-known/ is
   * tried. Only if no current-user-principal can be detected for the .well-known location, the
   * given location of the resource is tried.
   *
   * @param serverInfo Location that will be queried
   * @param serviceName Well-known service name ("carddav", "caldav")
   * @return WebDavResource of current-user-principal for the given service, or null if it can't be
   *     found
   *     <p>TODO: If a TXT record is given, always use it instead of trying .well-known first
   */
  WebDavResource getCurrentUserPrincipal(ServerInfo serverInfo, String serviceName)
      throws URISyntaxException, IOException, NotAuthorizedException {
    URI initialURL = getInitialContextURL(serverInfo, serviceName);
    if (initialURL != null) {
      Log.i(
          TAG,
          "Looking up principal URL for service "
              + serviceName
              + "; initial context: "
              + initialURL);

      // determine base URL (host name and initial context path)
      WebDavResource base =
          new WebDavResource(
              httpClient,
              initialURL,
              serverInfo.getUserName(),
              serverInfo.getPassword(),
              serverInfo.isAuthPreemptive());

      // look for well-known service (RFC 5785)
      try {
        WebDavResource wellKnown = new WebDavResource(base, "/.well-known/" + serviceName);
        wellKnown.propfind(Mode.CURRENT_USER_PRINCIPAL);
        if (wellKnown.getProperties().getCurrentUserPrincipal() != null) {
          URI principal = wellKnown.getProperties().getCurrentUserPrincipal();
          Log.i(TAG, "Principal URL found from Well-Known URI: " + principal);
          return new WebDavResource(wellKnown, principal);
        }
      } catch (NotAuthorizedException e) {
        Log.w(TAG, "Not authorized for well-known " + serviceName + " service detection", e);
        throw e;
      } catch (URISyntaxException e) {
        Log.e(
            TAG,
            "Well-known" + serviceName + " service detection failed because of invalid URIs",
            e);
      } catch (HttpException e) {
        Log.d(TAG, "Well-known " + serviceName + " service detection failed with HTTP error", e);
      } catch (DavException e) {
        Log.w(
            TAG,
            "Well-known " + serviceName + " service detection failed with unexpected DAV response",
            e);
      } catch (IOException e) {
        Log.e(TAG, "Well-known " + serviceName + " service detection failed with I/O error", e);
      }

      // fall back to user-given initial context path
      Log.d(TAG, "Well-known service detection failed, trying initial context path " + initialURL);
      try {
        base.propfind(Mode.CURRENT_USER_PRINCIPAL);
        if (base.getProperties().getCurrentUserPrincipal() != null) {
          URI principal = base.getProperties().getCurrentUserPrincipal();
          Log.i(TAG, "Principal URL found from initial context path: " + principal);
          return new WebDavResource(base, principal);
        }
      } catch (NotAuthorizedException e) {
        Log.e(TAG, "Not authorized for querying principal", e);
        throw e;
      } catch (HttpException e) {
        Log.e(TAG, "HTTP error when querying principal", e);
      } catch (DavException e) {
        Log.e(TAG, "DAV error when querying principal", e);
      }

      Log.i(
          TAG,
          "Couldn't find current-user-principal for service "
              + serviceName
              + ", assuming initial context path is principal path");
      return base;
    }
    return null;
  }