Skip to content

Commit cdc2992

Browse files
author
DenverM80
committed
add put_directory test with 4 threads
1 parent 5cafcef commit cdc2992

File tree

1 file changed

+77
-8
lines changed

1 file changed

+77
-8
lines changed

test/put_directory.cpp

Lines changed: 77 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,15 @@
2525
#include "ds3_utils.h"
2626
#include "test.h"
2727

28-
namespace utf = boost::unit_test;
29-
30-
bool check_ds3_test_directory_given() {
31-
return getenv("DS3_TEST_DIRECTORY") != NULL;
32-
};
33-
28+
/*
3429
BOOST_AUTO_TEST_CASE( put_directory) {
35-
//* boost::unit_test::precondition(check_ds3_test_directory_given)) {
3630
printf("-----Testing PUT all objects in a directory-------\n");
3731
3832
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+
}
4037
4138
const char* bucket_name = "test_bulk_put_directory";
4239
printf(" Putting all files in [%s] to bucket [%s]\n", dir_path, bucket_name);
@@ -92,4 +89,76 @@ BOOST_AUTO_TEST_CASE( put_directory) {
9289
clear_bucket(client, bucket_name);
9390
free_client(client);
9491
}
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);
95141

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

Comments
 (0)