| 37 | } // namespace |
| 38 | |
| 39 | int main(int argc, char* argv[]) try { |
| 40 | auto vm = parse_command_line(argc, argv); |
| 41 | auto const bucket = vm["bucket"].as<std::string>(); |
| 42 | auto const object = vm["object"].as<std::string>(); |
| 43 | auto const source = vm["source"].as<std::string>(); |
| 44 | |
| 45 | auto client = gcs::Client::CreateDefaultClient().value(); |
| 46 | |
| 47 | std::cout << "Uploading " << source << " to bucket " << bucket |
| 48 | << " as object " << object << " ..." << std::flush; |
| 49 | |
| 50 | auto const start = std::chrono::steady_clock::now(); |
| 51 | auto const scratch_prefix = |
| 52 | boost::uuids::to_string(boost::uuids::random_generator_mt19937{}()); |
| 53 | auto metadata = |
| 54 | gcs::ParallelUploadFile( |
| 55 | client, source, bucket, object, scratch_prefix, true, |
| 56 | gcs::MaxStreams(vm["max-streams"].as<int>()), |
| 57 | gcs::MinStreamSize(vm["minimum-stream-size"].as<std::int64_t>())) |
| 58 | .value(); |
| 59 | auto const end = std::chrono::steady_clock::now(); |
| 60 | |
| 61 | std::cout << "DONE" |
| 62 | << "\n"; |
| 63 | std::cout << "The upload was successful, the object size is approximately " |
| 64 | << format_size(metadata.size()) << "\n"; |
| 65 | |
| 66 | auto const elapsed_us = |
| 67 | std::chrono::duration_cast<std::chrono::microseconds>(end - start); |
| 68 | auto const elapsed_ms = |
| 69 | std::chrono::duration_cast<std::chrono::milliseconds>(end - start); |
| 70 | auto const effective_bandwidth_MiBs = |
| 71 | (static_cast<double>(metadata.size()) / kMiB) / |
| 72 | (elapsed_us.count() / 1'000'000.0); |
| 73 | std::cout << "Upload completed in " << elapsed_ms.count() << "ms\n" |
| 74 | << "Effective bandwidth " << effective_bandwidth_MiBs << " MiB/s\n"; |
| 75 | |
| 76 | auto [size, crc32c] = file_info(source); |
| 77 | if (size != metadata.size()) { |
| 78 | std::cout << "Uploaded file size mismatch, expected=" << metadata.size() |
| 79 | << ", got=" << size << std::endl; |
| 80 | return 1; |
| 81 | } |
| 82 | |
| 83 | if (crc32c != metadata.crc32c()) { |
| 84 | std::cout << "Download file CRC32C mismatch, expected=" << metadata.crc32c() |
| 85 | << ", got=" << crc32c << std::endl; |
| 86 | return 1; |
| 87 | } |
| 88 | |
| 89 | std::cout << "File size and CRC32C match expected values" << std::endl; |
| 90 | |
| 91 | return 0; |
| 92 | } catch (std::exception const& ex) { |
| 93 | std::cerr << "Standard C++ exception thrown: " << ex.what() << std::endl; |
| 94 | return 1; |
| 95 | } catch (...) { |
| 96 | std::cerr << "Unknown C++ exception thrown" << std::endl; |
nothing calls this directly
no test coverage detected