X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fstore-s3.c;h=94594425846a1484b6217ddbe08961bc8379e47a;hb=8ff0fd08d6e1cc97cdb7e94b7cd97dc28c29e674;hp=e762ebda090df5324c4bc867f5ede15f884afc0e;hpb=cd654b732384d42784fb995ac94940a57223ab32;p=bluesky.git diff --git a/bluesky/store-s3.c b/bluesky/store-s3.c index e762ebd..9459442 100644 --- a/bluesky/store-s3.c +++ b/bluesky/store-s3.c @@ -3,7 +3,29 @@ * Copyright (C) 2009 The Regents of the University of California * Written by Michael Vrable * - * TODO: Licensing + * 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. */ #include @@ -42,6 +64,7 @@ struct put_info { struct list_info { int success; char *last_entry; + gboolean truncated; }; static S3Status s3store_get_handler(int bufferSize, const char *buffer, @@ -101,8 +124,9 @@ static void s3store_task(gpointer a, gpointer s) handler.responseHandler.completeCallback = s3store_response_callback; handler.getObjectDataCallback = s3store_get_handler; - S3_get_object(&store->bucket, async->key, NULL, 0, 0, NULL, - &handler, &info); + S3_get_object(&store->bucket, async->key, NULL, + async->start, async->len, NULL, &handler, &info); + async->range_done = TRUE; if (info.success) { async->data = bluesky_string_new_from_gstring(info.buf); @@ -113,6 +137,7 @@ static void s3store_task(gpointer a, gpointer s) } else if (async->op == STORE_OP_PUT) { struct put_info info; + info.success = 0; info.val = async->data; info.offset = 0; @@ -125,7 +150,11 @@ static void s3store_task(gpointer a, gpointer s) S3_put_object(&store->bucket, async->key, async->data->len, NULL, NULL, &handler, &info); - async->result = 0; + if (info.success) { + async->result = 0; + } else { + g_warning("Error completing S3 put operation; client must retry!"); + } } bluesky_store_async_mark_complete(async); @@ -145,13 +174,14 @@ static S3Status s3store_list_handler(int isTruncated, g_free(info->last_entry); info->last_entry = g_strdup(contents[contentsCount - 1].key); } + info->truncated = isTruncated; return S3StatusOK; } static char *s3store_lookup_last(gpointer s, const char *prefix) { S3Store *store = (S3Store *)s; - struct list_info info = {0, NULL}; + struct list_info info = {0, NULL, FALSE}; struct S3ListBucketHandler handler; handler.responseHandler.propertiesCallback @@ -161,11 +191,17 @@ static char *s3store_lookup_last(gpointer s, const char *prefix) char *marker = NULL; - S3_list_bucket(&store->bucket, prefix, marker, NULL, 1024, NULL, &handler, &info); + do { + S3_list_bucket(&store->bucket, prefix, marker, NULL, 1024, NULL, + &handler, &info); + g_free(marker); + marker = g_strdup(info.last_entry); + g_print("Last key: %s\n", info.last_entry); + } while (info.truncated); - g_print("Last key: %s\n", info.last_entry); + g_free(marker); - return S3StatusOK; + return info.last_entry; } static gpointer s3store_new(const gchar *path) @@ -173,9 +209,12 @@ static gpointer s3store_new(const gchar *path) S3Store *store = g_new(S3Store, 1); store->thread_pool = g_thread_pool_new(s3store_task, store, -1, FALSE, NULL); - store->bucket.bucketName = "mvrable-bluesky"; + if (path == NULL || strlen(path) == 0) + store->bucket.bucketName = "mvrable-bluesky"; + else + store->bucket.bucketName = g_strdup(path); store->bucket.protocol = S3ProtocolHTTP; - store->bucket.uriStyle = S3UriStylePath; + store->bucket.uriStyle = S3UriStyleVirtualHost; store->bucket.accessKeyId = getenv("AWS_ACCESS_KEY_ID"); store->bucket.secretAccessKey = getenv("AWS_SECRET_ACCESS_KEY"); @@ -239,6 +278,6 @@ static BlueSkyStoreImplementation store_impl = { void bluesky_store_init_s3(void) { - S3_initialize(NULL, S3_INIT_ALL); + S3_initialize(NULL, S3_INIT_ALL, NULL); bluesky_store_register(&store_impl, "s3"); }