package com.alipay.bluewhale.core.daemon.supervisor; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import org.apache.log4j.Logger; import com.alipay.bluewhale.core.callback.RunnableCallback; import com.alipay.bluewhale.core.cluster.StormConfig; import com.alipay.bluewhale.core.utils.PathUtils; import com.alipay.bluewhale.core.utils.ProcessSimulator; import com.alipay.bluewhale.core.utils.StormUtils; public class ShutdownWork extends RunnableCallback{ private static Logger LOG = Logger.getLogger(ShutdownWork.class); /** * shutdown the spec worker of the supervisor. and clean the local dir of * workers * * * @param conf * @param supervisorId * @param workerId * @param workerThreadPidsAtom * @param workerThreadPidsAtomReadLock */ public void shutWorker(Map conf, String supervisorId, String workerId, ConcurrentHashMap<String, String> workerThreadPids) throws IOException { LOG.info("Begin to shut down " + supervisorId + ":" + workerId); // STORM-LOCAL-DIR/workers/workerId/pids String workerPidPath = StormConfig.worker_pids_root(conf, workerId); List<String> pids = PathUtils.read_dir_contents(workerPidPath); String threadPid = workerThreadPids.get(workerId); if (threadPid != null) { ProcessSimulator.killProcess(threadPid); } for (String pid : pids) { StormUtils.ensure_process_killed(Integer.parseInt(pid)); PathUtils.rmpath(StormConfig.worker_pid_path(conf, workerId, pid)); } tryCleanupWorker(conf, workerId); LOG.info("Successfully shut down " + supervisorId + ":" + workerId); } /** * clean the directory , subdirectories of STORM-LOCAL-DIR/workers/workerId * * * @param conf * @param workerId * @throws IOException */ public void tryCleanupWorker(Map conf, String workerId) throws IOException { try { // delete heartbeat dir LOCAL_DIR/workers/workid/heartbeats PathUtils.rmr(StormConfig.worker_heartbeats_root(conf, workerId)); // delete pid dir, LOCAL_DIR/workers/workerid/pids PathUtils.rmpath(StormConfig.worker_pids_root(conf, workerId)); // delete workerid dir, LOCAL_DIR/worker/workerid PathUtils.rmpath(StormConfig.worker_root(conf, workerId)); } catch (RuntimeException e) { LOG.warn(e + "Failed to cleanup worker " + workerId + ". Will retry later"); } } }