X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fbluesky-private.h;h=02453236f1f875817e4f5091f14ab551d545ab3b;hb=8ff0fd08d6e1cc97cdb7e94b7cd97dc28c29e674;hp=25987721d2d6dc96eddb2f946cdcd0771112f17a;hpb=0d4d52cac58c229339dee35ffbc5ba3fb5b9a7b6;p=bluesky.git diff --git a/bluesky/bluesky-private.h b/bluesky/bluesky-private.h index 2598772..0245323 100644 --- a/bluesky/bluesky-private.h +++ b/bluesky/bluesky-private.h @@ -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. */ /* Declarations internal to the BlueSky library. This header file should not @@ -14,6 +36,7 @@ #define _BLUESKY_PRIVATE_H #include "bluesky.h" +#include #ifdef __cplusplus extern "C" { @@ -24,10 +47,12 @@ extern int bluesky_verbose; /* Target cache size levels. */ extern int bluesky_watermark_low_dirty; extern int bluesky_watermark_medium_dirty; +extern int bluesky_watermark_med2_dirty; extern int bluesky_watermark_high_dirty; extern int bluesky_watermark_low_total; extern int bluesky_watermark_medium_total; +extern int bluesky_watermark_med2_total; extern int bluesky_watermark_high_total; /* TODO: Make this go away entirely. */ @@ -78,10 +103,13 @@ BlueSkyRCStr *bluesky_crypt_decrypt(BlueSkyRCStr *in, const uint8_t *key); void bluesky_crypt_block_encrypt(gchar *cloud_block, size_t len, BlueSkyCryptKeys *keys); gboolean bluesky_crypt_block_decrypt(gchar *cloud_block, size_t len, - BlueSkyCryptKeys *keys); + BlueSkyCryptKeys *keys, + gboolean allow_unauth); void bluesky_cloudlog_encrypt(GString *segment, BlueSkyCryptKeys *keys); void bluesky_cloudlog_decrypt(char *segment, size_t len, - BlueSkyCryptKeys *keys); + BlueSkyCryptKeys *keys, + BlueSkyRangeset *items, + gboolean allow_unauth); /* Storage layer. Requests can be performed asynchronously, so these objects * help keep track of operations in progress. */ @@ -116,6 +144,14 @@ struct BlueSkyStoreAsync { gchar *key; /* Key to read/write */ BlueSkyRCStr *data; /* Data read/to write */ + /* For range requests on reads: starting byte offset and length; len 0 + * implies reading to the end of the object. At completion, the backend + * should set range_done if a range read was made; if not set the entire + * object was read and the storage layer will select out just the + * appropriate bytes. */ + size_t start, len; + gboolean range_done; + int result; /* Result code; 0 for success. */ struct BlueSkyNotifierList *notifiers; gint notifier_count; @@ -129,6 +165,10 @@ struct BlueSkyStoreAsync { bluesky_time_hires exec_time; /* Time processing started on operation. */ gpointer store_private; /* For use by the storage implementation */ + + /* If storage operations should be charged to any particular profile, which + * one? */ + BlueSkyProfile *profile; }; /* Support for notification lists. These are lists of one-shot functions which @@ -182,7 +222,7 @@ void bluesky_store_add_barrier(BlueSkyStoreAsync *barrier, void bluesky_inode_start_sync(BlueSkyInode *inode); -void bluesky_block_touch(BlueSkyInode *inode, uint64_t i); +void bluesky_block_touch(BlueSkyInode *inode, uint64_t i, gboolean preserve); void bluesky_block_fetch(BlueSkyInode *inode, BlueSkyBlock *block, BlueSkyStoreAsync *barrier); void bluesky_block_flush(BlueSkyInode *inode, BlueSkyBlock *block, @@ -194,6 +234,12 @@ void bluesky_file_drop_cached(BlueSkyInode *inode); * various pieces of data (both where in the cloud and where cached locally). * */ +/* Eventually we'll want to support multiple writers. But for now, hard-code + * separate namespaces in the cloud for the proxy and the cleaner to write to. + * */ +#define BLUESKY_CLOUD_DIR_PRIMARY 0 +#define BLUESKY_CLOUD_DIR_CLEANER 1 + typedef struct { char bytes[16]; } BlueSkyCloudID; @@ -246,6 +292,10 @@ struct cloudlog_header { uint32_t size1, size2, size3; } __attribute__((packed)); +// Rough size limit for a log segment. This is not a firm limit and there are +// no absolute guarantees on the size of a log segment. +#define LOG_SEGMENT_SIZE (1 << 22) + #define JOURNAL_MAGIC "\nLog" #define CLOUDLOG_MAGIC "AgI-" #define CLOUDLOG_MAGIC_ENCRYPTED "AgI=" // CLOUDLOG_MAGIC[3] ^= 0x10 @@ -306,6 +356,16 @@ struct BlueSkyCloudLogState { GList *inode_list; GSList *writeback_list; // Items which are being serialized right now GList *pending_segments; // Segments which are being uploaded now + + int uploads_pending; // Count of uploads in progress, not completed + GMutex *uploads_pending_lock; + GCond *uploads_pending_cond; + + /* What is the most recent sequence number written by the cleaner which we + * have processed and incorporated into our own log? This gets + * incorporated into the version vector written out with our checkpoint + * records. */ + int latest_cleaner_seq_seen; }; gboolean bluesky_cloudlog_equal(gconstpointer a, gconstpointer b); @@ -323,7 +383,9 @@ void bluesky_cloudlog_sync(BlueSkyCloudLog *log); void bluesky_cloudlog_insert(BlueSkyCloudLog *log); void bluesky_cloudlog_insert_locked(BlueSkyCloudLog *log); BlueSkyCloudLog *bluesky_cloudlog_get(BlueSkyFS *fs, BlueSkyCloudID id); +void bluesky_cloudlog_prefetch(BlueSkyCloudLog *log); void bluesky_cloudlog_fetch(BlueSkyCloudLog *log); +void bluesky_cloudlog_background_fetch(BlueSkyCloudLog *item); BlueSkyCloudPointer bluesky_cloudlog_serialize(BlueSkyCloudLog *log, BlueSkyFS *fs); void bluesky_cloudlog_flush(BlueSkyFS *fs); @@ -373,10 +435,14 @@ struct BlueSkyCacheFile { gint mapcount; // References to the mmaped data const char *addr; // May be null if data is not mapped in memory size_t len; + int disk_used; BlueSkyFS *fs; BlueSkyLog *log; - gboolean fetching, ready; // Cloud data: downloading or ready for use + gboolean fetching; // Cloud data: downloading or ready for use + gboolean complete; // Complete file has been fetched from cloud int64_t atime; // Access time, for cache management + BlueSkyRangeset *items; // Locations of valid items + BlueSkyRangeset *prefetches;// Locations we have been requested to prefetch }; BlueSkyLog *bluesky_log_new(const char *log_directory); @@ -385,20 +451,25 @@ void bluesky_log_finish_all(GList *log_items); BlueSkyCloudLog *bluesky_log_get_commit_point(BlueSkyFS *fs); void bluesky_log_write_commit_point(BlueSkyFS *fs, BlueSkyCloudLog *marker); -BlueSkyRCStr *bluesky_log_map_object(BlueSkyFS *fs, int log_dir, int log_seq, - int log_offset, int log_size); +BlueSkyRCStr *bluesky_cachefile_map_raw(BlueSkyCacheFile *cachefile, + off_t offset, size_t size); +BlueSkyRCStr *bluesky_log_map_object(BlueSkyCloudLog *item, gboolean map_data); void bluesky_mmap_unref(BlueSkyCacheFile *mmap); void bluesky_cachefile_unref(BlueSkyCacheFile *cachefile); BlueSkyCacheFile *bluesky_cachefile_lookup(BlueSkyFS *fs, - int clouddir, int log_seq); + int clouddir, int log_seq, + gboolean start_fetch); void bluesky_cachefile_gc(BlueSkyFS *fs); void bluesky_replay(BlueSkyFS *fs); /* Used to track log segments that are being written to the cloud. */ typedef struct { - BlueSkyRCStr *data; + BlueSkyFS *fs; + char *key; /* File name for log segment in backend */ + GString *raw_data; /* Data before encryption */ + BlueSkyRCStr *data; /* Data after encryption */ GSList *items; GMutex *lock; GCond *cond; @@ -440,6 +511,10 @@ void bluesky_inode_map_minimize(BlueSkyFS *fs); gboolean bluesky_checkpoint_load(BlueSkyFS *fs); +/* Merging of log state with the work of the cleaner. */ +void bluesky_cleaner_merge(BlueSkyFS *fs); +void bluesky_cleaner_thread_launch(BlueSkyFS *fs); + #ifdef __cplusplus } #endif