Changeset 1009 for XIOS/dev/dev_olga/src/node/context.cpp
- Timestamp:
- 12/05/16 17:47:54 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/dev_olga/src/node/context.cpp
r992 r1009 27 27 , calendar(), hasClient(false), hasServer(false) 28 28 , isPostProcessed(false), finalized(false) 29 , idServer_(), client(0), server(0), clientPrimServer(0), serverPrimServer(0) 29 , idServer_(), client(0), server(0) 30 // , clientPrimServer(0), serverPrimServer(0) 30 31 { /* Ne rien faire de plus */ } 31 32 … … 34 35 , calendar(), hasClient(false), hasServer(false) 35 36 , isPostProcessed(false), finalized(false) 36 , idServer_(), client(0), server(0), clientPrimServer(0), serverPrimServer(0) 37 , idServer_(), client(0), server(0) 38 // , clientPrimServer(0), serverPrimServer(0) 37 39 { /* Ne rien faire de plus */ } 38 40 … … 41 43 delete client; 42 44 delete server; 43 delete clientPrimServer;44 delete serverPrimServer;45 // delete clientPrimServer; 46 // delete serverPrimServer; 45 47 } 46 48 … … 252 254 else // initClient is called by primary server pool 253 255 { 254 clientPrimServer = new CContextClient(this, intraComm, interComm); 255 serverPrimServer = new CContextServer(this, 1, intraComm, interComm); // just some int parameter to distinguish server from serverPrimServer on server1 256 // clientPrimServer = new CContextClient(this, intraComm, interComm); 257 // serverPrimServer = new CContextServer(this, 1, intraComm, interComm); // just some int parameter to distinguish server from serverPrimServer on server1 258 clientPrimServer.push_back(new CContextClient(this, intraComm, interComm)); 259 serverPrimServer.push_back(new CContextServer(this, intraComm, interComm)); 256 260 } 257 261 … … 320 324 if (hasClient && hasServer) 321 325 { 322 if (clientPrimServer->isServerLeader()) 323 { 324 const std::list<int>& ranks = clientPrimServer->getRanksServerLeader(); 325 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 326 if (!bufferSize.count(*itRank)) bufferSize[*itRank] = maxEventSize[*itRank] = minBufferSize; 327 } 328 clientPrimServer->setBufferSize(bufferSize, maxEventSize); 329 } 330 326 for (int i = 0; i < clientPrimServer.size(); ++i) 327 { 328 if (clientPrimServer[i]->isServerLeader()) 329 { 330 const std::list<int>& ranks = clientPrimServer[i]->getRanksServerLeader(); 331 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 332 if (!bufferSize.count(*itRank)) bufferSize[*itRank] = maxEventSize[*itRank] = minBufferSize; 333 } 334 clientPrimServer[i]->setBufferSize(bufferSize, maxEventSize); 335 } 336 } 331 337 } 332 338 … … 377 383 { 378 384 bool serverFinished = server->eventLoop(); 379 bool serverPrimFinished = serverPrimServer->eventLoop(); 385 bool serverPrimFinished = true; 386 for (int i = 0; i < serverPrimServer.size(); ++i) 387 { 388 serverPrimFinished *= serverPrimServer[i]->eventLoop(); 389 } 380 390 return ( serverFinished && serverPrimFinished); 381 391 } … … 397 407 { 398 408 client->checkBuffers(); 399 clientPrimServer->checkBuffers(); 409 for (int i = 0; i < clientPrimServer.size(); ++i) 410 clientPrimServer[i]->checkBuffers(); 400 411 bool serverFinished = server->eventLoop(); 401 bool serverPrimFinished = serverPrimServer->eventLoop(); 412 bool serverPrimFinished = true; 413 for (int i = 0; i < serverPrimServer.size(); ++i) 414 { 415 serverPrimFinished *= serverPrimServer[i]->eventLoop(); 416 } 402 417 return ( serverFinished && serverPrimFinished); 403 418 } … … 412 427 void CContext::finalize(void) 413 428 { 414 415 416 429 if (!finalized) 430 { 431 finalized = true; 417 432 // if (hasClient) sendRegistry() ; 418 433 419 /* if (CXios::serverLevel == 0) 420 { 421 client->finalize(); 422 while (!server->hasFinished()) 423 { 424 server->eventLoop(); 425 } 426 } 427 else if (CXios::serverLevel == 1) 428 { 429 clientPrimServer->finalize(); 430 while (!serverPrimServer->hasFinished()) 431 { 432 serverPrimServer->eventLoop(); 433 } 434 client->finalize(); 435 while (!server->hasFinished()) 436 { 437 server->eventLoop(); 438 } 439 } 440 else if (CXios::serverLevel == 2) 441 { 442 client->finalize(); 443 while (!server->hasFinished()) 444 { 445 server->eventLoop(); 446 } 447 }*/ 448 449 if ((hasClient) && (hasServer)) 450 { 451 clientPrimServer->finalize(); 452 while (!serverPrimServer->hasFinished()) 453 { 454 serverPrimServer->eventLoop(); 455 CServer::eventScheduler->checkEvent() ; 456 } 457 } 458 459 client->finalize(); 460 while (!server->hasFinished()) 461 { 462 server->eventLoop(); 463 } 464 465 466 if (hasServer) 467 { 468 closeAllFile(); 469 registryOut->hierarchicalGatherRegistry() ; 470 if (server->intraCommRank==0) CXios::globalRegistry->mergeRegistry(*registryOut) ; 471 } 472 473 for (std::list<MPI_Comm>::iterator it = comms.begin(); it != comms.end(); ++it) 474 MPI_Comm_free(&(*it)); 475 comms.clear(); 434 if ((hasClient) && (hasServer)) 435 { 436 for (int i = 0; i < clientPrimServer.size(); ++i) 437 clientPrimServer[i]->finalize(); 438 439 for (int i = 0; i < serverPrimServer.size(); ++i) 440 { 441 while (!serverPrimServer[i]->hasFinished()) 442 { 443 serverPrimServer[i]->eventLoop(); 444 CServer::eventScheduler->checkEvent() ; 445 } 446 } 447 } 448 449 client->finalize(); 450 while (!server->hasFinished()) 451 { 452 server->eventLoop(); 453 } 454 455 if (hasServer) 456 { 457 closeAllFile(); 458 registryOut->hierarchicalGatherRegistry() ; 459 if (server->intraCommRank==0) CXios::globalRegistry->mergeRegistry(*registryOut) ; 460 } 461 462 for (std::vector<CContextClient*>::iterator it = clientPrimServer.begin(); it != clientPrimServer.end(); it++) 463 delete *it; 464 465 for (std::vector<CContextServer*>::iterator it = serverPrimServer.begin(); it != serverPrimServer.end(); it++) 466 delete *it; 467 468 for (std::list<MPI_Comm>::iterator it = comms.begin(); it != comms.end(); ++it) 469 MPI_Comm_free(&(*it)); 470 comms.clear(); 471 472 476 473 } 477 474 } … … 508 505 509 506 // We have enough information to send to server 510 // First of all, send all enabled files 507 if (!hasServer) 508 { 509 // First of all, send all enabled files 511 510 sendEnabledFiles(); 512 513 // Then, send all enabled fields 511 // Then, send all enabled fields 514 512 sendEnabledFields(); 513 } 514 else 515 { 516 sendEnabledFiles(clientPrimServer.size()); 517 sendEnabledFields(clientPrimServer.size()); 518 } 515 519 516 520 // At last, we have all info of domain and axis, then send them 517 521 sendRefDomainsAxis(); 518 519 522 // After that, send all grid (if any) 520 523 sendRefGrid(); 521 522 524 // We have a xml tree on the server side and now, it should be also processed 523 525 sendPostProcessing(); … … 539 541 this->solveAllRefOfEnabledFields(true); 540 542 } 541 542 543 543 544 544 // // Now tell server that it can process all messages from client … … 769 769 { 770 770 // Use correct context client to send message 771 CContextClient* contextClientTmp = (0 != clientPrimServer) ? clientPrimServer : client; 772 CEventClient event(getType(),EVENT_ID_CLOSE_DEFINITION); 773 774 if (contextClientTmp->isServerLeader()) 775 { 776 CMessage msg; 777 msg<<this->getIdServer(); 778 const std::list<int>& ranks = contextClientTmp->getRanksServerLeader(); 779 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 780 event.push(*itRank,1,msg); 781 contextClientTmp->sendEvent(event); 782 } 783 else contextClientTmp->sendEvent(event); 784 785 // if (!hasServer) 786 // { 787 // if (client->isServerLeader()) 788 // { 789 // CMessage msg; 790 // msg<<this->getIdServer(); 791 // const std::list<int>& ranks = client->getRanksServerLeader(); 792 // for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 793 // event.push(*itRank,1,msg); 794 // client->sendEvent(event); 795 // } 796 // else client->sendEvent(event); 797 // } 798 // else 799 // { 800 // if (clientPrimServer->isServerLeader()) 801 // { 802 // CMessage msg; 803 // msg<<this->getIdServer(); 804 // const std::list<int>& ranks = clientPrimServer->getRanksServerLeader(); 805 // for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 806 // event.push(*itRank,1,msg); 807 // clientPrimServer->sendEvent(event); 808 // } 809 // else clientPrimServer->sendEvent(event); 810 811 // } 771 // CContextClient* contextClientTmp = (hasServer) ? clientPrimServer[0] : client; 772 int nbSrvPools = (hasServer) ? clientPrimServer.size() : 1; 773 for (int i = 0; i < nbSrvPools; ++i) 774 { 775 CContextClient* contextClientTmp = (hasServer) ? clientPrimServer[i] : client; 776 CEventClient event(getType(),EVENT_ID_CLOSE_DEFINITION); 777 if (contextClientTmp->isServerLeader()) 778 { 779 CMessage msg; 780 if (hasServer) 781 msg<<this->getIdServer(i); 782 else 783 msg<<this->getIdServer(); 784 const std::list<int>& ranks = contextClientTmp->getRanksServerLeader(); 785 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 786 event.push(*itRank,1,msg); 787 contextClientTmp->sendEvent(event); 788 } 789 else contextClientTmp->sendEvent(event); 790 } 812 791 } 813 792 … … 829 808 { 830 809 // Use correct context client to send message 831 CContextClient* contextClientTmp = (0 != clientPrimServer) ? clientPrimServer : client; 832 CEventClient event(getType(),EVENT_ID_UPDATE_CALENDAR); 833 834 if (contextClientTmp->isServerLeader()) 835 { 836 CMessage msg; 837 msg<<this->getIdServer()<<step; 838 const std::list<int>& ranks = contextClientTmp->getRanksServerLeader(); 839 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 840 event.push(*itRank,1,msg); 841 contextClientTmp->sendEvent(event); 842 } 843 else contextClientTmp->sendEvent(event); 810 // CContextClient* contextClientTmp = (0 != clientPrimServer) ? clientPrimServer : client; 811 int nbSrvPools = (hasServer) ? clientPrimServer.size() : 1; 812 for (int i = 0; i < nbSrvPools; ++i) 813 { 814 CContextClient* contextClientTmp = (hasServer) ? clientPrimServer[i] : client; 815 CEventClient event(getType(),EVENT_ID_UPDATE_CALENDAR); 816 817 if (contextClientTmp->isServerLeader()) 818 { 819 CMessage msg; 820 if (hasServer) 821 msg<<this->getIdServer(i)<<step; 822 else 823 msg<<this->getIdServer()<<step; 824 const std::list<int>& ranks = contextClientTmp->getRanksServerLeader(); 825 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 826 event.push(*itRank,1,msg); 827 contextClientTmp->sendEvent(event); 828 } 829 else contextClientTmp->sendEvent(event); 830 } 844 831 845 832 // if (!hasServer) … … 896 883 { 897 884 // Use correct context client to send message 898 CContextClient* contextClientTmp = (0 != clientPrimServer) ? clientPrimServer : client; 899 CEventClient event(getType(),EVENT_ID_CREATE_FILE_HEADER); 900 901 if (contextClientTmp->isServerLeader()) 902 { 903 CMessage msg; 904 msg<<this->getIdServer(); 905 const std::list<int>& ranks = contextClientTmp->getRanksServerLeader(); 906 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 907 event.push(*itRank,1,msg) ; 908 contextClientTmp->sendEvent(event); 909 } 910 else contextClientTmp->sendEvent(event); 911 885 // CContextClient* contextClientTmp = (0 != clientPrimServer) ? clientPrimServer : client; 886 int nbSrvPools = (hasServer) ? clientPrimServer.size() : 1; 887 for (int i = 0; i < nbSrvPools; ++i) 888 { 889 CContextClient* contextClientTmp = (hasServer) ? clientPrimServer[i] : client; 890 CEventClient event(getType(),EVENT_ID_CREATE_FILE_HEADER); 891 892 if (contextClientTmp->isServerLeader()) 893 { 894 CMessage msg; 895 if (hasServer) 896 msg<<this->getIdServer(i); 897 else 898 msg<<this->getIdServer(); 899 const std::list<int>& ranks = contextClientTmp->getRanksServerLeader(); 900 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 901 event.push(*itRank,1,msg) ; 902 contextClientTmp->sendEvent(event); 903 } 904 else contextClientTmp->sendEvent(event); 905 } 912 906 // if (!hasServer) 913 907 // { … … 964 958 { 965 959 // Use correct context client to send message 966 CContextClient* contextClientTmp = (0 != clientPrimServer) ? clientPrimServer : client; 967 CEventClient event(getType(),EVENT_ID_POST_PROCESS); 968 969 if (contextClientTmp->isServerLeader()) 970 { 971 CMessage msg; 972 msg<<this->getIdServer(); 973 const std::list<int>& ranks = contextClientTmp->getRanksServerLeader(); 974 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 960 // CContextClient* contextClientTmp = (0 != clientPrimServer) ? clientPrimServer : client; 961 int nbSrvPools = (hasServer) ? clientPrimServer.size() : 1; 962 for (int i = 0; i < nbSrvPools; ++i) 963 { 964 CContextClient* contextClientTmp = (hasServer) ? clientPrimServer[i] : client; 965 CEventClient event(getType(),EVENT_ID_POST_PROCESS); 966 if (contextClientTmp->isServerLeader()) 967 { 968 CMessage msg; 969 if (hasServer) 970 msg<<this->getIdServer(i); 971 else 972 msg<<this->getIdServer(); 973 const std::list<int>& ranks = contextClientTmp->getRanksServerLeader(); 974 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 975 975 event.push(*itRank,1,msg); 976 contextClientTmp->sendEvent(event); 977 } 978 else contextClientTmp->sendEvent(event); 976 contextClientTmp->sendEvent(event); 977 } 978 else contextClientTmp->sendEvent(event); 979 } 979 980 980 981 // if (hasClient) … … 1038 1039 } 1039 1040 1041 const StdString& CContext::getIdServer(const int i) 1042 { 1043 idServer_ = this->getId(); 1044 idServer_ += "_server_"; 1045 idServer_ += boost::lexical_cast<string>(i); 1046 return idServer_; 1047 } 1048 1049 1040 1050 /*! 1041 1051 \brief Do some simple post processings after parsing xml file … … 1192 1202 StdString fileDefRoot("file_definition"); 1193 1203 CFileGroup* cfgrpPtr = CFileGroup::get(fileDefRoot); 1194 1195 1204 for (int i = 0; i < size; ++i) 1196 1205 { … … 1201 1210 } 1202 1211 1212 //! Client side: Send infomation of active files (files are enabled to write out) 1213 void CContext::sendEnabledFiles(const int nbPools) 1214 { 1215 int size = this->enabledFiles.size(); 1216 1217 // In a context, each type has a root definition, e.g: axis, domain, field. 1218 // Every object must be a child of one of these root definition. In this case 1219 // all new file objects created on server must be children of the root "file_definition" 1220 StdString fileDefRoot("file_definition"); 1221 CFileGroup* cfgrpPtr = CFileGroup::get(fileDefRoot); 1222 1223 { 1224 for (int i = 0; i < size; ++i) 1225 { 1226 int srvId = i % nbPools; 1227 cfgrpPtr->sendCreateChild(this->enabledFiles[i]->getId(), srvId); 1228 this->enabledFiles[i]->sendAllAttributesToServer(srvId); 1229 this->enabledFiles[i]->sendAddAllVariables(srvId); 1230 } 1231 } 1232 } 1233 1203 1234 //! Client side: Send information of active fields (ones are written onto files) 1204 1235 void CContext::sendEnabledFields() … … 1208 1239 { 1209 1240 this->enabledFiles[i]->sendEnabledFields(); 1241 } 1242 } 1243 1244 void CContext::sendEnabledFields(const int nbPools) 1245 { 1246 int size = this->enabledFiles.size(); 1247 for (int i = 0; i < size; ++i) 1248 { 1249 int srvId = i % nbPools; 1250 this->enabledFiles[i]->sendEnabledFields(srvId); 1210 1251 } 1211 1252 } … … 1320 1361 //! Client side: Send information of reference domain and axis of active fields 1321 1362 void CContext::sendRefDomainsAxis() 1363 { 1364 std::set<StdString> domainIds, axisIds, scalarIds; 1365 1366 // Find all reference domain and axis of all active fields 1367 int numEnabledFiles = this->enabledFiles.size(); 1368 for (int i = 0; i < numEnabledFiles; ++i) 1369 { 1370 std::vector<CField*> enabledFields = this->enabledFiles[i]->getEnabledFields(); 1371 int numEnabledFields = enabledFields.size(); 1372 for (int j = 0; j < numEnabledFields; ++j) 1373 { 1374 const std::vector<StdString>& prDomAxisScalarId = enabledFields[j]->getRefDomainAxisIds(); 1375 if ("" != prDomAxisScalarId[0]) domainIds.insert(prDomAxisScalarId[0]); 1376 if ("" != prDomAxisScalarId[1]) axisIds.insert(prDomAxisScalarId[1]); 1377 if ("" != prDomAxisScalarId[2]) scalarIds.insert(prDomAxisScalarId[2]); 1378 } 1379 } 1380 1381 // Create all reference axis on server side 1382 std::set<StdString>::iterator itDom, itAxis, itScalar; 1383 std::set<StdString>::const_iterator itE; 1384 1385 StdString scalarDefRoot("scalar_definition"); 1386 CScalarGroup* scalarPtr = CScalarGroup::get(scalarDefRoot); 1387 itE = scalarIds.end(); 1388 for (itScalar = scalarIds.begin(); itScalar != itE; ++itScalar) 1389 { 1390 if (!itScalar->empty()) 1391 { 1392 scalarPtr->sendCreateChild(*itScalar); 1393 CScalar::get(*itScalar)->sendAllAttributesToServer(); 1394 } 1395 } 1396 1397 StdString axiDefRoot("axis_definition"); 1398 CAxisGroup* axisPtr = CAxisGroup::get(axiDefRoot); 1399 itE = axisIds.end(); 1400 for (itAxis = axisIds.begin(); itAxis != itE; ++itAxis) 1401 { 1402 if (!itAxis->empty()) 1403 { 1404 axisPtr->sendCreateChild(*itAxis); 1405 CAxis::get(*itAxis)->sendAllAttributesToServer(); 1406 } 1407 } 1408 1409 // Create all reference domains on server side 1410 StdString domDefRoot("domain_definition"); 1411 CDomainGroup* domPtr = CDomainGroup::get(domDefRoot); 1412 itE = domainIds.end(); 1413 for (itDom = domainIds.begin(); itDom != itE; ++itDom) 1414 { 1415 if (!itDom->empty()) { 1416 domPtr->sendCreateChild(*itDom); 1417 CDomain::get(*itDom)->sendAllAttributesToServer(); 1418 } 1419 } 1420 } 1421 1422 //! Client side: Send information of reference domain and axis of active fields 1423 void CContext::sendRefDomainsAxis(const int nbPools) 1322 1424 { 1323 1425 std::set<StdString> domainIds, axisIds, scalarIds; … … 1466 1568 registryOut->hierarchicalGatherRegistry() ; 1467 1569 1468 // Use correct context client to send message 1469 CContextClient* contextClientTmp = (0 != clientPrimServer) ? clientPrimServer : client; 1470 CEventClient event(CContext::GetType(), CContext::EVENT_ID_SEND_REGISTRY); 1471 if (contextClientTmp->isServerLeader()) 1472 { 1473 CMessage msg ; 1474 msg<<this->getIdServer(); 1475 if (contextClientTmp->clientRank==0) msg<<*registryOut ; 1476 const std::list<int>& ranks = client->getRanksServerLeader(); 1477 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 1478 event.push(*itRank,1,msg); 1479 contextClientTmp->sendEvent(event); 1480 } 1481 else contextClientTmp->sendEvent(event); 1570 // Use correct context client to send message 1571 // CContextClient* contextClientTmp = (0 != clientPrimServer) ? clientPrimServer : client; 1572 int nbSrvPools = (hasServer) ? clientPrimServer.size() : 1; 1573 for (int i = 0; i < nbSrvPools; ++i) 1574 { 1575 CContextClient* contextClientTmp = (hasServer) ? clientPrimServer[i] : client; 1576 CEventClient event(CContext::GetType(), CContext::EVENT_ID_SEND_REGISTRY); 1577 if (contextClientTmp->isServerLeader()) 1578 { 1579 CMessage msg ; 1580 if (hasServer) 1581 msg<<this->getIdServer(i); 1582 else 1583 msg<<this->getIdServer(); 1584 if (contextClientTmp->clientRank==0) msg<<*registryOut ; 1585 const std::list<int>& ranks = client->getRanksServerLeader(); 1586 for (std::list<int>::const_iterator itRank = ranks.begin(), itRankEnd = ranks.end(); itRank != itRankEnd; ++itRank) 1587 event.push(*itRank,1,msg); 1588 contextClientTmp->sendEvent(event); 1589 } 1590 else contextClientTmp->sendEvent(event); 1591 } 1482 1592 1483 1593 // if (!hasServer)
Note: See TracChangeset
for help on using the changeset viewer.