X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fbluesky.h;h=205da746ca65a5f15968aab95d2ce6ec0a73e352;hb=a8a9f2181e2e16d24d812ea1e7a7c8af42f0d2f1;hp=9543d9c2edce66a49fea216886e1eeba1fb90b07;hpb=810fdc7bdf0cd13aaa7c88d3c5af5aae24e77254;p=bluesky.git diff --git a/bluesky/bluesky.h b/bluesky/bluesky.h index 9543d9c..205da74 100644 --- a/bluesky/bluesky.h +++ b/bluesky/bluesky.h @@ -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); @@ -96,6 +106,12 @@ 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); @@ -130,6 +146,7 @@ typedef struct { 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 @@ -142,7 +159,9 @@ 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; @@ -214,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; @@ -266,8 +288,8 @@ 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); @@ -300,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,