Add partial journal replay to filesystem recovery.
[bluesky.git] / bluesky / bluesky-private.h
index f1f8ffc..85eb99c 100644 (file)
@@ -49,6 +49,10 @@ BlueSkyFS *bluesky_deserialize_superblock(const gchar *buf);
 BlueSkyCloudLog *bluesky_serialize_inode(BlueSkyInode *inode);
 gboolean bluesky_deserialize_inode(BlueSkyInode *inode, BlueSkyCloudLog *item);
 
+void bluesky_deserialize_cloudlog(BlueSkyCloudLog *item,
+                                  const char *data,
+                                  size_t len);
+
 void bluesky_serialize_cloudlog(BlueSkyCloudLog *log,
                                 GString *encrypted,
                                 GString *authenticated,
@@ -127,11 +131,16 @@ typedef struct {
 
     /* Clean up any implementation-private data in a BlueSkyStoreAsync. */
     void (*cleanup)(gpointer store, BlueSkyStoreAsync *async);
+
+    /* Find the lexicographically-largest file starting with the specified
+     * prefix. */
+    char * (*lookup_last)(gpointer store, const gchar *prefix);
 } BlueSkyStoreImplementation;
 
 void bluesky_store_register(const BlueSkyStoreImplementation *impl,
                             const gchar *name);
 
+char *bluesky_store_lookup_last(BlueSkyStore *store, const char *prefix);
 BlueSkyStoreAsync *bluesky_store_async_new(BlueSkyStore *store);
 gpointer bluesky_store_async_get_handle(BlueSkyStoreAsync *async);
 void bluesky_store_async_ref(BlueSkyStoreAsync *async);
@@ -178,7 +187,11 @@ typedef enum {
     LOGTYPE_INODE = 2,
     LOGTYPE_INODE_MAP = 3,
     LOGTYPE_CHECKPOINT = 4,
-    LOGTYPE_CHECKPOINT_PTR = 5,
+
+    /* Used only as metadata in the local journal, not loaded as a
+     * BlueSkyCloudLogState nor stored in the cloud */
+    LOGTYPE_JOURNAL_MARKER = 16,
+    LOGTYPE_JOURNAL_CHECKPOINT = 17,
 } BlueSkyCloudLogType;
 
 /* Headers that go on items in local log segments and cloud log segments. */
@@ -202,6 +215,7 @@ struct cloudlog_header {
     char magic[4];
     uint8_t type;
     BlueSkyCloudID id;
+    uint64_t inum;
     uint32_t size1, size2, size3;
 } __attribute__((packed));
 
@@ -335,6 +349,9 @@ struct _BlueSkyCacheFile {
 BlueSkyLog *bluesky_log_new(const char *log_directory);
 void bluesky_log_item_submit(BlueSkyCloudLog *item, BlueSkyLog *log);
 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);
 void bluesky_mmap_unref(BlueSkyCacheFile *mmap);
@@ -392,6 +409,8 @@ InodeMapEntry *bluesky_inode_map_lookup(GSequence *inode_map, uint64_t inum,
                                         int action);
 BlueSkyCloudLog *bluesky_inode_map_serialize(BlueSkyFS *fs);
 
+gboolean bluesky_checkpoint_load(BlueSkyFS *fs);
+
 #ifdef __cplusplus
 }
 #endif