virtual ~Log() { _isStopping = true; _threadPool.interrupt_all(); _threadPool.join_all(); _stringLoggerThread.interrupt(); _stringLoggerThread.join(); }
~Server() { acceptor.cancel(); data_worker.interrupt(); data_worker.join(); work = boost::none; io_worker.join(); }
virtual void shutdown(ExecutorDriver* driver) { driver->sendFrameworkMessage("Executor " + host_name+ "SHUTTING DOWN"); if (thread) { thread->interrupt(); thread->join(); delete thread; thread = 0; } driver->stop(); }
virtual void killTask(ExecutorDriver* driver, const TaskID& taskId) { if (thread) { thread->interrupt(); thread->join(); delete thread; thread = 0; } driver->sendFrameworkMessage("Executor " + host_name+ " KILLING TASK"); driver->stop(); }
int Worker::Abort() { // lock nothing coz care nothing ... if(m_state <= 0) return m_state; m_state = -1; if(m_thread) m_thread->interrupt(); // force to get out //usleep(50 * 1000); return m_state; }
int WorkManagerImpl::Abort() { if(m_state <= 0) return m_state; m_state = -1; if(m_dispatcherthread) m_dispatcherthread->interrupt(); //usleep(50 * 1000); int count = m_workers.size(); for(int i=0; i<count; i++) { Worker* worker = m_workers[i]; if(worker) worker->Abort(); } m_state = -1; return m_state; }
inline threadTest::~threadTest() { _glInit = false; _glThread.interrupt(); std::cout << "Interrupting main thread" << std::endl; fflush(stdout); _glThread.join(); std::cout << "Joinning main thread" << std::endl; fflush(stdout); printTest(); std::cout << "Main thread destroyed" << std::endl; fflush(stdout); };
void nuke_ms::clientnode::catchThread(boost::thread& thread, unsigned threadwait_ms) { // a thread id that compares equal to "not-a-thread" boost::thread::id not_a_thread; try { // give the thread a few seconds time to join thread.timed_join(boost::posix_time::millisec(threadwait_ms)); } catch(...) {} // if the thread finished, return. otherwise try to kill the thread if (thread.get_id() == not_a_thread) return; thread.interrupt(); // if it is still running, let it go if (thread.get_id() == not_a_thread) return; thread.detach(); }
~timer_queue_t() { watchdog.interrupt(); watchdog.join(); }
virtual void launchTask(ExecutorDriver* driver, const TaskInfo& task) { localPeerCount++; TaskStatus status; status.mutable_task_id()->MergeFrom(task.task_id()); status.set_state(TASK_RUNNING); driver->sendStatusUpdate(status); //------------- START TASK OPERATIONS ---------- cout << "Running K3 Program: " << task.name() << endl; string k3_cmd; using namespace YAML; Node hostParams = Load(task.data()); Node peerParams; Node peers; // vector<Node> peers; cout << "WHAT I RECEIVED\n----------------------\n"; cout << Dump(hostParams); cout << "\n---------------------------------\n"; k3_cmd = "cd $MESOS_SANDBOX && bash -c 'ulimit -c unlimited && ./" + hostParams["binary"].as<string>(); if (hostParams["logging"]) { k3_cmd += " -l INFO "; } if (hostParams["resultVar"]) { k3_cmd += " --result_path $MESOS_SANDBOX --result_var " + hostParams["resultVar"].as<string>(); } string datavar, datapath; string datapolicy = "default"; int peerStart = 0; int peerEnd = 0; for (const_iterator param=hostParams.begin(); param!=hostParams.end(); param++) { string key = param->first.as<string>(); // cout << " PROCESSING: " << key << endl; if (key == "logging" || key == "binary" || key == "server" || key == "server_group") { continue; } if (key == "roles") { continue; } else if (key == "peers") { peerParams["peers"] = hostParams["peers"]; } else if (key == "me") { Node meList = param->second; YAML::Emitter emit; emit << YAML::Flow << meList; for (std::size_t i=0; i<meList.size(); i++) { peers.push_back(meList[i]); } } else if (key == "data") { // TODO: Datafiles per group. This is a hack // that only includes the data files from the first peer group // and assigns them to any peer Node dataFilesNode = param->second[0]; for(YAML::const_iterator it=dataFilesNode.begin();it!=dataFilesNode.end();++it) { DataFile f; auto d = *it; f.path = d["path"].as<string>(); f.varName = d["var"].as<string>(); f.policy = d["policy"].as<string>(); dataFiles.push_back(f); } } //else if (key == "datavar") { // datavar = param->second.as<string>(); //} //else if (key == "datapath") { // datapath = "{path: " + param->second.as<string>() + "}"; //} //else if (key == "datapolicy") { // datapolicy = param->second.as<string>(); //} else if (key == "totalPeers") { totalPeerCount = param->second.as<int>(); } else if (key == "peerStart") { peerStart = param->second.as<int>(); } else if (key == "peerEnd") { peerEnd = param->second.as<int>(); } else if (key == "globals") { // handled per peer } else { // string value = i->second.as<string>(); //peerParams[key] = param->second; } } // DATA ALLOCATION * // TODO: Convert to multiple input dirs map<string, vector<string> > peerFiles[peers.size()]; for (auto dataFile : dataFiles) { cout << "Top of loop" << endl; vector<string> filePaths; // 1. GET DIR LIST IN datavar DIR *datadir = NULL; datadir = opendir(dataFile.path.c_str()); if (!datadir) { cout << "Failed to open data dir: " << dataFile.path << endl; TaskStatus status; status.mutable_task_id()->MergeFrom(task.task_id()); status.set_state(TASK_FAILED); driver->sendStatusUpdate(status); return; } else { cout << "Opened data dir: " << dataFile.path << endl; } struct dirent *srcfile = NULL; while (true) { srcfile = readdir(datadir); if (srcfile == NULL) { break; } cout << "FILE " << srcfile->d_name << ": "; if (srcfile->d_type == DT_REG) { string filename = srcfile->d_name; filePaths.push_back(dataFile.path + "/" + filename); cout << "Added -> " << filename; } cout << endl; } closedir(datadir); cout << "read directory" << endl; int numfiles = filePaths.size(); sort (filePaths.begin(), filePaths.end()); int p_start = 0; int p_end = numfiles; int p_total = peers.size(); int myfiles = 0; if (dataFile.policy == "global") { for (int i = 0; i < numfiles; i++) { int peer = i % totalPeerCount; if (peer >= peerStart && peer <= peerEnd) { myfiles++; peerFiles[peer-peerStart][dataFile.varName].push_back(filePaths[i]); } } } else if (dataFile.policy == "replicate") { for (int p = 0; p < peers.size(); p++) { for (int i =0; i < numfiles; i++) { myfiles++; peerFiles[p][dataFile.varName].push_back(filePaths[i]); } } } //if (dataFile.policy == "global") { // p_start = (numfiles / totalPeerCount) * peerStart; // p_end = (numfiles / totalPeerCount) * (peerEnd+1); // p_total = totalPeerCount; // cout << ("Global files s=" + stringify(p_start) + " e=" + stringify(p_end) + " t=" + stringify(p_total)) << endl; // for (int filenum = p_start; filenum < p_end; filenum++) { // int peer = floor((((p_total)*1.0*filenum) / numfiles)) - peerStart; // cout << " Peer # " << peer << " : [" << filenum << "] " << filePaths[filenum] << endl; // peerFiles[peer][dataFile.varName].push_back(filePaths[filenum]); // myfiles++; // } //} else if (dataFile.policy == "pinned") { for(int filenum = 0; filenum < numfiles; filenum++) { peerFiles[0][dataFile.varName].push_back(filePaths[filenum]); } } else if (dataFile.policy == "sharded") { for (int i =0; i < numfiles; i++) { myfiles++; int p = i % peers.size(); peerFiles[p][dataFile.varName].push_back(filePaths[i]); } } cout << "my files: " << myfiles << endl; } cout << "BUILDING PARAMS FOR PEERS" << endl; int pph = 0; if (peerParams["peers"].size() >= 1) { YAML::Node peer_masters; YAML::Node masters; YAML::Node curMaster = YAML::Load(YAML::Dump(peerParams["peers"][0])); masters.push_back(YAML::Load(YAML::Dump(curMaster))); std::cout << peerParams["peers"].size() << " peers to map" << endl; for (std::size_t i=0; i< peerParams["peers"].size(); i++) { YAML::Node kv; if (peerParams["peers"][i]["addr"][0].as<string>() != curMaster["addr"][0].as<string>()) { cout << "Host: " << curMaster["addr"][0].as<string>() << ". Peers: " << pph << endl; pph = 0; masters.push_back(YAML::Load(YAML::Dump(peerParams["peers"][i]))); curMaster = YAML::Load(YAML::Dump(peerParams["peers"][i])); } pph++; std::cout << "added one" << endl; kv["key"] = YAML::Load(YAML::Dump(peerParams["peers"][i]["addr"])); kv["value"] = YAML::Load(YAML::Dump(curMaster["addr"])); peer_masters.push_back(kv); } cout << "Host: " << curMaster["addr"][0].as<string>() << ". Peers: " << pph << endl; peerParams["peer_masters"] = YAML::Load(YAML::Dump(peer_masters)); peerParams["masters"] = YAML::Load(YAML::Dump(masters)); std::cout << "Masters: " << YAML::Dump(masters) << endl; } std::ostringstream oss; oss << "PEERS!!! (" << std::endl; for (std::size_t i=0; i<peers.size(); i++) { oss << "---" << std::endl; YAML::Node thispeer = peerParams; YAML::Node globals = hostParams["globals"][i]; for (const_iterator p=globals.begin(); p!=globals.end(); p++) { thispeer[p->first.as<string>()] = p->second; } YAML::Node me = peers[i]; thispeer["me"] = me; YAML::Node local_peers; std::cout << "start: " << peerStart << ". end: " << peerEnd << std::endl; for (int j=peerStart; j<= peerEnd; j++) { local_peers.push_back(YAML::Load(YAML::Dump(peerParams["peers"][j]))); } thispeer["local_peers"] = YAML::Load(YAML::Dump(local_peers)); for (auto it : peerFiles[i]) { auto datavar = it.first; if (thispeer[datavar]) { thispeer.remove(datavar); } for (auto &f : it.second) { Node src; src["path"] = f; thispeer[datavar].push_back(src); } } // ADD DATA SOURCE DIR HERE YAML::Emitter emit; emit << YAML::Flow << thispeer; string param = emit.c_str(); std::ofstream peerFile; string peerFileName = "/mnt/mesos/sandbox/peers" + std::to_string(i) + ".yaml"; peerFile.open(peerFileName, std::ofstream::out); peerFile << param; peerFile.close(); oss << param << std::endl; std::cout << param << std::endl; k3_cmd += " -p " + peerFileName; for (auto it : peerFiles[i]) { auto datavar = it.first; if (thispeer[datavar]) { thispeer.remove(datavar); } } } oss << ") END PEERS!!!" << std::endl; cout << oss.str() << std::endl; k3_cmd += "'"; cout << "FINAL COMMAND: " << k3_cmd << endl; if (thread) { driver->sendFrameworkMessage("Debug: thread already existed!"); thread->interrupt(); thread->join(); delete thread; thread = 0; } bool isMaster = false; cout << "Checking master" << endl; if (Dump(hostParams["me"][0]) == Dump(hostParams["master"])) { isMaster = true; cout << "I am master" << endl; } else { cout << "me: " << Dump(hostParams["me"][0]) << endl; cout << "master: " << Dump(hostParams["master"]) << endl; } cout << "Launching K3: " << endl; thread = new boost::thread(TaskThread(task, k3_cmd, driver, isMaster)); }