|
25 | 25 | #include "ds3_utils.h" |
26 | 26 | #include "test.h" |
27 | 27 |
|
28 | | -namespace utf = boost::unit_test; |
29 | | - |
30 | | -bool check_ds3_test_directory_given() { |
31 | | - return getenv("DS3_TEST_DIRECTORY") != NULL; |
32 | | -}; |
33 | | - |
| 28 | +/* |
34 | 29 | BOOST_AUTO_TEST_CASE( put_directory) { |
35 | | - //* boost::unit_test::precondition(check_ds3_test_directory_given)) { |
36 | 30 | printf("-----Testing PUT all objects in a directory-------\n"); |
37 | 31 |
|
38 | 32 | const char* dir_path = getenv("DS3_TEST_DIRECTORY"); |
39 | | - BOOST_CHECK(dir_path != NULL); |
| 33 | + if (dir_path == NULL) { |
| 34 | + printf("ENV[DS3_TEST_DIRECTORY] unset - Skipping put_directory test.\n"); |
| 35 | + return; |
| 36 | + } |
40 | 37 |
|
41 | 38 | const char* bucket_name = "test_bulk_put_directory"; |
42 | 39 | printf(" Putting all files in [%s] to bucket [%s]\n", dir_path, bucket_name); |
@@ -92,4 +89,76 @@ BOOST_AUTO_TEST_CASE( put_directory) { |
92 | 89 | clear_bucket(client, bucket_name); |
93 | 90 | free_client(client); |
94 | 91 | } |
| 92 | +*/ |
| 93 | + |
| 94 | +BOOST_AUTO_TEST_CASE( put_directory_4_threads) { |
| 95 | + printf("-----Testing PUT all objects in a directory with 4 threads-------\n"); |
| 96 | + |
| 97 | + const char* dir_path = getenv("DS3_TEST_DIRECTORY"); |
| 98 | + if (dir_path == NULL) { |
| 99 | + printf("ENV[DS3_TEST_DIRECTORY] unset - Skipping put_directory test.\n"); |
| 100 | + return; |
| 101 | + } |
| 102 | + |
| 103 | + const char* bucket_name = "test_bulk_put_directory"; |
| 104 | + printf(" Putting all files in [%s] to bucket [%s]\n", dir_path, bucket_name); |
| 105 | + |
| 106 | + ds3_client* client = get_client(); |
| 107 | + int client_thread=1; |
| 108 | + ds3_client_register_logging(client, DS3_DEBUG, test_log, (void*)&client_thread); // Use DEBUG level logging |
| 109 | + |
| 110 | + ds3_error* error = create_bucket_with_data_policy(client, bucket_name, ids.data_policy_id->value); |
| 111 | + |
| 112 | + char* objects_list[100]; |
| 113 | + uint64_t num_objs = 0; |
| 114 | + GDir* dir_info = g_dir_open(dir_path, 0, NULL); |
| 115 | + for (char* current_obj = (char*)g_dir_read_name(dir_info); current_obj != NULL; current_obj = (char*)g_dir_read_name(dir_info)) { |
| 116 | + objects_list[num_objs++] = current_obj; |
| 117 | + printf(" obj[%" PRIu64 "][%s]\n", num_objs, objects_list[num_objs-1]); |
| 118 | + } |
| 119 | + |
| 120 | + ds3_bulk_object_list_response* bulk_object_list = ds3_convert_file_list_with_basepath((const char**)objects_list, num_objs, dir_path); |
| 121 | + |
| 122 | + ds3_request* request = ds3_init_put_bulk_job_spectra_s3_request(bucket_name, bulk_object_list); |
| 123 | + ds3_master_object_list_response* mol; |
| 124 | + error = ds3_put_bulk_job_spectra_s3_request(client, request, &mol); |
| 125 | + ds3_request_free(request); |
| 126 | + ds3_bulk_object_list_response_free(bulk_object_list); |
| 127 | + handle_error(error); |
| 128 | + |
| 129 | + // Allocate cache |
| 130 | + ds3_master_object_list_response* chunks_list = ensure_available_chunks(client, mol->job_id); |
| 131 | + |
| 132 | + // Use helper functions from test.cpp |
| 133 | + const uint8_t num_threads = 4; |
| 134 | + GPtrArray* put_dir_args = new_put_chunks_threads_args(client, NULL, dir_path, bucket_name, mol, chunks_list, num_threads, True); // Last param indicates verbose logging in the spawned thread |
| 135 | + |
| 136 | + |
| 137 | + // capture test start time |
| 138 | + struct timespec start_time_t, end_time_t; |
| 139 | + double elapsed_t; |
| 140 | + clock_gettime(CLOCK_MONOTONIC, &start_time_t); |
95 | 141 |
|
| 142 | + GThread* put_dir_xfer_thread_0 = g_thread_new("put_dir_xfer_thread_1", (GThreadFunc)put_chunks_from_file, g_ptr_array_index(put_dir_args, 0)); |
| 143 | + GThread* put_dir_xfer_thread_1 = g_thread_new("put_dir_xfer_thread_2", (GThreadFunc)put_chunks_from_file, g_ptr_array_index(put_dir_args, 1)); |
| 144 | + GThread* put_dir_xfer_thread_2 = g_thread_new("put_dir_xfer_thread_3", (GThreadFunc)put_chunks_from_file, g_ptr_array_index(put_dir_args, 2)); |
| 145 | + GThread* put_dir_xfer_thread_3 = g_thread_new("put_dir_xfer_thread_4", (GThreadFunc)put_chunks_from_file, g_ptr_array_index(put_dir_args, 3)); |
| 146 | + |
| 147 | + // Block and cleanup GThread(s) |
| 148 | + g_thread_join(put_dir_xfer_thread_0); |
| 149 | + g_thread_join(put_dir_xfer_thread_1); |
| 150 | + g_thread_join(put_dir_xfer_thread_2); |
| 151 | + g_thread_join(put_dir_xfer_thread_3); |
| 152 | + |
| 153 | + // find elapsed CPU and real time |
| 154 | + clock_gettime(CLOCK_MONOTONIC, &end_time_t); |
| 155 | + elapsed_t = timespec_to_seconds(&end_time_t) - timespec_to_seconds(&start_time_t); |
| 156 | + ds3_log_message(client->log, DS3_INFO, " Elapsed time[%f]", elapsed_t); |
| 157 | + |
| 158 | + g_dir_close(dir_info); |
| 159 | + ds3_master_object_list_response_free(chunks_list); |
| 160 | + ds3_master_object_list_response_free(mol); |
| 161 | + put_chunks_threads_args_free(put_dir_args); |
| 162 | + clear_bucket(client, bucket_name); |
| 163 | + free_client(client); |
| 164 | +} |
0 commit comments