X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fbluesky.h;h=68708304d7e265fbae8e1b386c101b67f2ed6ca6;hb=8ff0fd08d6e1cc97cdb7e94b7cd97dc28c29e674;hp=54e8450186139cfe37cb062a7b078d06f33e36fb;hpb=a82b60b3b683840a7074110831bcbaa16a40f0eb;p=bluesky.git diff --git a/bluesky/bluesky.h b/bluesky/bluesky.h index 54e8450..6870830 100644 --- a/bluesky/bluesky.h +++ b/bluesky/bluesky.h @@ -3,13 +3,36 @@ * 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. */ #ifndef _BLUESKY_H #define _BLUESKY_H #include +#include #include #include @@ -19,10 +42,10 @@ extern "C" { /* Various options to tweak for performance benchmarking purposes. */ typedef struct { - /* Perform all get/put operations synchronously. */ + /* OBSOLETE: Perform all get/put operations synchronously. */ int synchronous_stores; - /* Write data in cache immediately after file is modified. */ + /* OBSOLETE: Write data in cache immediately after file is modified. */ int writethrough_cache; /* Can inodes be fetched asynchronously? (Inode object is initially @@ -36,6 +59,20 @@ typedef struct { /* Target size of the disk cache at the proxy, in kilobytes. */ int cache_size; + + /* Full segment fetches (1) or use range requests (0) for fetching segments + * from cloud? */ + int full_segment_fetches; + + /* Disable aggregating of data into log segments. Each object will be + * stored in a separate segment. */ + int disable_aggregation; + + /* Disable cryptography. This is for benchmarking purposes. */ + int disable_crypto; + + /* Disable aggregation of read requests. Fetch items individually. */ + int disable_read_aggregation; } BlueSkyOptions; extern BlueSkyOptions bluesky_options; @@ -53,6 +90,7 @@ struct bluesky_stats { struct bluesky_stats *bluesky_stats_new(const char *name); void bluesky_stats_add(struct bluesky_stats *stats, int64_t value); void bluesky_stats_dump_all(); +void bluesky_stats_run_periodic_dump(FILE *f); /* BlueSky status and error codes. Various frontends should translate these to * the appropriate error code for whatever protocol they implement. */ @@ -66,8 +104,8 @@ void bluesky_init(void); gchar *bluesky_lowercase(const gchar *s); -struct _BlueSkyCacheFile; -typedef struct _BlueSkyCacheFile BlueSkyCacheFile; +struct BlueSkyCacheFile; +typedef struct BlueSkyCacheFile BlueSkyCacheFile; typedef struct { gint refcount; @@ -85,29 +123,37 @@ void bluesky_string_unref(BlueSkyRCStr *string); BlueSkyRCStr *bluesky_string_dup(BlueSkyRCStr *string); void bluesky_string_resize(BlueSkyRCStr *string, gsize len); -/* Cryptographic operations. */ -#define CRYPTO_BLOCK_SIZE 16 /* 128-bit AES */ -#define CRYPTO_KEY_SIZE 16 - -void bluesky_crypt_init(); -void bluesky_crypt_hash_key(const char *keystr, uint8_t *out); -void bluesky_crypt_random_bytes(guchar *buf, gint len); -BlueSkyRCStr *bluesky_crypt_encrypt(BlueSkyRCStr *in, const uint8_t *key); -BlueSkyRCStr *bluesky_crypt_decrypt(BlueSkyRCStr *in, const uint8_t *key); +struct BlueSkyRangeset; +typedef struct BlueSkyRangeset BlueSkyRangeset; +typedef struct { + uint64_t start, length; + gpointer data; +} BlueSkyRangesetItem; + +BlueSkyRangeset *bluesky_rangeset_new(); +void bluesky_rangeset_free(BlueSkyRangeset *rangeset); +gboolean bluesky_rangeset_insert(BlueSkyRangeset *rangeset, + uint64_t start, uint64_t length, + gpointer data); +const BlueSkyRangesetItem *bluesky_rangeset_lookup(BlueSkyRangeset *rangeset, + uint64_t offset); +const BlueSkyRangesetItem *bluesky_rangeset_lookup_next(BlueSkyRangeset *rangeset, uint64_t offset); +void bluesky_rangeset_get_extents(BlueSkyRangeset *rangeset, + uint64_t *start, uint64_t *length); /* Storage interface. This presents a key-value store abstraction, and can * have multiple implementations: in-memory, on-disk, in-cloud. */ -struct _BlueSkyStore; -typedef struct _BlueSkyStore BlueSkyStore; +struct BlueSkyStore; +typedef struct BlueSkyStore BlueSkyStore; -struct _BlueSkyLog; -typedef struct _BlueSkyLog BlueSkyLog; +struct BlueSkyLog; +typedef struct BlueSkyLog BlueSkyLog; -struct _BlueSkyCloudLogState; -typedef struct _BlueSkyCloudLogState BlueSkyCloudLogState; +struct BlueSkyCloudLogState; +typedef struct BlueSkyCloudLogState BlueSkyCloudLogState; -struct _BlueSkyCloudLog; -typedef struct _BlueSkyCloudLog BlueSkyCloudLog; +struct BlueSkyCloudLog; +typedef struct BlueSkyCloudLog BlueSkyCloudLog; void bluesky_store_init(); BlueSkyStore *bluesky_store_new(const gchar *type); @@ -134,6 +180,8 @@ typedef enum { /* Filesystem state. Each filesystem which is exported is represented by a * single bluesky_fs structure in memory. */ +struct BlueSkyCryptKeys; + typedef struct { GMutex *lock; @@ -145,6 +193,10 @@ typedef struct { BlueSkyLog *log; BlueSkyCloudLogState *log_state; + /* Filesystem crypto keys */ + char *master_key; + struct BlueSkyCryptKeys *keys; + /* Accounting for memory used for caches. Space is measured in blocks, not * bytes. Updates to these variables must be made atomically. */ gint cache_dirty; @@ -182,6 +234,12 @@ typedef struct { /* The inode map, which maps inode numbers to the location of the most * recent version. */ GSequence *inode_map; + + /* Queue for asynchronous cloudlog unrefs, where needed. */ + GAsyncQueue *unref_queue; + + /* Thread pool for asynchronous inode fetches */ + GThreadPool *inode_fetch_thread_pool; } BlueSkyFS; /* Inode number of the root directory. */ @@ -269,6 +327,9 @@ typedef struct { /* Symlink-specific fields */ gchar *symlink_contents; + + /* A field for short-term use internally while the lock is held. */ + gpointer private_data; } BlueSkyInode; /* A directory entry. The name is UTF-8 and is a freshly-allocated string. @@ -301,8 +362,8 @@ typedef struct { BlueSkyRCStr *dirty; /* if DIRTY: raw data in memory */ } BlueSkyBlock; -BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store); -void bluesky_superblock_flush(BlueSkyFS *fs); +BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store, + const gchar *master_key); gboolean bluesky_inode_is_ready(BlueSkyInode *inode); @@ -332,6 +393,7 @@ void bluesky_file_read(BlueSkyInode *inode, uint64_t offset, char *buf, gint len); void bluesky_inode_fetch(BlueSkyFS *fs, uint64_t inum); +void bluesky_inode_prefetch(BlueSkyFS *fs, uint64_t inum); gint bluesky_dirent_compare(gconstpointer a, gconstpointer b, gpointer unused); @@ -343,6 +405,22 @@ void bluesky_flushd_thread_launch(BlueSkyFS *fs); void bluesky_debug_dump(BlueSkyFS *fs); +/* Request response time tracking. */ +typedef struct BlueSkyProfile { + int magic; + GMutex *lock; + char *description; + GList *events; +} BlueSkyProfile; + +BlueSkyProfile *bluesky_profile_new(); +void bluesky_profile_free(BlueSkyProfile *profile); +void bluesky_profile_add_event(BlueSkyProfile *profile, char *message); +void bluesky_profile_print(BlueSkyProfile *profile); +BlueSkyProfile *bluesky_profile_get(); +void bluesky_profile_set(BlueSkyProfile *profile); +void bluesky_profile_set_output(FILE *stream); + #ifdef __cplusplus } #endif