@@ -301,7 +301,6 @@ BOOST_AUTO_TEST_CASE( sequential_vs_parallel_xfer ) {
301301 const char * sequential_bucket_name = " test_bulk_put_sequential" ;
302302 const char * obj_name = " resources/ulysses_46mb.txt" ;
303303
304- long start_time, end_time, elapsed_sequential, elapsed_parallel;
305304 struct timespec start_time_t , end_time_t ;
306305 double elapsed_sequential_t , elapsed_parallel_t ;
307306
@@ -324,7 +323,6 @@ BOOST_AUTO_TEST_CASE( sequential_vs_parallel_xfer ) {
324323 GPtrArray* put_sequential_objs_threads_array = new_put_chunks_threads_args (client, obj_name, sequential_bucket_name, mol, sequential_chunks, 1 , False);
325324
326325 // capture sequential test start time
327- start_time = clock ();
328326 clock_gettime (CLOCK_MONOTONIC, &start_time_t );
329327
330328 GThread* xfer_sequential_thread = g_thread_new (" sequential_objs_xfer" , (GThreadFunc)put_chunks, g_ptr_array_index (put_sequential_objs_threads_array, 0 ));
@@ -333,10 +331,7 @@ BOOST_AUTO_TEST_CASE( sequential_vs_parallel_xfer ) {
333331 g_thread_join (xfer_sequential_thread);
334332
335333 // find elapsed CPU and real time
336- end_time = clock ();
337334 clock_gettime (CLOCK_MONOTONIC, &end_time_t );
338- elapsed_sequential = (end_time - start_time) / CLOCKS_PER_SEC;
339- printf (" Sequential CPU time[%ld]\n " , elapsed_sequential);
340335 elapsed_sequential_t = _timespec_to_seconds (&end_time_t ) - _timespec_to_seconds (&start_time_t );
341336 printf (" Sequential elapsed time[%f]\n " , elapsed_sequential_t );
342337
@@ -362,7 +357,6 @@ BOOST_AUTO_TEST_CASE( sequential_vs_parallel_xfer ) {
362357 GPtrArray* put_parallel_objs_threads_array = new_put_chunks_threads_args (client, obj_name, parallel_bucket_name, mol, parallel_chunks, 4 , False);
363358
364359 // capture sequential test start time
365- start_time = clock ();
366360 clock_gettime (CLOCK_MONOTONIC, &start_time_t );
367361
368362 GThread* xfer_parallel_thread_0 = g_thread_new (" parallel_objs_xfer" , (GThreadFunc)put_chunks, g_ptr_array_index (put_parallel_objs_threads_array, 0 ));
@@ -377,10 +371,7 @@ BOOST_AUTO_TEST_CASE( sequential_vs_parallel_xfer ) {
377371 g_thread_join (xfer_parallel_thread_3);
378372
379373 // find elapsed CPU and real time
380- end_time = clock ();
381374 clock_gettime (CLOCK_MONOTONIC, &end_time_t );
382- elapsed_parallel = (end_time - start_time) / CLOCKS_PER_SEC;
383- printf (" Parallel CPU time[%ld]\n " , elapsed_parallel);
384375 elapsed_parallel_t = _timespec_to_seconds (&end_time_t ) - _timespec_to_seconds (&start_time_t );
385376 printf (" Parallel elapsed time[%f]\n " , elapsed_parallel_t );
386377
@@ -394,6 +385,73 @@ BOOST_AUTO_TEST_CASE( sequential_vs_parallel_xfer ) {
394385 free_client (client);
395386}
396387
388+ BOOST_AUTO_TEST_CASE ( multiple_client_xfer ) {
389+ printf (" -----Testing BULK_PUT of objects from 2 clients in parallel-------\n " );
390+
391+ const char * client1_bucket_name = " test_bulk_put_client1" ;
392+ const char * client2_bucket_name = " test_bulk_put_client2" ;
393+ const char * obj_name = " resources/ulysses_46mb.txt" ;
394+
395+ struct timespec start_time_t , end_time_t ;
396+ double elapsed_t ;
397+
398+ ds3_bulk_object_list_response* obj_list = create_bulk_object_list_single_file (obj_name, 100 );
399+ ds3_client* client1 = get_client ();
400+ ds3_client* client2 = get_client ();
401+ ds3_master_object_list_response* mol1 = NULL ;
402+ ds3_master_object_list_response* mol2 = NULL ;
403+ ds3_request* request = NULL ;
404+
405+ ds3_error* error = create_bucket_with_data_policy (client1, client1_bucket_name, ids.data_policy_id ->value );
406+ handle_error (error);
407+ error = create_bucket_with_data_policy (client2, client2_bucket_name, ids.data_policy_id ->value );
408+ handle_error (error);
409+
410+ request = ds3_init_put_bulk_job_spectra_s3_request (client1_bucket_name, obj_list);
411+ error = ds3_put_bulk_job_spectra_s3_request (client1, request, &mol1);
412+ ds3_request_free (request);
413+ handle_error (error);
414+ request = ds3_init_put_bulk_job_spectra_s3_request (client2_bucket_name, obj_list);
415+ error = ds3_put_bulk_job_spectra_s3_request (client2, request, &mol2);
416+ ds3_request_free (request);
417+ handle_error (error);
418+
419+ ds3_master_object_list_response* client1_chunks = ensure_available_chunks (client1, mol1->job_id );
420+ ds3_master_object_list_response* client2_chunks = ensure_available_chunks (client2, mol2->job_id );
421+
422+ GPtrArray* client1_put_objs_args = new_put_chunks_threads_args (client1, obj_name, client1_bucket_name, mol1, client1_chunks, 1 , False);
423+ GPtrArray* client2_put_objs_args = new_put_chunks_threads_args (client2, obj_name, client2_bucket_name, mol2, client2_chunks, 1 , False);
424+
425+ // capture sequential test start time
426+ clock_gettime (CLOCK_MONOTONIC, &start_time_t );
427+
428+ GThread* client1_xfer_thread = g_thread_new (" client1_objs_xfer" , (GThreadFunc)put_chunks, g_ptr_array_index (client1_put_objs_args, 0 ));
429+ GThread* client2_xfer_thread = g_thread_new (" client2_objs_xfer" , (GThreadFunc)put_chunks, g_ptr_array_index (client2_put_objs_args, 0 ));
430+
431+ // Block and cleanup GThreads
432+ g_thread_join (client1_xfer_thread);
433+ g_thread_join (client2_xfer_thread);
434+
435+ // find elapsed CPU and real time
436+ clock_gettime (CLOCK_MONOTONIC, &end_time_t );
437+ elapsed_t = _timespec_to_seconds (&end_time_t ) - _timespec_to_seconds (&start_time_t );
438+ printf (" Elapsed time[%f]\n " , elapsed_t );
439+
440+ ds3_master_object_list_response_free (client1_chunks);
441+ ds3_master_object_list_response_free (mol1);
442+ put_chunks_threads_args_free (client1_put_objs_args);
443+ clear_bucket (client1, client1_bucket_name);
444+ free_client (client1);
445+
446+ ds3_master_object_list_response_free (client2_chunks);
447+ ds3_master_object_list_response_free (mol2);
448+ put_chunks_threads_args_free (client2_put_objs_args);
449+ clear_bucket (client2, client2_bucket_name);
450+ free_client (client2);
451+
452+ ds3_bulk_object_list_response_free (obj_list);
453+ }
454+
397455BOOST_AUTO_TEST_CASE ( put_utf_object_name ) {
398456 printf (" -----Testing PUT object with UTF Characters in name-------\n " );
399457
0 commit comments