@@ -326,6 +326,33 @@ void FesapiHdfProxy::writeArrayNdSlab(
326326 const uint64_t * numValuesInEachDimension,
327327 const uint64_t * offsetInEachDimension,
328328 unsigned int numDimensions)
329+ {
330+ std::set<int64_t >stillProcessingMsgIds = async_writeArrayNdSlab (groupName, datasetName,
331+ datatype, values, numValuesInEachDimension,
332+ offsetInEachDimension, numDimensions);
333+
334+ auto t_start = std::chrono::high_resolution_clock::now ();
335+ while (!stillProcessingMsgIds.empty ()) {
336+ for (int64_t msgId : stillProcessingMsgIds) {
337+ if (!session_->isMessageStillProcessing (msgId)) {
338+ stillProcessingMsgIds.erase (msgId);
339+ }
340+ }
341+ if (std::chrono::duration<double , std::milli>(std::chrono::high_resolution_clock::now () - t_start).count () > session_->getTimeOut ()) {
342+ throw std::runtime_error (" Time out waiting for a writeArrayNdSlab response" );
343+ }
344+ }
345+ std::cerr << " writeArrayNdSlab Response got in " << std::chrono::duration<double , std::milli>(std::chrono::high_resolution_clock::now () - t_start).count () << " ms" << std::endl;
346+ }
347+
348+ std::set<int64_t > FesapiHdfProxy::async_writeArrayNdSlab (
349+ const string& groupName,
350+ const string& datasetName,
351+ COMMON_NS::AbstractObject::numericalDatatypeEnum datatype,
352+ const void * values,
353+ const uint64_t * numValuesInEachDimension,
354+ const uint64_t * offsetInEachDimension,
355+ unsigned int numDimensions)
329356{
330357 if (!isOpened ())
331358 open ();
@@ -370,6 +397,7 @@ void FesapiHdfProxy::writeArrayNdSlab(
370397 " You need to give a COMMON_NS::AbstractObject::numericalDatatypeEnum as the datatype" );
371398 }
372399
400+ std::set<int64_t > sentMessageIds;
373401 if (totalCount * valueSize <= maxArraySize_) {
374402 std::vector<int64_t > counts;
375403 std::vector<int64_t > starts;
@@ -389,7 +417,7 @@ void FesapiHdfProxy::writeArrayNdSlab(
389417 pdsa.dataSubarrays [" 0" ].data = convertVoidArrayIntoAvroAnyArray (datatype, values, totalCount);
390418
391419 // Send putDataSubarrays Message
392- session_->sendAndBlock (pdsa, 0 , 0x02 );
420+ sentMessageIds. insert ( session_->send (pdsa, 0 , 0x02 ) );
393421 }
394422 else {
395423 std::unique_ptr<uint64_t []> counts (new uint64_t [numDimensions]);
@@ -405,10 +433,11 @@ void FesapiHdfProxy::writeArrayNdSlab(
405433 if (numValuesInEachDimension[dimIdx] > 1 ) {
406434 uint64_t previousCount = counts[dimIdx];
407435 counts[dimIdx] /= 2 ;
408-
409- writeArrayNdSlab (groupName, datasetName,
436+
437+ std::set< int64_t > intermediateResult = async_writeArrayNdSlab (groupName, datasetName,
410438 datatype, values, counts.get (),
411439 starts.get (), numDimensions);
440+ sentMessageIds.insert (intermediateResult.begin (), intermediateResult.end ());
412441
413442 writtenTotalCount = std::accumulate (counts.get (), counts.get () + numDimensions, 1 , std::multiplies<size_t >());
414443
@@ -424,10 +453,13 @@ void FesapiHdfProxy::writeArrayNdSlab(
424453 + std::to_string (maxArraySize_) + " bytes." );
425454 }
426455
427- writeArrayNdSlab (groupName, datasetName, datatype,
456+ std::set< int64_t > intermediateResult = async_writeArrayNdSlab (groupName, datasetName, datatype,
428457 (int8_t *)values + (writtenTotalCount * valueSize), counts.get (),
429458 starts.get (), numDimensions);
459+ sentMessageIds.insert (intermediateResult.begin (), intermediateResult.end ());
430460 }
461+
462+ return sentMessageIds;
431463}
432464
433465void FesapiHdfProxy::readArrayNdOfDoubleValues (
0 commit comments