Changeset 1318
- Timestamp:
- 10/26/17 10:23:17 (6 years ago)
- Location:
- XIOS
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/XIOS_DEV_CMIP6/src/node/context.cpp
r1316 r1318 783 783 } 784 784 785 void CContext:: checkPrefetchingOfEnabledReadModeFiles()785 void CContext::doPostTimestepOperationsForEnabledReadModeFiles() 786 786 { 787 787 int size = enabledReadModeFiles.size(); 788 788 for (int i = 0; i < size; ++i) 789 789 { 790 enabledReadModeFiles[i]-> prefetchEnabledReadModeFieldsIfNeeded();790 enabledReadModeFiles[i]->doPostTimestepOperationsForEnabledReadModeFields(); 791 791 } 792 792 } … … 1709 1709 if (hasClient && !hasServer) // For now we only use server level 1 to read data 1710 1710 { 1711 checkPrefetchingOfEnabledReadModeFiles();1711 doPostTimestepOperationsForEnabledReadModeFiles(); 1712 1712 garbageCollector.invalidate(calendar->getCurrentDate()); 1713 1713 } -
XIOS/dev/XIOS_DEV_CMIP6/src/node/context.hpp
r1239 r1318 121 121 void buildFilterGraphOfEnabledFields(); 122 122 void startPrefetchingOfEnabledReadModeFiles(); 123 void checkPrefetchingOfEnabledReadModeFiles();123 void doPostTimestepOperationsForEnabledReadModeFiles(); 124 124 void findFieldsWithReadAccess(void); 125 125 void solveAllRefOfFieldsWithReadAccess(); -
XIOS/dev/XIOS_DEV_CMIP6/src/node/field.cpp
r1315 r1318 40 40 , hasTimeInstant(false) 41 41 , hasTimeCentered(false) 42 , wasDataRequestedFromServer(false) 42 43 , wasDataAlreadyReceivedFromServer(false) 43 44 , isEOF(false), nstepMaxRead(false) … … 55 56 , hasTimeInstant(false) 56 57 , hasTimeCentered(false) 58 , wasDataRequestedFromServer(false) 57 59 , wasDataAlreadyReceivedFromServer(false) 58 60 , isEOF(false), nstepMaxRead(false) … … 291 293 lastDataRequestedFromServer = tsDataRequested; 292 294 293 if (!isEOF) // No need to send the request if we already know we are at EOF 295 // No need to send the request if we are sure that we are already at EOF 296 if (!isEOF || context->getCalendar()->getCurrentDate() <= dateEOF) 294 297 { 295 298 CEventClient event(getType(), EVENT_ID_READ_DATA); … … 307 310 else 308 311 serverSourceFilter->signalEndOfStream(tsDataRequested); 312 313 wasDataRequestedFromServer = true; 309 314 310 315 return !isEOF; … … 520 525 { 521 526 CContext* context = CContext::getCurrent(); 522 int record;523 527 std::map<int, CArray<double,1> > data; 528 const bool wasEOF = isEOF; 524 529 525 530 for (int i = 0; i < ranks.size(); i++) 526 531 { 527 532 int rank = ranks[i]; 533 int record; 528 534 *buffers[i] >> record; 529 535 isEOF = (record == int(-1)); … … 544 550 545 551 if (isEOF) 552 { 553 if (!wasEOF) 554 dateEOF = lastDataReceivedFromServer; 555 546 556 serverSourceFilter->signalEndOfStream(lastDataReceivedFromServer); 557 } 547 558 else 548 559 serverSourceFilter->streamDataFromServer(lastDataReceivedFromServer, data); 560 } 561 562 void CField::checkForLateDataFromServer(void) 563 { 564 CContext* context = CContext::getCurrent(); 565 const CDate& currentDate = context->getCalendar()->getCurrentDate(); 566 567 // Check if data previously requested has been received as expected 568 if (wasDataRequestedFromServer && (!isEOF || context->getCalendar()->getCurrentDate() <= dateEOF)) 569 { 570 CTimer timer("CField::checkForLateDataFromServer"); 571 572 bool isDataLate = !wasDataAlreadyReceivedFromServer || lastDataReceivedFromServer + file->output_freq < currentDate; 573 while (isDataLate && timer.getCumulatedTime() < CXios::recvFieldTimeout) 574 { 575 timer.resume(); 576 577 context->checkBuffersAndListen(); 578 579 timer.suspend(); 580 581 isDataLate = !wasDataAlreadyReceivedFromServer || lastDataReceivedFromServer + file->output_freq < currentDate; 582 } 583 584 if (isDataLate) 585 ERROR("void CField::checkForLateDataFromServer(void)", 586 << "Late data at timestep = " << currentDate); 587 } 549 588 } 550 589 -
XIOS/dev/XIOS_DEV_CMIP6/src/node/field.hpp
r1294 r1318 172 172 static void recvReadDataReady(CEventServer& event); 173 173 void recvReadDataReady(vector<int> ranks, vector<CBufferIn*> buffers); 174 void checkForLateDataFromServer(void); 174 175 void outputField(CArray<double,3>& fieldOut); 175 176 void outputField(CArray<double,2>& fieldOut); … … 217 218 bool isEOF; 218 219 CDate lastlast_Write_srv, last_Write_srv, last_operation_srv; 219 CDate lastDataRequestedFromServer, lastDataReceivedFromServer ;220 bool wasData AlreadyReceivedFromServer;220 CDate lastDataRequestedFromServer, lastDataReceivedFromServer, dateEOF; 221 bool wasDataRequestedFromServer, wasDataAlreadyReceivedFromServer; 221 222 222 223 map<int,boost::shared_ptr<func::CFunctor> > foperation_srv; -
XIOS/dev/XIOS_DEV_CMIP6/src/node/file.cpp
r1316 r1318 867 867 868 868 /*! 869 Prefetching the data for enabled fields read from file whose data is out-of-date. 870 */ 871 void CFile::prefetchEnabledReadModeFieldsIfNeeded(void) 869 Do all post timestep operations for enabled fields in read mode: 870 - Prefetch the data read from file when needed 871 - Check that the data excepted from server has been received 872 */ 873 void CFile::doPostTimestepOperationsForEnabledReadModeFields(void) 872 874 { 873 875 if (mode.isEmpty() || mode.getValue() != mode_attr::read) … … 876 878 int size = this->enabledFields.size(); 877 879 for (int i = 0; i < size; ++i) 880 { 881 this->enabledFields[i]->checkForLateDataFromServer(); 878 882 this->enabledFields[i]->sendReadDataRequestIfNeeded(); 883 } 879 884 } 880 885 -
XIOS/dev/XIOS_DEV_CMIP6/src/node/file.hpp
r1239 r1318 111 111 void buildFilterGraphOfEnabledFields(CGarbageCollector& gc); 112 112 void prefetchEnabledReadModeFields(); 113 void prefetchEnabledReadModeFieldsIfNeeded();113 void doPostTimestepOperationsForEnabledReadModeFields(); 114 114 115 115 void solveAllRefOfEnabledFieldsAndTransform(bool sendToServer); -
XIOS/trunk/src/node/context.cpp
r1200 r1318 514 514 } 515 515 516 void CContext:: checkPrefetchingOfEnabledReadModeFiles()516 void CContext::doPostTimestepOperationsForEnabledReadModeFiles() 517 517 { 518 518 int size = enabledReadModeFiles.size(); 519 519 for (int i = 0; i < size; ++i) 520 520 { 521 enabledReadModeFiles[i]-> prefetchEnabledReadModeFieldsIfNeeded();521 enabledReadModeFiles[i]->doPostTimestepOperationsForEnabledReadModeFields(); 522 522 } 523 523 } … … 1210 1210 if (hasClient) 1211 1211 { 1212 checkPrefetchingOfEnabledReadModeFiles();1212 doPostTimestepOperationsForEnabledReadModeFiles(); 1213 1213 garbageCollector.invalidate(calendar->getCurrentDate()); 1214 1214 } -
XIOS/trunk/src/node/context.hpp
r1033 r1318 115 115 void buildFilterGraphOfEnabledFields(); 116 116 void startPrefetchingOfEnabledReadModeFiles(); 117 void checkPrefetchingOfEnabledReadModeFiles();117 void doPostTimestepOperationsForEnabledReadModeFiles(); 118 118 void findFieldsWithReadAccess(void); 119 119 void solveAllRefOfFieldsWithReadAccess(); -
XIOS/trunk/src/node/field.cpp
r1315 r1318 38 38 , hasTimeInstant(false) 39 39 , hasTimeCentered(false) 40 , wasDataRequestedFromServer(false) 40 41 , wasDataAlreadyReceivedFromServer(false) 41 42 , isEOF(false) … … 52 53 , hasTimeInstant(false) 53 54 , hasTimeCentered(false) 55 , wasDataRequestedFromServer(false) 54 56 , wasDataAlreadyReceivedFromServer(false) 55 57 , isEOF(false) … … 261 263 lastDataRequestedFromServer = tsDataRequested; 262 264 263 if (!isEOF) // No need to send the request if we already know we are at EOF 265 // No need to send the request if we are sure that we are already at EOF 266 if (!isEOF || context->getCalendar()->getCurrentDate() <= dateEOF) 264 267 { 265 268 CEventClient event(getType(), EVENT_ID_READ_DATA); … … 277 280 else 278 281 serverSourceFilter->signalEndOfStream(tsDataRequested); 282 283 wasDataRequestedFromServer = true; 279 284 280 285 return !isEOF; … … 433 438 { 434 439 CContext* context = CContext::getCurrent(); 435 int record;436 440 std::map<int, CArray<double,1> > data; 441 const bool wasEOF = isEOF; 437 442 438 443 for (int i = 0; i < ranks.size(); i++) 439 444 { 440 445 int rank = ranks[i]; 446 int record; 441 447 *buffers[i] >> record; 442 448 isEOF = (record == int(-1)); … … 457 463 458 464 if (isEOF) 465 { 466 if (!wasEOF) 467 dateEOF = lastDataReceivedFromServer; 468 459 469 serverSourceFilter->signalEndOfStream(lastDataReceivedFromServer); 470 } 460 471 else 461 472 serverSourceFilter->streamDataFromServer(lastDataReceivedFromServer, data); 473 } 474 475 void CField::checkForLateDataFromServer(void) 476 { 477 CContext* context = CContext::getCurrent(); 478 const CDate& currentDate = context->getCalendar()->getCurrentDate(); 479 480 // Check if data previously requested has been received as expected 481 if (wasDataRequestedFromServer && (!isEOF || context->getCalendar()->getCurrentDate() <= dateEOF)) 482 { 483 CTimer timer("CField::checkForLateDataFromServer"); 484 485 bool isDataLate = !wasDataAlreadyReceivedFromServer || lastDataReceivedFromServer + file->output_freq < currentDate; 486 while (isDataLate && timer.getCumulatedTime() < CXios::recvFieldTimeout) 487 { 488 timer.resume(); 489 490 context->checkBuffersAndListen(); 491 492 timer.suspend(); 493 494 isDataLate = !wasDataAlreadyReceivedFromServer || lastDataReceivedFromServer + file->output_freq < currentDate; 495 } 496 497 if (isDataLate) 498 ERROR("void CField::checkForLateDataFromServer(void)", 499 << "Late data at timestep = " << currentDate); 500 } 462 501 } 463 502 -
XIOS/trunk/src/node/field.hpp
r1286 r1318 150 150 static void recvReadDataReady(CEventServer& event); 151 151 void recvReadDataReady(vector<int> ranks, vector<CBufferIn*> buffers); 152 void checkForLateDataFromServer(void); 152 153 void outputField(CArray<double,3>& fieldOut); 153 154 void outputField(CArray<double,2>& fieldOut); … … 197 198 bool isEOF; 198 199 CDate lastlast_Write_srv, last_Write_srv, last_operation_srv; 199 CDate lastDataRequestedFromServer, lastDataReceivedFromServer ;200 bool wasData AlreadyReceivedFromServer;200 CDate lastDataRequestedFromServer, lastDataReceivedFromServer, dateEOF; 201 bool wasDataRequestedFromServer, wasDataAlreadyReceivedFromServer; 201 202 202 203 map<int,boost::shared_ptr<func::CFunctor> > foperation_srv; -
XIOS/trunk/src/node/file.cpp
r1286 r1318 783 783 784 784 /*! 785 Prefetching the data for enabled fields read from file whose data is out-of-date. 786 */ 787 void CFile::prefetchEnabledReadModeFieldsIfNeeded(void) 785 Do all post timestep operations for enabled fields in read mode: 786 - Prefetch the data read from file when needed 787 - Check that the data excepted from server has been received 788 */ 789 void CFile::doPostTimestepOperationsForEnabledReadModeFields(void) 788 790 { 789 791 if (mode.isEmpty() || mode.getValue() != mode_attr::read) … … 792 794 int size = this->enabledFields.size(); 793 795 for (int i = 0; i < size; ++i) 796 { 797 this->enabledFields[i]->checkForLateDataFromServer(); 794 798 this->enabledFields[i]->sendReadDataRequestIfNeeded(); 799 } 795 800 } 796 801 -
XIOS/trunk/src/node/file.hpp
r1090 r1318 107 107 void buildFilterGraphOfEnabledFields(CGarbageCollector& gc); 108 108 void prefetchEnabledReadModeFields(); 109 void prefetchEnabledReadModeFieldsIfNeeded();109 void doPostTimestepOperationsForEnabledReadModeFields(); 110 110 111 111 // Add component into file
Note: See TracChangeset
for help on using the changeset viewer.