X-Git-Url: http://git.vrable.net/?p=bluesky.git;a=blobdiff_plain;f=cloudbench%2Freadbench.c;h=d7cffaddac14ad8051edea613dbf7ed5de3e230c;hp=277e1f35200a299bbe0dd284bfb07e766de8c601;hb=HEAD;hpb=4a16bafc74f36e1314a722544612ad7ac6a6cd05 diff --git a/cloudbench/readbench.c b/cloudbench/readbench.c index 277e1f3..d7cffad 100644 --- a/cloudbench/readbench.c +++ b/cloudbench/readbench.c @@ -1,3 +1,33 @@ +/* Blue Sky: File Systems in the Cloud + * + * Copyright (C) 2010 The Regents of the University of California + * Written by Michael Vrable + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + /* Simple benchmark for Amazon S3: measures download speeds for * differently-sized objects and with a variable number of parallel * connections. */ @@ -43,6 +73,7 @@ struct callback_state { struct thread_state threads[MAX_THREADS]; int experiment_threads, experiment_size, experiment_objects; +int range_size = 0; pthread_mutex_t barrier_mutex; pthread_cond_t barrier_cond; @@ -91,7 +122,8 @@ static void complete_callback(S3Status status, { } -static void do_get(const char *key, size_t bytes, struct thread_state *ts) +static void do_get(const char *key, size_t bytes, struct thread_state *ts, + size_t offset) { struct callback_state state; struct S3GetObjectHandler handler; @@ -102,7 +134,7 @@ static void do_get(const char *key, size_t bytes, struct thread_state *ts) handler.responseHandler.completeCallback = complete_callback; handler.getObjectDataCallback = data_callback; - S3_get_object(&bucket, key, NULL, 0, 0, NULL, &handler, &state); + S3_get_object(&bucket, key, NULL, offset, range_size, NULL, &handler, &state); } void *benchmark_thread(void *arg) @@ -120,9 +152,13 @@ void *benchmark_thread(void *arg) ts->timestamp = get_ns(); while (test_phase != TERMINATE) { int object = random() % experiment_objects; + int offset = 0; sprintf(namebuf, "file-%d-%d", experiment_size, object); + if (range_size) { + offset = (random() % (experiment_size / range_size)) * range_size; + } ts->first_byte_timestamp = 0; - do_get(namebuf, experiment_size, ts); + do_get(namebuf, experiment_size, ts, offset); long long timestamp = get_ns(); long long elapsed = timestamp - ts->timestamp; @@ -136,7 +172,7 @@ void *benchmark_thread(void *arg) ts->sum_x += e; ts->sum_x2 += e * e; ts->sum_f += f; - ts->bytes_sent += experiment_size; + ts->bytes_sent += range_size ? range_size : experiment_size; } i++; @@ -223,8 +259,8 @@ void launch_test(int thread_count) } double elapsed = (get_ns() - start_time) / 1e9; - printf("*** %d threads, %d byte objects\n", - experiment_threads, experiment_size); + printf("*** %d threads, %d byte objects, %d byte ranges\n", + experiment_threads, experiment_size, range_size); printf("Elapsed: %f s\n", elapsed); printf("Data points: %d\n", n); double mx = sum_x / n; @@ -248,11 +284,11 @@ int main(int argc, char *argv[]) return 1; } - S3_initialize(NULL, S3_INIT_ALL); + S3_initialize(NULL, S3_INIT_ALL, NULL); bucket.bucketName = "mvrable-benchmark"; bucket.protocol = S3ProtocolHTTP; - bucket.uriStyle = S3UriStylePath; + bucket.uriStyle = S3UriStyleVirtualHost; bucket.accessKeyId = getenv("AWS_ACCESS_KEY_ID"); bucket.secretAccessKey = getenv("AWS_SECRET_ACCESS_KEY"); @@ -267,6 +303,9 @@ int main(int argc, char *argv[]) experiment_threads = atoi(argv[1]); experiment_size = atoi(argv[2]); experiment_objects = atoi(argv[3]); + if (argc > 4) { + range_size = atoi(argv[4]); + } assert(experiment_objects > 0); launch_test(experiment_threads);