Rework caching of data blocks to eliminate double-caching.
[bluesky.git] / bluesky / bluesky.h
index f72c6d0..e9e40d8 100644 (file)
@@ -63,16 +63,20 @@ 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. */
+struct _BlueSkyMmap;
+typedef struct _BlueSkyMmap 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);
@@ -99,6 +103,9 @@ 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);
@@ -217,8 +224,8 @@ typedef struct {
     /* Last access time to this inode, for controlling cache evictions. */
     int64_t access_time;
 
-    /* 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
@@ -265,15 +272,14 @@ typedef struct {
 #define BLUESKY_MAX_FILE_SIZE (BLUESKY_BLOCK_SIZE << 24)
 typedef enum {
     BLUESKY_BLOCK_ZERO = 0,     /* Data is all zeroes, not explicitly stored */
-    BLUESKY_BLOCK_REF = 1,      /* Reference to key/value store, not cached */
-    BLUESKY_BLOCK_CACHED = 2,   /* Data is cached in memory, clean */
-    BLUESKY_BLOCK_DIRTY = 3,    /* Data needs to be committed to store */
+    BLUESKY_BLOCK_REF = 1,      /* Reference to cloud log item, data clean */
+    BLUESKY_BLOCK_DIRTY = 2,    /* Data needs to be committed to store */
 } BlueSkyBlockType;
 
 typedef struct {
     BlueSkyBlockType type;
-    gchar *ref;                 /* Name of data block in the backing store */
-    BlueSkyRCStr *data;         /* Pointer to data in memory if cached */
+    BlueSkyCloudLog *ref;       /* if REF: cloud log entry with data */
+    BlueSkyRCStr *dirty;        /* if DIRTY: raw data in memory */
 } BlueSkyBlock;
 
 BlueSkyFS *bluesky_init_fs(gchar *name, BlueSkyStore *store);
@@ -306,7 +312,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,