Add proper per-file copyright notices/licenses and top-level license.
[bluesky.git] / cloudbench / readbench.c
index 8961eb8..d7cffad 100644 (file)
@@ -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 <mvrable@cs.ucsd.edu>
+ *
+ * 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,7 +284,7 @@ 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;
@@ -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);