/**
   * launch a worker in distributed mode
   *
   * @param conf
   * @param sharedcontext
   * @param topologyId
   * @param supervisorId
   * @param port
   * @param workerId
   * @throws IOException
   * @pdOid 6ea369dd-5ce2-4212-864b-1f8b2ed94abb
   */
  public void launchWorker(
      Map conf,
      IContext sharedcontext,
      String topologyId,
      String supervisorId,
      Integer port,
      String workerId,
      LocalAssignment assignment)
      throws IOException {

    // STORM-LOCAL-DIR/supervisor/stormdist/topologyId
    String stormroot = StormConfig.supervisor_stormdist_root(conf, topologyId);

    // STORM-LOCAL-DIR/supervisor/stormdist/topologyId/stormjar.jar
    String stormjar = StormConfig.stormjar_path(stormroot);

    // get supervisor conf
    Map stormConf = StormConfig.read_supervisor_topology_conf(conf, topologyId);

    Map totalConf = new HashMap();
    totalConf.putAll(conf);
    totalConf.putAll(stormConf);

    // get classpath
    // String[] param = new String[1];
    // param[0] = stormjar;
    // String classpath = JStormUtils.add_to_classpath(
    // JStormUtils.current_classpath(), param);

    // get child process parameter

    String stormhome = System.getProperty("jstorm.home");

    long memSize = assignment.getMem();
    int cpuNum = assignment.getCpu();
    String childopts = getChildOpts(totalConf);

    childopts += getGcDumpParam(totalConf);

    childopts = childopts.replace("%ID%", port.toString());
    childopts = childopts.replace("%TOPOLOGYID%", topologyId);
    if (stormhome != null) {
      childopts = childopts.replace("%JSTORM_HOME%", stormhome);
    } else {
      childopts = childopts.replace("%JSTORM_HOME%", "./");
    }
    Map<String, String> environment = new HashMap<String, String>();

    if (ConfigExtension.getWorkerRedirectOutput(totalConf)) {
      environment.put("REDIRECT", "true");
    } else {
      environment.put("REDIRECT", "false");
    }

    String logFileName = JStormUtils.genLogName(assignment.getTopologyName(), port);
    // String logFileName = topologyId + "-worker-" + port + ".log";

    environment.put("LD_LIBRARY_PATH", (String) totalConf.get(Config.JAVA_LIBRARY_PATH));

    StringBuilder commandSB = new StringBuilder();

    try {
      if (this.cgroupManager != null) {
        commandSB.append(cgroupManager.startNewWorker(cpuNum, workerId));
      }
    } catch (Exception e) {
      LOG.error("fail to prepare cgroup to workerId: " + workerId, e);
      return;
    }

    // commandSB.append("java -server -Xdebug
    // -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n ");
    commandSB.append("java -server ");
    commandSB.append(" -Xms" + memSize);
    commandSB.append(" -Xmx" + memSize + " ");
    commandSB.append(" -Xmn" + memSize / 3 + " ");
    commandSB.append(" -XX:PermSize=" + memSize / 16);
    commandSB.append(" -XX:MaxPermSize=" + memSize / 8);
    commandSB.append(" " + childopts);
    commandSB.append(" " + (assignment.getJvm() == null ? "" : assignment.getJvm()));

    commandSB.append(" -Djava.library.path=");
    commandSB.append((String) totalConf.get(Config.JAVA_LIBRARY_PATH));

    commandSB.append(" -Dlogfile.name=");
    commandSB.append(logFileName);

    // commandSB.append(" -Dlog4j.ignoreTCL=true");

    if (stormhome != null) {
      // commandSB.append(" -Dlogback.configurationFile=" + stormhome +
      // "/conf/cluster.xml");
      commandSB.append(
          " -Dlog4j.configuration=File:" + stormhome + "/conf/jstorm.log4j.properties");
      commandSB.append(" -Djstorm.home=");
      commandSB.append(stormhome);
    } else {
      // commandSB.append(" -Dlogback.configurationFile=cluster.xml");
      commandSB.append(" -Dlog4j.configuration=File:jstorm.log4j.properties");
    }

    String classpath = getClassPath(stormjar, stormhome, totalConf);
    String workerClassPath = (String) totalConf.get(Config.WORKER_CLASSPATH);
    List<String> otherLibs = (List<String>) stormConf.get(GenericOptionsParser.TOPOLOGY_LIB_NAME);
    StringBuilder sb = new StringBuilder();
    if (otherLibs != null) {
      for (String libName : otherLibs) {
        sb.append(StormConfig.stormlib_path(stormroot, libName)).append(":");
      }
    }
    workerClassPath = workerClassPath + ":" + sb.toString();

    Map<String, String> policyReplaceMap = new HashMap<String, String>();
    String realClassPath = classpath + ":" + workerClassPath;
    policyReplaceMap.put(SandBoxMaker.CLASS_PATH_KEY, realClassPath);
    commandSB.append(sandBoxMaker.sandboxPolicy(workerId, policyReplaceMap));

    // commandSB.append(" -Dlog4j.configuration=storm.log.properties");

    commandSB.append(" -cp ");
    // commandSB.append(workerClassPath + ":");
    commandSB.append(classpath);
    if (!ConfigExtension.isEnableTopologyClassLoader(totalConf))
      commandSB.append(":").append(workerClassPath);

    commandSB.append(" org.act.tstream.daemon.worker.Worker ");
    commandSB.append(topologyId);

    commandSB.append(" ");
    commandSB.append(supervisorId);

    commandSB.append(" ");
    commandSB.append(port);

    commandSB.append(" ");
    commandSB.append(workerId);

    commandSB.append(" ");
    commandSB.append(workerClassPath + ":" + stormjar);

    LOG.info("Launching worker with command: " + commandSB);
    LOG.info("Environment:" + environment.toString());

    JStormUtils.launch_process(commandSB.toString(), environment, true);
  }