@@ -207,7 +207,8 @@ void OpenObjectMultipleRangedRead(
207207 // ! [open-object-multiple-ranged-read]
208208 // [START storage_open_object_multiple_ranged_read]
209209 namespace gcs_ex = google::cloud::storage_experimental;
210- // Helper coroutine, count lines returned by a AsyncReader
210+
211+ // Helper coroutine to count newlines returned by an AsyncReader.
211212 auto count_newlines =
212213 [](gcs_ex::AsyncReader reader,
213214 gcs_ex::AsyncToken token) -> google::cloud::future<std::uint64_t > {
@@ -294,11 +295,11 @@ void OpenObjectReadFullObject(
294295 std::cout << " The range contains " << count << " newlines\n " ;
295296}
296297
297- void OpenMultipleObjectRangedRead (
298+ void OpenMultipleObjectsRangedRead (
298299 google::cloud::storage_experimental::AsyncClient& client,
299300 std::vector<std::string> const & argv) {
300- // ! [open-multiple-object -ranged-read]
301- // [START storage_open_multiple_object_ranged_read ]
301+ // ! [open-multiple-objects -ranged-read]
302+ // [START storage_open_multiple_objects_ranged_read ]
302303 namespace gcs_ex = google::cloud::storage_experimental;
303304
304305 // Helper coroutine to count newlines returned by an AsyncReader.
@@ -315,6 +316,7 @@ void OpenMultipleObjectRangedRead(
315316 }
316317 co_return count;
317318 };
319+
318320 auto coro = [&count_newlines](
319321 gcs_ex::AsyncClient& client, std::string bucket_name,
320322 std::string object_name1, std::string object_name2,
@@ -333,15 +335,28 @@ void OpenMultipleObjectRangedRead(
333335 futures.push_back (count_newlines (std::move (reader), std::move (token)));
334336 }
335337
336- // Wait for all futures and print results
337- for (std::size_t i = 0 ; i < futures.size (); ++i) {
338- auto count = futures[i].get ();
339- std::cout << " Object " << object_names[i] << " read returned " << count
340- << " newlines\n " ;
338+ // Process futures as they become ready and print results
339+ while (!futures.empty ()) {
340+ bool progress_made = false ;
341+ for (std::size_t i = 0 ; i < futures.size (); ++i) {
342+ if (futures[i].is_ready ()) { // Check if the future is ready
343+ auto count = futures[i].get ();
344+ std::cout << " Object " << object_names[i] << " read returned "
345+ << count << " newlines\n " ;
346+ futures.erase (futures.begin () + i);
347+ object_names.erase (object_names.begin () + i);
348+ progress_made = true ;
349+ break ; // Restart the loop after modifying the vectors
350+ }
351+ }
352+ if (!progress_made) {
353+ std::this_thread::sleep_for (
354+ std::chrono::milliseconds (10 )); // Avoid busy spin
355+ }
341356 }
342357 };
343- // [END storage_open_multiple_object_ranged_read ]
344- // ! [open-multiple-object -ranged-read]
358+ // [END storage_open_multiple_objects_ranged_read ]
359+ // ! [open-multiple-objects -ranged-read]
345360 coro (client, argv.at (0 ), argv.at (1 ), argv.at (2 ), argv.at (3 )).get ();
346361}
347362
@@ -702,8 +717,7 @@ void CreateAndWriteAppendableObject(
702717 gcs_ex::BucketName (std::move (bucket_name)),
703718 std::move (object_name)))
704719 .value ();
705- std::cout << " Appendable upload started for object " << object_name
706- << " with upload id " << writer.UploadId () << " \n " ;
720+ std::cout << " Appendable upload started for object " << object_name " \n " ;
707721
708722 token = (co_await writer.Write (std::move (token),
709723 gcs_ex::WritePayload (" Some data\n " )))
@@ -726,7 +740,7 @@ void CreateAndWriteAppendableObject(
726740 std::cout << " Wrote more data.\n " ;
727741
728742 // Finalize the upload to make it a regular object.
729- co_await writer.Finalize (std::move (token))).value ();
743+ co_return ( co_await writer.Finalize (std::move (token))).value ();
730744 };
731745 // [END storage_create_and_write_appendable_object]
732746 // ! [create-and-write-appendable-object]
@@ -750,8 +764,7 @@ void PauseAndResumeAppendableUpload(
750764 auto [writer, token] = (co_await client.StartAppendableObjectUpload (
751765 gcs_ex::BucketName (bucket_name), object_name))
752766 .value ();
753- std::cout << " Appendable upload started with upload id "
754- << writer.UploadId () << " \n " ;
767+ std::cout << " Appendable upload started.\n " ;
755768 token = (co_await writer.Write (std::move (token),
756769 gcs_ex::WritePayload (" paused data\n " )))
757770 .value ();
@@ -808,8 +821,7 @@ void FinalizeAppendableObjectUpload(
808821 gcs_ex::BucketName (std::move (bucket_name)),
809822 std::move (object_name)))
810823 .value ();
811- std::cout << " Appendable upload started with upload id "
812- << writer.UploadId () << " \n " ;
824+ std::cout << " Appendable upload started. \n " ;
813825
814826 // Write some data.
815827 token =
@@ -829,10 +841,10 @@ void FinalizeAppendableObjectUpload(
829841 std::cout << " Finalized object: " << object.DebugString () << " \n " ;
830842}
831843
832- void ReadObjectTail (google::cloud::storage_experimental::AsyncClient& client,
844+ void ReadAppendableObjectTail (google::cloud::storage_experimental::AsyncClient& client,
833845 std::vector<std::string> const & argv) {
834- // ! [read-object-tail]
835- // [START storage_read_object_tail ]
846+ // ! [read-appendable- object-tail]
847+ // [START storage_read_appendable_object_tail ]
836848 namespace gcs = google::cloud::storage;
837849 namespace gcs_ex = google::cloud::storage_experimental;
838850 auto coro = [](gcs_ex::AsyncClient& client, std::string bucket_name,
@@ -872,8 +884,8 @@ void ReadObjectTail(google::cloud::storage_experimental::AsyncClient& client,
872884 co_await google::cloud::sleep_for (std::chrono::seconds (1 ));
873885 }
874886 };
875- // [END storage_read_object_tail ]
876- // ! [read-object-tail]
887+ // [END storage_read_appendable_object_tail ]
888+ // ! [read-appendable- object-tail]
877889 coro (client, argv.at (0 ), argv.at (1 )).get ();
878890}
879891
@@ -978,7 +990,7 @@ void OpenObjectMultipleRangedRead(
978990 std::cerr << " AsyncClient::Open() example requires coroutines\n " ;
979991}
980992
981- void OpenMultipleObjectRangedRead (
993+ void OpenMultipleObjectsRangedRead (
982994 google::cloud::storage_experimental::AsyncClient&,
983995 std::vector<std::string> const &) {
984996 std::cerr << " AsyncClient::Open() example requires coroutines\n " ;
@@ -1071,9 +1083,9 @@ void FinalizeAppendableObjectUpload(
10711083 " coroutines\n " ;
10721084}
10731085
1074- void ReadObjectTail (google::cloud::storage_experimental::AsyncClient&,
1086+ void ReadAppendableObjectTail (google::cloud::storage_experimental::AsyncClient&,
10751087 std::vector<std::string> const &) {
1076- std::cerr << " AsyncClient::ReadObjectTail () example requires coroutines\n " ;
1088+ std::cerr << " AsyncClient::ReadAppendableObjectTail () example requires coroutines\n " ;
10771089}
10781090
10791091void RewriteObject (google::cloud::storage_experimental::AsyncClient&,
@@ -1258,7 +1270,7 @@ void AutoRun(std::vector<std::string> const& argv) {
12581270 << std::endl;
12591271 OpenObjectMultipleRangedRead (client, {bucket_name, composed_name});
12601272
1261- std::cout << " Running the OpenMultipleObjectRangedRead () example"
1273+ std::cout << " Running the OpenMultipleObjectsRangedRead () example"
12621274 << std::endl;
12631275 auto const multi_read_o1 =
12641276 examples::MakeRandomObjectName (generator, " object-" );
@@ -1272,7 +1284,7 @@ void AutoRun(std::vector<std::string> const& argv) {
12721284 examples::MakeRandomObjectName (generator, " object-" );
12731285 InsertObject (client, {bucket_name, multi_read_o3});
12741286 scheduled_for_delete.push_back (multi_read_o3);
1275- OpenMultipleObjectRangedRead (
1287+ OpenMultipleObjectsRangedRead (
12761288 client, {bucket_name, multi_read_o1, multi_read_o2, multi_read_o3});
12771289 // The objects are already scheduled for deletion, no need to do it again.
12781290 // We also need a new object name for the next test.
@@ -1387,7 +1399,7 @@ void AutoRun(std::vector<std::string> const& argv) {
13871399 scheduled_for_delete.push_back (std::move (object_name));
13881400 object_name = examples::MakeRandomObjectName (generator, " object-" );
13891401
1390- std::cout << " Running ReadObjectTail () example" << std::endl;
1402+ std::cout << " Running ReadAppendableObjectTail () example" << std::endl;
13911403 // Create a dummy object for the tail example to read. In a real
13921404 // application another process would be writing to this object.
13931405 (void )client
@@ -1396,7 +1408,7 @@ void AutoRun(std::vector<std::string> const& argv) {
13961408 object_name, " content for tail example\n " )
13971409 .get ()
13981410 .value ();
1399- ReadObjectTail (client, {bucket_name, object_name});
1411+ ReadAppendableObjectTail (client, {bucket_name, object_name});
14001412 scheduled_for_delete.push_back (std::move (object_name));
14011413 object_name = examples::MakeRandomObjectName (generator, " object-" );
14021414 }
@@ -1481,9 +1493,9 @@ int main(int argc, char* argv[]) try {
14811493 make_entry (" open-object-multiple-ranged-read" , {},
14821494 OpenObjectMultipleRangedRead),
14831495 make_entry (" open-object-read-full-object" , {}, OpenObjectReadFullObject),
1484- make_entry (" open-multiple-object -ranged-read" ,
1496+ make_entry (" open-multiple-objects -ranged-read" ,
14851497 {" <object-name-1>" , " <object-name-2>" , " <object-name-3>" },
1486- OpenMultipleObjectRangedRead ),
1498+ OpenMultipleObjectsRangedRead ),
14871499 make_entry (" read-object" , {}, ReadObject),
14881500 make_entry (" read-all" , {}, ReadAll),
14891501 make_entry (" read-object-range" , {}, ReadObjectRange),
@@ -1512,7 +1524,7 @@ int main(int argc, char* argv[]) try {
15121524
15131525 make_entry (" rewrite-object" , {" <destination>" }, RewriteObject),
15141526 make_entry (" resume-rewrite-object" , {" <destination>" }, ResumeRewrite),
1515- make_entry (" read-object-tail" , {}, ReadObjectTail ),
1527+ make_entry (" read-appendable- object-tail" , {}, ReadAppendableObjectTail ),
15161528 {" auto" , AutoRun},
15171529 });
15181530 return example.Run (argc, argv);
0 commit comments