Changeset 2406


Ignore:
Timestamp:
09/20/22 16:37:37 (21 months ago)
Author:
ymipsl
Message:

Refactor management of client context and server context.
YM

Location:
XIOS3/trunk/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • XIOS3/trunk/src/interface/c/iccalendar.cpp

    r1761 r2406  
    1515    CTimer::get("XIOS update calendar").resume(); 
    1616    xios::CContext* context = CContext::getCurrent(); 
    17     if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     17//    if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    1818      context->eventLoop(); 
    1919//ym      context->checkBuffersAndListen(); 
  • XIOS3/trunk/src/interface/c/icdata.cpp

    r2266 r2406  
    422422      CTimer::get("XIOS send field").resume(); 
    423423      CContext* context = CContext::getCurrent(); 
    424       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     424//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    425425        context->eventLoop(); 
    426426      CArray<double, 1> data(data_k8, shape(data_Xsize), neverDeleteData); 
     
    450450 
    451451      CContext* context = CContext::getCurrent(); 
    452       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     452//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    453453        context->eventLoop(); 
    454454 
     
    480480 
    481481      CContext* context = CContext::getCurrent(); 
    482       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     482//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    483483        context->eventLoop(); 
    484484 
     
    512512 
    513513      CContext* context = CContext::getCurrent(); 
    514       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     514//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    515515        context->eventLoop(); 
    516516 
     
    546546 
    547547      CContext* context = CContext::getCurrent(); 
    548       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     548//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    549549        context->eventLoop(); 
    550550 
     
    582582 
    583583      CContext* context = CContext::getCurrent(); 
    584       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     584//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    585585        context->eventLoop(); 
    586586 
     
    617617 
    618618      CContext* context = CContext::getCurrent(); 
    619       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     619//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    620620        context->eventLoop(); 
    621621 
     
    653653 
    654654      CContext* context = CContext::getCurrent(); 
    655       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     655//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    656656        context->eventLoop(); 
    657657 
     
    686686      CTimer::get("XIOS send field").resume(); 
    687687      CContext* context = CContext::getCurrent(); 
    688       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     688//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    689689        context->eventLoop(); 
    690690 
     
    716716 
    717717      CContext* context = CContext::getCurrent(); 
    718       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     718//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    719719        context->eventLoop(); 
    720720 
     
    746746 
    747747      CContext* context = CContext::getCurrent(); 
    748       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     748//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    749749        context->eventLoop(); 
    750750 
     
    778778 
    779779      CContext* context = CContext::getCurrent(); 
    780       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     780//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    781781        context->eventLoop(); 
    782782 
     
    811811 
    812812      CContext* context = CContext::getCurrent(); 
    813       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     813//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    814814        context->eventLoop(); 
    815815 
     
    847847 
    848848      CContext* context = CContext::getCurrent(); 
    849       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     849//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    850850        context->eventLoop(); 
    851851 
     
    882882 
    883883      CContext* context = CContext::getCurrent(); 
    884       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     884//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    885885        context->eventLoop(); 
    886886 
     
    917917 
    918918      CContext* context = CContext::getCurrent(); 
    919       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     919//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    920920        context->eventLoop(); 
    921921 
     
    952952 
    953953      CContext* context = CContext::getCurrent(); 
    954       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     954//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    955955        context->eventLoop(); 
    956956 
     
    980980 
    981981      CContext* context = CContext::getCurrent(); 
    982       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     982//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    983983        context->eventLoop(); 
    984984 
     
    10071007 
    10081008      CContext* context = CContext::getCurrent(); 
    1009       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1009//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    10101010        context->eventLoop(); 
    10111011 
     
    10351035 
    10361036      CContext* context = CContext::getCurrent(); 
    1037       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1037//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    10381038        context->eventLoop(); 
    10391039 
     
    10651065 
    10661066      CContext* context = CContext::getCurrent(); 
    1067       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1067//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    10681068        context->eventLoop(); 
    10691069 
     
    10961096 
    10971097      CContext* context = CContext::getCurrent(); 
    1098       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1098//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    10991099        context->eventLoop(); 
    11001100 
     
    11271127 
    11281128      CContext* context = CContext::getCurrent(); 
    1129       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1129//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    11301130        context->eventLoop(); 
    11311131 
     
    11591159 
    11601160      CContext* context = CContext::getCurrent(); 
    1161       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1161//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    11621162        context->eventLoop(); 
    11631163 
     
    11941194 
    11951195      CContext* context = CContext::getCurrent(); 
    1196       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1196//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    11971197        context->eventLoop(); 
    11981198 
     
    12251225 
    12261226      CContext* context = CContext::getCurrent(); 
    1227       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1227//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    12281228        context->eventLoop(); 
    12291229 
     
    12571257 
    12581258      CContext* context = CContext::getCurrent(); 
    1259       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1259//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    12601260        context->eventLoop(); 
    12611261 
     
    12881288 
    12891289      CContext* context = CContext::getCurrent(); 
    1290       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1290//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    12911291        context->eventLoop(); 
    12921292 
     
    13201320 
    13211321      CContext* context = CContext::getCurrent(); 
    1322       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1322//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    13231323        context->eventLoop(); 
    13241324 
     
    13551355 
    13561356      CContext* context = CContext::getCurrent(); 
    1357       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1357//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    13581358        context->eventLoop(); 
    13591359 
     
    13891389 
    13901390      CContext* context = CContext::getCurrent(); 
    1391       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1391//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    13921392        context->eventLoop(); 
    13931393 
     
    14251425 
    14261426      CContext* context = CContext::getCurrent(); 
    1427       if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
     1427//      if (!context->hasServer && !context->client->isAttachedModeEnabled()) 
    14281428        context->eventLoop(); 
    14291429 
  • XIOS3/trunk/src/node/context.cpp

    r2405 r2406  
    4646      , calendar(), hasClient(false), hasServer(false) 
    4747      , isPostProcessed(false), finalized(false) 
    48       , client(nullptr), server(nullptr) 
    4948      , allProcessed(false), countChildContextFinalized_(0), isProcessingEvent_(false) 
    5049 
     
    5554      , calendar(), hasClient(false), hasServer(false) 
    5655      , isPostProcessed(false), finalized(false) 
    57       , client(nullptr), server(nullptr) 
    5856      , allProcessed(false), countChildContextFinalized_(0), isProcessingEvent_(false) 
    5957   { /* Ne rien faire de plus */ } 
     
    6159   CContext::~CContext(void) 
    6260   { 
    63      delete client; 
    64      delete server; 
    65      for (std::vector<CContextClient*>::iterator it = clientPrimServer.begin(); it != clientPrimServer.end(); it++)  delete *it; 
    66      for (std::vector<CContextServer*>::iterator it = serverPrimServer.begin(); it != serverPrimServer.end(); it++)  delete *it; 
     61     for(auto& client : writerClientOut_) delete client ; 
     62     for(auto& server : writerServerOut_) delete server ; 
     63 
     64     for(auto& client : writerClientIn_) delete client ; 
     65     for(auto& server : writerServerIn_) delete server ; 
     66 
     67     for(auto& client : readerClientOut_) delete client ; 
     68     for(auto& server : readerServerOut_) delete server ; 
     69 
     70     for(auto& client : readerClientIn_) delete client ; 
     71     for(auto& server : readerServerIn_) delete server ; 
     72 
     73 
    6774     if (registryIn!=nullptr) delete registryIn ; 
    6875     if (registryOut!=nullptr) delete registryOut ; 
     
    534541    comms.push_back(intraCommClient); 
    535542    // attached_mode=parentServerContext_->isAttachedMode() ; //ym probably inherited from source context 
     543 
     544    CContextServer* server ; 
     545    CContextClient* client ; 
     546     
    536547    server = CContextServer::getNew(this,intraComm_, interCommServer); // check if we need to dupl. intraComm_ ? 
    537548    client = CContextClient::getNew(this,intraCommClient,interCommClient); 
    538549    client->setAssociatedServer(server) ;   
    539     server->setAssociatedClient(client) ;   
    540  
     550    server->setAssociatedClient(client) ; 
     551 
     552    writerServerIn_.push_back(server) ;  
     553    writerClientIn_.push_back(client) ;  
    541554  } 
    542555  CATCH_DUMP_ATTR 
     
    594607      else createServerInterComm(CXios::defaultPoolId, CXios::defaultServerId, clientServers) ; 
    595608       
    596       client = clientServers[0].second.first ; 
    597       server = clientServers[0].second.second ; 
     609      writerClientOut_.push_back(clientServers[0].second.first) ;  
     610      writerServerOut_.push_back(clientServers[0].second.second) ; 
    598611    } 
    599612    else if (serviceType_ == CServicesManager::GATHERER) 
     
    604617        primServerId_.push_back(clientServer.first) ; 
    605618        clientPrimServer.push_back(clientServer.second.first); 
    606         serverPrimServer.push_back(clientServer.second.second);  
    607       } 
    608     } 
    609  
    610   } 
    611   CATCH_DUMP_ATTR 
    612  
    613   void CContext::createServerInterComm_old(void)  
    614   TRY 
    615   { 
    616     
    617     MPI_Comm interCommClient, interCommServer ; 
    618  
    619     if (serviceType_ == CServicesManager::CLIENT) 
    620     { 
    621  
    622       int commRank ; 
    623       MPI_Comm_rank(intraComm_,&commRank) ; 
    624       if (commRank==0) 
    625       { 
    626         if (attached_mode) CXios::getContextsManager()->createServerContext(CClient::getPoolRessource()->getId(), getContextId()+"_"+CXios::defaultServerId, 0, getContextId()) ; 
    627         else if (CXios::usingServer2) CXios::getContextsManager()->createServerContext(CXios::defaultPoolId, CXios::defaultGathererId, 0, getContextId()) ; 
    628         else  CXios::getContextsManager()->createServerContext(CXios::defaultPoolId, CXios::defaultServerId, 0, getContextId()) ; 
    629       } 
    630  
    631       MPI_Comm interComm ; 
    632        
    633       if (attached_mode) 
    634       { 
    635         parentServerContext_->createIntercomm(CClient::getPoolRessource()->getId(), getContextId()+"_"+CXios::defaultServerId, 0, getContextId(), intraComm_,  
    636                                               interCommClient, interCommServer) ; 
    637         int type ;  
    638         if (commRank==0) CXios::getServicesManager()->getServiceType(CClient::getPoolRessource()->getId(), CXios::defaultServerId, 0, type) ; 
    639         MPI_Bcast(&type,1,MPI_INT,0,intraComm_) ; 
    640         setCurrent(getId()) ; // getCurrent/setCurrent may be supress, it can cause a lot of trouble 
    641       } 
    642       else if (CXios::usingServer2) 
    643       {  
    644 //      CXios::getContextsManager()->createServerContextIntercomm(CXios::defaultPoolId, CXios::defaultGathererId, 0, getContextId(), intraComm_, interComm) ; 
    645         parentServerContext_->createIntercomm(CXios::defaultPoolId, CXios::defaultGathererId, 0, getContextId(), intraComm_, 
    646                                               interCommClient, interCommServer) ; 
    647         int type ;  
    648         if (commRank==0) CXios::getServicesManager()->getServiceType(CXios::defaultPoolId, CXios::defaultGathererId, 0, type) ; 
    649         MPI_Bcast(&type,1,MPI_INT,0,intraComm_) ; 
    650       } 
    651       else 
    652       { 
    653          
    654         //CXios::getContextsManager()->createServerContextIntercomm(CXios::defaultPoolId, CXios::defaultServerId, 0, getContextId(), intraComm_, interComm) ; 
    655         parentServerContext_->createIntercomm(CXios::defaultPoolId, CXios::defaultServerId, 0, getContextId(), intraComm_, 
    656                                               interCommClient, interCommServer) ; 
    657         int type ;  
    658         if (commRank==0) CXios::getServicesManager()->getServiceType(CXios::defaultPoolId, CXios::defaultServerId, 0, type) ; 
    659         MPI_Bcast(&type,1,MPI_INT,0,intraComm_) ; 
    660       } 
    661  
    662         // intraComm client is not duplicated. In all the code we use client->intraComm for MPI 
    663         // in future better to replace it by intracommuncator associated to the context 
    664      
    665       MPI_Comm intraCommClient, intraCommServer ; 
    666       intraCommClient=intraComm_ ; 
    667       MPI_Comm_dup(intraComm_, &intraCommServer) ; 
    668       client = CContextClient::getNew(this, intraCommClient, interCommClient); 
    669       server = CContextServer::getNew(this, intraCommServer, interCommServer); 
    670       client->setAssociatedServer(server) ; 
    671       server->setAssociatedClient(client) ; 
    672     } 
    673      
    674     if (serviceType_ == CServicesManager::GATHERER) 
    675     { 
    676       int commRank ; 
    677       MPI_Comm_rank(intraComm_,&commRank) ; 
    678        
    679       int nbPartitions ; 
    680       if (commRank==0)  
    681       {  
    682         CXios::getServicesManager()->getServiceNbPartitions(CXios::defaultPoolId, CXios::defaultServerId, 0, nbPartitions) ; 
    683         for(int i=0 ; i<nbPartitions; i++) 
    684           CXios::getContextsManager()->createServerContext(CXios::defaultPoolId, CXios::defaultServerId, i, getContextId()) ; 
    685       }       
    686       MPI_Bcast(&nbPartitions, 1, MPI_INT, 0, intraComm_) ; 
    687        
    688       MPI_Comm interComm ; 
    689       for(int i=0 ; i<nbPartitions; i++) 
    690       { 
    691         parentServerContext_->createIntercomm(CXios::defaultPoolId, CXios::defaultServerId, i, getContextId(), intraComm_, interCommClient, interCommServer) ; 
    692         int type ;  
    693         if (commRank==0) CXios::getServicesManager()->getServiceType(CXios::defaultPoolId, CXios::defaultServerId, 0, type) ; 
    694         MPI_Bcast(&type,1,MPI_INT,0,intraComm_) ; 
    695         primServerId_.push_back(CXios::getContextsManager()->getServerContextName(CXios::defaultPoolId, CXios::defaultServerId, i, type, getContextId())) ; 
    696  
    697         // intraComm client is not duplicated. In all the code we use client->intraComm for MPI 
    698         // in future better to replace it by intracommuncator associated to the context 
    699        
    700         MPI_Comm intraCommClient, intraCommServer ; 
    701  
    702         intraCommClient=intraComm_ ; 
    703         MPI_Comm_dup(intraComm_, &intraCommServer) ; 
    704  
    705         CContextClient* client = CContextClient::getNew(this, intraCommClient, interCommClient) ; 
    706         CContextServer* server = CContextServer::getNew(this, intraCommServer, interCommServer) ; 
    707         client->setAssociatedServer(server) ; 
    708         server->setAssociatedClient(client) ; 
    709         clientPrimServer.push_back(client); 
    710         serverPrimServer.push_back(server);   
    711  
    712        
    713       } 
    714     } 
     619        serverPrimServer.push_back(clientServer.second.second); 
     620        writerClientOut_.push_back(clientServer.second.first) ;  
     621        writerServerOut_.push_back(clientServer.second.second) ; 
     622      } 
     623    } 
     624 
    715625  } 
    716626  CATCH_DUMP_ATTR 
     
    756666    setCurrent(getId()) ; 
    757667 
    758     if (client!=nullptr && !finalized) client->eventLoop(); 
    759      
    760     for (int i = 0; i < clientPrimServer.size(); ++i) 
    761     { 
    762       if (!finalized) clientPrimServer[i]->eventLoop(); 
    763       if (!finalized) finished &= serverPrimServer[i]->eventLoop(enableEventsProcessing); 
    764     } 
    765  
    766     for (auto couplerOut : couplerOutClient_) 
    767       if (!finalized) couplerOut.second->eventLoop(); 
    768      
    769     for (auto couplerIn : couplerInClient_) 
    770       if (!finalized) couplerIn.second->eventLoop(); 
    771      
    772     for (auto couplerOut : couplerOutServer_) 
    773       if (!finalized) couplerOut.second->eventLoop(enableEventsProcessing); 
    774  
    775     for (auto couplerIn : couplerInServer_) 
    776       if (!finalized) couplerIn.second->eventLoop(enableEventsProcessing); 
    777      
    778     if (server!=nullptr) if (!finalized) finished &= server->eventLoop(enableEventsProcessing); 
     668    if (!finalized) 
     669    { 
     670      for(auto client : writerClientOut_) client->eventLoop(); 
     671      for(auto server : writerServerOut_) finished &= server->eventLoop(enableEventsProcessing); 
     672      for(auto client : writerClientIn_) client->eventLoop(); 
     673      for(auto server : writerServerIn_) finished &= server->eventLoop(enableEventsProcessing); 
     674      for(auto couplerOut : couplerOutClient_) couplerOut.second->eventLoop(); 
     675      for(auto couplerIn : couplerInClient_) couplerIn.second->eventLoop(); 
     676      for(auto couplerOut : couplerOutServer_) couplerOut.second->eventLoop(enableEventsProcessing); 
     677      for(auto couplerIn : couplerInServer_) couplerIn.second->eventLoop(enableEventsProcessing); 
     678    } 
    779679    setCurrent(getId()) ; 
    780680    return finalized && finished ; 
     
    837737   { 
    838738      registryOut->hierarchicalGatherRegistry() ; 
    839       if (server->getIntraCommRank()==0) CXios::getRegistryManager()->merge(*registryOut) ; 
     739      if (intraCommRank_==0) CXios::getRegistryManager()->merge(*registryOut) ; 
    840740 
    841741      if (serviceType_==CServicesManager::CLIENT) 
    842742      { 
    843743//ym        doPreTimestepOperationsForEnabledReadModeFiles(); // For now we only use server level 1 to read data 
    844  
    845744        triggerLateFields() ; 
    846745 
     
    857756        } while (!couplersInFinalized) ; 
    858757 
     758 
     759        auto& client=writerClientOut_[0] ; 
     760        auto& server=writerServerOut_[0] ; 
     761 
    859762        info(100)<<"DEBUG: context "<<getId()<<" Send client finalize"<<endl ; 
    860763        client->finalize(); 
     
    865768        do 
    866769        { 
    867           notifiedFinalized=client->isNotifiedFinalized() ; 
     770          notifiedFinalized = client->isNotifiedFinalized() ; 
    868771        } while (!notifiedFinalized) ; 
    869772 
     
    874777      else if (serviceType_==CServicesManager::GATHERER) 
    875778      { 
    876          for (int i = 0; i < clientPrimServer.size(); ++i) 
     779         for(auto& client : writerClientOut_) 
    877780         { 
    878            clientPrimServer[i]->finalize(); 
     781           client->finalize(); 
    879782           bool bufferReleased; 
    880783           do 
    881784           { 
    882              clientPrimServer[i]->eventLoop(); 
    883              bufferReleased = !clientPrimServer[i]->havePendingRequests(); 
     785             client->eventLoop(); 
     786             bufferReleased = !client->havePendingRequests(); 
    884787           } while (!bufferReleased); 
    885788            
     
    887790           do 
    888791           { 
    889              notifiedFinalized=clientPrimServer[i]->isNotifiedFinalized() ; 
     792             notifiedFinalized=client->isNotifiedFinalized() ; 
    890793           } while (!notifiedFinalized) ; 
    891            clientPrimServer[i]->releaseBuffers(); 
     794           client->releaseBuffers(); 
    892795         } 
    893796         closeAllFile(); 
    894  
     797         //ym writerClientIn & writerServerIn not released here ==> to check !! 
    895798      } 
    896799      else if (serviceType_==CServicesManager::IO_SERVER || serviceType_==CServicesManager::OUT_SERVER) 
    897800      { 
    898801        closeAllFile(); 
    899         client->releaseBuffers(); 
    900         server->releaseBuffers(); 
     802        writerClientIn_[0]->releaseBuffers(); 
     803        writerServerIn_[0]->releaseBuffers(); 
    901804      } 
    902805 
     
    916819       MPI_Comm_free(&(*it)); 
    917820     comms.clear(); 
    918    } 
    919    CATCH_DUMP_ATTR 
    920  
    921    //! Deallocate buffers allocated by clientContexts 
    922    void CContext::releaseClientBuffers(void) 
    923    TRY 
    924    { 
    925      client->releaseBuffers(); 
    926      for (int i = 0; i < clientPrimServer.size(); ++i) 
    927        clientPrimServer[i]->releaseBuffers(); 
    928821   } 
    929822   CATCH_DUMP_ATTR 
     
    1072965 
    1073966    // Distribute files between secondary servers according to the data size => assign a context to a file and then to fields 
    1074     if (serviceType_==CServicesManager::GATHERER) distributeFiles(this->enabledWriteModeFiles); 
    1075     else if (serviceType_==CServicesManager::CLIENT) for(auto file : this->enabledWriteModeFiles) file->setContextClient(client) ; 
     967    if (serviceType_==CServicesManager::CLIENT || serviceType_==CServicesManager::GATHERER ) distributeFiles(this->enabledWriteModeFiles); 
     968    //else if (serviceType_==CServicesManager::CLIENT) for(auto file : this->enabledWriteModeFiles) file->setContextClient(client) ; 
    1076969 
    1077970    // client side, assign context for file reading 
    1078     if (serviceType_==CServicesManager::CLIENT) for(auto file : this->enabledReadModeFiles) file->setContextClient(client) ; 
     971    if (serviceType_==CServicesManager::CLIENT) for(auto file : this->enabledReadModeFiles) file->setContextClient(writerClientOut_[0]) ; 
    1079972     
    1080973    // server side, assign context where to send file data read 
    1081974    if (serviceType_==CServicesManager::CServicesManager::GATHERER || serviceType_==CServicesManager::IO_SERVER)  
    1082       for(auto file : this->enabledReadModeFiles) file->setContextClient(client) ; 
     975      for(auto file : this->enabledReadModeFiles) file->setContextClient(writerClientIn_[0]) ; 
    1083976    
    1084977 
     
    14861379     distFileMemory=CXios::getin<bool>("server2_dist_file_memory", distFileMemory); 
    14871380 
    1488      if (distFileMemory) distributeFileOverMemoryBandwith(files) ; 
     1381     int nbPools = writerClientOut_.size(); 
     1382     if (nbPools==1) distributeFileOverOne(files) ; 
     1383     else if (distFileMemory) distributeFileOverMemoryBandwith(files) ; 
    14891384     else distributeFileOverBandwith(files) ; 
     1385   } 
     1386   CATCH_DUMP_ATTR 
     1387 
     1388   void CContext::distributeFileOverOne(const vector<CFile*>& files) 
     1389   TRY 
     1390   { 
     1391    for(auto& file : files) file->setContextClient(writerClientOut_[0]) ; 
    14901392   } 
    14911393   CATCH_DUMP_ATTR 
     
    14971399      
    14981400     std::ofstream ofs(("distribute_file_"+getId()+".dat").c_str(), std::ofstream::out); 
    1499      int nbPools = clientPrimServer.size(); 
     1401     int nbPools = writerClientOut_.size(); 
    15001402 
    15011403     // (1) Find all enabled files in write mode 
     
    15501452       dataSize=(*poolDataSize.begin()).first ; 
    15511453       j=(*poolDataSize.begin()).second ; 
    1552        dataSizeMap[i].second->setContextClient(clientPrimServer[j]); 
     1454       dataSizeMap[i].second->setContextClient(writerClientOut_[j]); 
    15531455       dataSize+=dataSizeMap[i].first; 
    15541456       poolDataSize.erase(poolDataSize.begin()) ; 
     
    15631465   TRY 
    15641466   { 
    1565      int nbPools = clientPrimServer.size(); 
     1467     int nbPools = writerClientOut_.size(); 
    15661468     double ratio=0.5 ; 
    15671469     ratio=CXios::getin<double>("server2_dist_file_memory_ratio", ratio); 
     
    16291531         } 
    16301532       } 
    1631        filesList[i]->setContextClient(clientPrimServer[files[i].assignedServer_]) ; 
     1533       filesList[i]->setContextClient(writerClientOut_[files[i].assignedServer_]) ; 
    16321534       delete [] files[i].assignedGrid_ ; 
    16331535     } 
     
    17291631   CATCH 
    17301632 
    1731    //! Client side: Send a message to server to make it close 
    1732    // ym obsolete 
    1733    void CContext::sendCloseDefinition(void) 
    1734    TRY 
    1735    { 
    1736     int nbSrvPools ; 
    1737     if (serviceType_==CServicesManager::CLIENT) nbSrvPools = 1 ; 
    1738     else if (serviceType_==CServicesManager::GATHERER) nbSrvPools = this->clientPrimServer.size() ; 
    1739     else nbSrvPools = 0 ; 
    1740     CContextClient* contextClientTmp ; 
    1741  
    1742     for (int i = 0; i < nbSrvPools; ++i) 
    1743      { 
    1744        if (serviceType_==CServicesManager::CLIENT) contextClientTmp = client ; 
    1745        else if (serviceType_==CServicesManager::GATHERER ) contextClientTmp = clientPrimServer[i] ; 
    1746        CEventClient event(getType(),EVENT_ID_CLOSE_DEFINITION); 
    1747        if (contextClientTmp->isServerLeader()) 
    1748        { 
    1749          CMessage msg; 
    1750          const std::list<int>& ranks = contextClientTmp->getRanksServerLeader(); 
    1751          for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 
    1752            event.push(*itRank,1,msg); 
    1753          contextClientTmp->sendEvent(event); 
    1754        } 
    1755        else contextClientTmp->sendEvent(event); 
    1756      } 
    1757    } 
    1758    CATCH_DUMP_ATTR 
    1759     
    17601633   //  ! Client side: Send a message to server to make it close 
    17611634   void CContext::sendCloseDefinition(CContextClient* client) 
  • XIOS3/trunk/src/node/context.hpp

    r2405 r2406  
    160160         // Distribute files (in write mode) among secondary-server pools according to the estimated data flux 
    161161         void distributeFiles(const std::vector<CFile*>& files); 
    162          void distributeFileOverBandwith(const std::vector<CFile*>& files) ; 
    163          void distributeFileOverMemoryBandwith(const std::vector<CFile*>& files) ; 
     162         void distributeFileOverOne(const vector<CFile*>& files) ; //!< Distribute files over one single server (no distribution) 
     163         void distributeFileOverBandwith(const std::vector<CFile*>& files) ; //!< Distribute files overs servers to balance the I/O bandwith 
     164         void distributeFileOverMemoryBandwith(const std::vector<CFile*>& files) ; //!< Distribute files overs servers to minimize the memory consumption 
    164165          
     166       public: 
    165167         // Send context close definition 
    166          void sendCloseDefinition(void); 
    167        public: 
    168168         void sendCloseDefinition(CContextClient* client) ; 
    169169       private: 
     
    223223       public:   
    224224        void freeComms(void);                  //!< Free internally allcoated communicators 
    225         void releaseClientBuffers(void);       //! Deallocate buffers allocated by clientContexts 
    226225 
    227226         // dispatch event 
     
    309308         bool hasServer; 
    310309 
    311          CContextServer* server;    //!< Concrete context server 
    312          CContextClient* client;    //!< Concrete contex client 
     310      private: 
    313311         std::vector<CContextServer*> serverPrimServer; 
    314312         std::vector<CContextClient*> clientPrimServer; 
     
    321319        std::string defaultWriterId ; 
    322320        std::string defaultGathererId ; 
     321 
     322        std::vector<CContextClient*> writerClientOut_ ; 
     323        std::vector<CContextServer*> writerServerOut_ ; 
     324        std::vector<CContextClient*> writerClientIn_ ; 
     325        std::vector<CContextServer*> writerServerIn_ ; 
     326 
     327        std::vector<CContextClient*> readerClientOut_ ; 
     328        std::vector<CContextServer*> readerServerOut_ ; 
     329        std::vector<CContextClient*> readerClientIn_ ; 
     330        std::vector<CContextServer*> readerServerIn_ ; 
     331 
    323332 
    324333        std::map<std::string, CContextClient*> clients_ ; 
  • XIOS3/trunk/src/node/field.cpp

    r2397 r2406  
    14561456  CATCH_DUMP_ATTR 
    14571457 
    1458   void CField::sendCloseDefinition(void) 
    1459   { 
    1460     CContext::getCurrent()->sendCloseDefinition(client) ; 
    1461   } 
    14621458 
    14631459  void CField::sendFieldToFileServer(void) 
  • XIOS3/trunk/src/node/field.hpp

    r2326 r2406  
    146146 
    147147         void sendFieldToFileServer(void) ; 
    148          void sendCloseDefinition(void) ; 
    149148       
    150149      public: 
Note: See TracChangeset for help on using the changeset viewer.