Work to allow mmap-ed log entries to be used for data blocks.
[bluesky.git] / bluesky / bluesky.h
index ff2bf23..205da74 100644 (file)
@@ -64,15 +64,25 @@ void bluesky_init(void);
 gchar *bluesky_lowercase(const gchar *s);
 
 /* Reference-counted blocks of memory, used for passing data in and out of
- * storage backends and in other places. */
+ * storage backends and in other places.  This may also refer to read-only
+ * mmaped data. */
 typedef struct {
     gint refcount;
+    const char *addr;
+    size_t len;
+} BlueSkyMmap;
+
+typedef struct {
+    gint refcount;
+    BlueSkyMmap *mmap;
     gchar *data;
     gsize len;
 } BlueSkyRCStr;
 
 BlueSkyRCStr *bluesky_string_new(gpointer data, gsize len);
 BlueSkyRCStr *bluesky_string_new_from_gstring(GString *s);
+BlueSkyRCStr *bluesky_string_new_from_mmap(BlueSkyMmap *mmap,
+                                           int offset, gsize len);
 void bluesky_string_ref(BlueSkyRCStr *string);
 void bluesky_string_unref(BlueSkyRCStr *string);
 BlueSkyRCStr *bluesky_string_dup(BlueSkyRCStr *string);
@@ -93,6 +103,15 @@ BlueSkyRCStr *bluesky_crypt_decrypt(BlueSkyRCStr *in, const uint8_t *key);
 struct _BlueSkyStore;
 typedef struct _BlueSkyStore BlueSkyStore;
 
+struct _BlueSkyLog;
+typedef struct _BlueSkyLog BlueSkyLog;
+
+struct _BlueSkyCloudLogState;
+typedef struct _BlueSkyCloudLogState BlueSkyCloudLogState;
+
+struct _BlueSkyCloudLog;
+typedef struct _BlueSkyCloudLog BlueSkyCloudLog;
+
 void bluesky_store_init();
 BlueSkyStore *bluesky_store_new(const gchar *type);
 void bluesky_store_free(BlueSkyStore *store);
@@ -126,6 +145,8 @@ typedef struct {
     uint64_t next_inum;         /* Next available inode for allocation */
 
     BlueSkyStore *store;
+    BlueSkyLog *log;
+    BlueSkyCloudLogState *log_state;
 
     /* Accounting for memory used for caches.  Space is measured in blocks, not
      * bytes.  We track both total data in the caches and dirty data (total
@@ -138,10 +159,16 @@ typedef struct {
      * avoid deadlock do not attempt to take any other locks while the FS lock
      * is held for list editing purposes.  Items at the head of the list are
      * most recently accessed/modified. */
-    GList dirty_list, accessed_list;
+    GList unlogged_list;        // Changes not yet synced to journal
+    GList dirty_list;           // Not yet written to cloud storage
+    GList accessed_list;        // All in-memory inodes
 
     /* Mutex for the flush daemon, to prevent concurrent execution. */
     GMutex *flushd_lock;
+
+    /* Mapping of object identifiers (blocks, inodes) to physical location (in
+     * the local cache or in the logs in the cloud). */
+    GHashTable *locations;
 } BlueSkyFS;
 
 /* Inode number of the root directory. */
@@ -191,8 +218,9 @@ typedef struct {
     /* change_count is increased with every operation which modifies the inode,
      * and can be used to determine if cached data is still valid.
      * change_commit is the value of change_count when the inode was last
-     * committed to stable storage. */
-    uint64_t change_count, change_commit;
+     * committed to stable storage (the log).
+     * change_cloud tracks which version was last commited to cloud storage. */
+    uint64_t change_count, change_commit, change_cloud;
 
     /* Timestamp for controlling when modified data is flushed to stable
      * storage.  When an inode is first modified from a clean state, this is
@@ -205,11 +233,14 @@ typedef struct {
     /* Additional state for tracking cache writeback status. */
     uint64_t change_pending;    /* change_count version currently being committed to storage */
 
+    /* Version of the object last serialized and committed to storage. */
+    BlueSkyCloudLog *committed_item;
+
     /* Pointers to the linked-list elements for this inode in the accessed and
      * dirty linked lists.  We re-use the GList structure, using ->next to
      * point to the head of the list and ->prev to point to the tail.  The data
      * element is unused. */
-    GList *accessed_list, *dirty_list;
+    GList *unlogged_list, *accessed_list, *dirty_list;
 
     int64_t atime;              /* Microseconds since the Unix epoch */
     int64_t ctime;
@@ -257,13 +288,15 @@ typedef enum {
 
 typedef struct {
     BlueSkyBlockType type;
-    gchar *ref;                 /* Name of data block in the backing store */
     BlueSkyRCStr *data;         /* Pointer to data in memory if cached */
+    BlueSkyCloudLog *cloudref;  /* Reference to cloud log entry with data */
 } BlueSkyBlock;
 
 BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store);
 void bluesky_superblock_flush(BlueSkyFS *fs);
 
+gboolean bluesky_inode_is_ready(BlueSkyInode *inode);
+
 int64_t bluesky_get_current_time();
 void bluesky_inode_update_ctime(BlueSkyInode *inode, gboolean update_mtime);
 uint64_t bluesky_fs_alloc_inode(BlueSkyFS *fs);
@@ -289,7 +322,6 @@ void bluesky_file_write(BlueSkyInode *inode, uint64_t offset,
 void bluesky_file_read(BlueSkyInode *inode, uint64_t offset,
                        char *buf, gint len);
 
-void bluesky_inode_flush(BlueSkyFS *fs, BlueSkyInode *inode);
 void bluesky_inode_fetch(BlueSkyFS *fs, uint64_t inum);
 
 gint bluesky_dirent_compare(gconstpointer a, gconstpointer b,
@@ -298,6 +330,7 @@ gint bluesky_dirent_compare(gconstpointer a, gconstpointer b,
 void bluesky_flushd_invoke(BlueSkyFS *fs);
 void bluesky_flushd_invoke_conditional(BlueSkyFS *fs);
 void bluesky_inode_do_sync(BlueSkyInode *inode);
+void bluesky_flushd_thread_launch(BlueSkyFS *fs);
 
 void bluesky_debug_dump(BlueSkyFS *fs);