Esempio n. 1
0
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);
}