1 /* Blue Sky: File Systems in the Cloud
3 * Copyright (C) 2009 The Regents of the University of California
4 * Written by Michael Vrable <mvrable@cs.ucsd.edu>
16 #include "bluesky-private.h"
19 /* A storage layer that writes to Berkeley DB locally. */
24 GAsyncQueue *operations;
27 static gpointer bdbstore_thread(gpointer data)
29 BDBStore *store = (BDBStore *)data;
33 BlueSkyStoreAsync *async;
35 async = (BlueSkyStoreAsync *)g_async_queue_pop(store->operations);
36 async->status = ASYNC_RUNNING;
37 async->exec_time = bluesky_now_hires();
40 memset(&key, 0, sizeof(key));
42 key.data = async->key;
43 key.size = strlen(async->key);
46 memset(&value, 0, sizeof(value));
48 if (async->op == STORE_OP_GET) {
49 value.flags = DB_DBT_MALLOC;
51 res = store->db->get(store->db, NULL, &key, &value, 0);
57 fprintf(stderr, "BDB read failure: %s\n", db_strerror(res));
59 async->data = bluesky_string_new(value.data, value.size);
63 } else if (async->op == STORE_OP_PUT) {
64 value.data = async->data->data;
65 value.size = async->data->len;
67 res = store->db->put(store->db, NULL, &key, &value, 0);
70 fprintf(stderr, "BDB write failure: %s\n", db_strerror(res));
76 bluesky_store_async_mark_complete(async);
77 bluesky_store_async_unref(async);
83 static gpointer bdbstore_new(const gchar *path)
86 BDBStore *store = g_new0(BDBStore, 1);
88 res = db_env_create(&store->env, 0);
91 fprintf(stderr, "db_env_create failure: %s\n", db_strerror(res));
95 res = store->env->open(store->env, path,
96 DB_CREATE | DB_RECOVER | DB_INIT_LOCK | DB_INIT_LOG
97 | DB_INIT_MPOOL | DB_INIT_TXN | DB_THREAD,
101 fprintf(stderr, "BDB open failure: %s\n",
106 res = db_create(&store->db, store->env, 0);
109 fprintf(stderr, "DB create failed: %s\n", db_strerror(res));
113 uint32_t flags = DB_CREATE | DB_THREAD | DB_AUTO_COMMIT;
115 res = store->db->open(store->db,
124 fprintf(stderr, "DB open failed: %s\n",
128 store->operations = g_async_queue_new();
129 if (g_thread_create(bdbstore_thread, store, FALSE, NULL) == NULL) {
130 fprintf(stderr, "Creating BDB thread failed!\n");
137 static void bdbstore_destroy(gpointer s)
139 BDBStore *store = (BDBStore *)store;
142 store->db->close(store->db, 0);
146 store->env->close(store->env, 0);
152 static void bdbstore_submit(gpointer s, BlueSkyStoreAsync *async)
154 BDBStore *store = (BDBStore *)s;
155 g_return_if_fail(async->status == ASYNC_NEW);
156 g_return_if_fail(async->op != STORE_OP_NONE);
161 async->status = ASYNC_PENDING;
162 bluesky_store_async_ref(async);
163 g_async_queue_push(store->operations, async);
167 g_warning("Uknown operation type for BDBStore: %d\n", async->op);
168 bluesky_store_async_mark_complete(async);
173 static void bdbstore_cleanup(gpointer store, BlueSkyStoreAsync *async)
177 static BlueSkyStoreImplementation store_impl = {
178 .create = bdbstore_new,
179 .destroy = bdbstore_destroy,
180 .submit = bdbstore_submit,
181 .cleanup = bdbstore_cleanup,
184 void bluesky_store_init_bdb(void)
186 bluesky_store_register(&store_impl, "bdb");