Allow batched log writes when writing dirty inodes.
[bluesky.git] / bluesky / bluesky-private.h
index 320886c..039e253 100644 (file)
 extern "C" {
 #endif
 
+extern int bluesky_verbose;
+
+/* Target cache size levels. */
+extern int bluesky_watermark_low_dirty;
+extern int bluesky_watermark_medium_dirty;
+extern int bluesky_watermark_high_dirty;
+
+extern int bluesky_watermark_low_total;
+extern int bluesky_watermark_medium_total;
+extern int bluesky_watermark_high_total;
+
 /* TODO: Make this go away entirely. */
 BlueSkyFS *bluesky_new_fs(gchar *name);
 
+/* Linked list update functions for LRU lists. */
+void bluesky_list_unlink(GList *head, GList *item);
+GList *bluesky_list_prepend(GList *head, BlueSkyInode *inode);
+GList *bluesky_list_append(GList *head, BlueSkyInode *inode);
+BlueSkyInode *bluesky_list_head(GList *head);
+BlueSkyInode *bluesky_list_tail(GList *head);
+
 /* Serialization and deserialization of filesystem data for storing to
  * persistent storage. */
 void bluesky_serialize_superblock(GString *out, BlueSkyFS *fs);
@@ -47,7 +65,8 @@ typedef enum {
 } BlueSkyAsyncStatus;
 
 struct BlueSkyNotifierList;
-typedef struct {
+typedef struct _BlueSkyStoreAsync BlueSkyStoreAsync;
+struct _BlueSkyStoreAsync {
     BlueSkyStore *store;
 
     GMutex *lock;
@@ -63,11 +82,18 @@ typedef struct {
 
     int result;                 /* Result code; 0 for success. */
     struct BlueSkyNotifierList *notifiers;
+    gint notifier_count;
+
+    /* The barrier waiting on this operation.  Support for more than one
+     * barrier for a single async is not well-supported and should be avoided
+     * if possible. */
+    BlueSkyStoreAsync *barrier;
 
     bluesky_time_hires start_time;  /* Time operation was submitted. */
+    bluesky_time_hires exec_time;   /* Time processing started on operation. */
 
     gpointer store_private;     /* For use by the storage implementation */
-} BlueSkyStoreAsync;
+};
 
 /* Support for notification lists.  These are lists of one-shot functions which
  * can be called when certain events--primarily, competed storage
@@ -83,7 +109,7 @@ struct BlueSkyNotifierList {
 /* The abstraction layer for storage, allowing multiple implementations. */
 typedef struct {
     /* Create a new store instance and return a handle to it. */
-    gpointer (*create)();
+    gpointer (*create)(const gchar *path);
 
     /* Clean up any resources used by this store. */
     void (*destroy)(gpointer store);
@@ -115,11 +141,37 @@ void bluesky_store_add_barrier(BlueSkyStoreAsync *barrier,
 
 void bluesky_inode_start_sync(BlueSkyInode *inode, BlueSkyStoreAsync *barrier);
 
-void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block,
+void bluesky_block_touch(BlueSkyInode *inode, uint64_t i);
+void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block,
                          BlueSkyStoreAsync *barrier);
-void bluesky_file_flush(BlueSkyInode *inode, BlueSkyStoreAsync *barrier);
+void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block,
+                         BlueSkyStoreAsync *barrier, GList **log_items);
+void bluesky_file_flush(BlueSkyInode *inode, BlueSkyStoreAsync *barrier,
+                        GList **log_items);
 void bluesky_file_drop_cached(BlueSkyInode *inode);
 
+/* Logging infrastructure for ensuring operations are persistently recorded to
+ * disk. */
+struct _BlueSkyLog {
+    char *log_directory;
+    GAsyncQueue *queue;
+    int fd;
+    int seq_num;
+};
+
+typedef struct {
+    gboolean committed;
+    GMutex *lock;
+    GCond *cond;
+    char *key;
+    BlueSkyRCStr *data;
+} BlueSkyLogItem;
+
+BlueSkyLog *bluesky_log_new(const char *log_directory);
+BlueSkyLogItem *bluesky_log_item_new();
+void bluesky_log_item_submit(BlueSkyLogItem *item, BlueSkyLog *log);
+void bluesky_log_item_finish(BlueSkyLogItem *item);
+
 #ifdef __cplusplus
 }
 #endif