Changeset 1212 for XIOS


Ignore:
Timestamp:
07/12/17 12:27:06 (7 years ago)
Author:
oabramkina
Message:

File dibution among secondary servers done in a more flexible way. Tested.

Location:
XIOS/dev/XIOS_DEV_CMIP6/src/node
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp

    r1208 r1212  
    825825     if (hasServer && hasClient) 
    826826     { 
     827       int nbPools = clientPrimServer.size(); 
     828 
    827829       // (1) Find all enabled files in write mode 
    828830       for (int i = 0; i < this->enabledFiles.size(); ++i) 
     
    835837       int size = this->enabledWriteModeFiles.size(); 
    836838       std::vector<std::pair<StdSize, CFile*> > dataSizeMap; 
     839       StdSize dataPerPool = 0; 
    837840       for (size_t i = 0; i < size; ++i) 
    838841       { 
     
    861864         dataSize /= outFreqSec; 
    862865         dataSizeMap.push_back(make_pair(dataSize,file)); 
    863        } 
    864  
    865        // (3) Sort enabledWriteModeFiles 
     866         dataPerPool += dataSize; 
     867       } 
     868       dataPerPool /= nbPools; 
    866869       std::sort(dataSizeMap.begin(), dataSizeMap.end()); 
    867        for (int i = 0; i < size; ++i) 
    868        { 
    869          enabledWriteModeFiles[i] = dataSizeMap[i].second; 
    870        } 
    871  
    872        // (4) Assign contextClient to each enabled file 
    873        int i,j; 
    874        for (i = 0, j=0; i < enabledFiles.size(); ++i) 
    875        { 
    876          if (enabledFiles[i]->mode.isEmpty() || (!enabledFiles[i]->mode.isEmpty() && enabledFiles[i]->mode.getValue() == CFile::mode_attr::write )) 
     870 
     871       // (3) Assign contextClient to each enabled file 
     872       std::vector<StdSize> poolData(nbPools); 
     873       int lazyPool = 0; 
     874       for (int i = dataSizeMap.size()-1; i >= 0; --i) 
     875       { 
     876         bool contextSet = false; 
     877         for (int j = 0; j < nbPools; ++j) 
    877878         { 
    878            int n = j / clientPrimServer.size(); 
    879            int mod = j % clientPrimServer.size(); 
    880            int poolId; 
    881            if (n % 2 == 0) 
    882              poolId =mod; 
    883            else 
    884              poolId = clientPrimServer.size()-1-mod; 
    885             enabledWriteModeFiles[j]->setContextClient(clientPrimServer[poolId]); 
    886            ++j; 
     879           if (!contextSet) 
     880           { 
     881             if (dataSizeMap[i].first + poolData[j] < dataPerPool) 
     882             { 
     883               dataSizeMap[i].second->setContextClient(clientPrimServer[j]); 
     884               poolData[j] += dataSizeMap[i].first; 
     885               contextSet = true; 
     886             } 
     887           } 
     888           if (poolData[j] < poolData[lazyPool]) 
     889             lazyPool = j; 
    887890         } 
    888          else 
     891         if (!contextSet) 
    889892         { 
    890            enabledFiles[i]->setContextClient(client); 
     893           dataSizeMap[i].second->setContextClient(clientPrimServer[lazyPool]); 
     894           poolData[lazyPool] += dataSizeMap[i].first; 
    891895         } 
    892896       } 
     897 
     898       for (int i = 0; i < this->enabledReadModeFiles.size(); ++i) 
     899         enabledReadModeFiles[i]->setContextClient(client); 
    893900     } 
    894901     else 
  • XIOS/dev/XIOS_DEV_CMIP6/src/node/context.hpp

    r1208 r1212  
    136136         void setClientServerBuffer(CContextClient* contextClient); 
    137137 
    138          // Estimate data size for each enabled file in write mode 
     138         // Distribute files (in write mode) among secondary-server pools according to the estimated data flux 
    139139         void distributeFiles(void); 
    140140 
Note: See TracChangeset for help on using the changeset viewer.