void MasterHandler::leadershipLoop() { long maxSleep = 1000l*UPDATE_INTERVAL; long interval = UPDATE_INTERVAL; /** * Algorithm: * 1)Fetch list of files from backend * 2)Check if there is any new change * 3)Fetch list of avail nodes, their free space * 4)Divide tasks among nodes * 5)Clean all previous assignments * 6)Publish assignments */ while(isRunning) { //1)Fetch list of files from backend Backend* backend = BackendManager::getActiveBackend(); if(backend == nullptr) { LOG(DEBUG)<<"leadershipLoop(): No active backend."; interval *= 10; if(interval > maxSleep) interval = maxSleep; usleep(interval); continue; } vector<BackendItem> backendList; if(!backend->list(backendList)) { LOG(ERROR)<<"leadershipLoop(): failed to retrive list of files from backend!"; interval *= 10; if(interval > maxSleep) interval = maxSleep; usleep(interval); continue; } //3)Fetch list of avail nodes, their free space vector<ZooNode> globalView; ZooHandler::getInstance().getGlobalView(globalView); vector<ZooNode> globalFreeView = ZooHandler::getInstance().getGlobalFreeView(); //Fill GlobaView with globalfreeview for(ZooNode& node:globalView) { bool found = false; for(ZooNode& fnode:globalFreeView){ if(fnode.hostName == node.hostName){ found = true; node.freeSpace = fnode.freeSpace; break; } } if(!found){ LOG(ERROR)<<"\nCann't find free space for node:"<<node.hostName<<"\n"; continue; } } //Check if there is any change in nodes(only checks freespace name and mac) bool nodesChanged = false; if(globalView.size()!=existingNodes.size()) { //Get rid of already assigned ones because some of them might be dead cleanAssignmentFolder(); nodesChanged = true; } else { for(ZooNode &node:globalView) if(!contains<ZooNode>(existingNodes,node)) { nodesChanged = true; break; } } //2)Check if there is any new change or any change in nodes! vector<BackendItem> oldAssignments = getExistingAssignments(); //cerr<<"oldAssignments:";printVector(oldAssignments); if(oldAssignments.size() > 0) removeDuplicates(backendList,oldAssignments); if(nodesChanged) { //Get a copy in existing nodes existingNodes.clear(); existingNodes.insert(existingNodes.end(),globalView.begin(),globalView.end()); } //4)Divide tasks among nodes //5)Clean all previous assignments //6)Publish assignments bool change = false; if(backendList.size() || nodesChanged) change = divideTaskAmongNodes(&backendList,globalView); //Release Memory backendList.clear(); //delete backendList; //Release memory for GlobalView for(ZooNode &node:globalView) if(node.containedFiles) delete node.containedFiles; //Adaptive sleep if(!change) interval *= 10; if(interval > maxSleep) interval = maxSleep; usleep(interval); } LOG(ERROR)<<"MASTERHANDLER LOOP DEAD!"; isRunning.store(false); }