Some initial work on logging gathering data into cloud log segments.
[bluesky.git] / bluesky / bluesky-private.h
index 5080e00..822e029 100644 (file)
@@ -145,10 +145,108 @@ void bluesky_block_touch(BlueSkyInode *inode, uint64_t i);
 void bluesky_block_fetch(BlueSkyFS *fs, BlueSkyBlock *block,
                          BlueSkyStoreAsync *barrier);
 void bluesky_block_flush(BlueSkyFS *fs, BlueSkyBlock *block,
-                         BlueSkyStoreAsync *barrier);
-void bluesky_file_flush(BlueSkyInode *inode, BlueSkyStoreAsync *barrier);
+                         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. */
+#define BLUESKY_CRC32C_SEED (~(uint32_t)0)
+uint32_t crc32c(uint32_t crc, const char *buf, unsigned int length);
+uint32_t crc32c_finalize(uint32_t crc);
+
+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);
+
+/* Writing of data to the cloud in log segments and tracking the location of
+ * various pieces of data (both where in the cloud and where cached locally).
+ * */
+
+typedef struct {
+    char bytes[16];
+} BlueSkyCloudID;
+
+typedef struct {
+    uint32_t directory;
+    uint32_t sequence;
+    uint32_t offset;
+    uint32_t size;
+} BlueSkyCloudPointer;
+
+typedef enum {
+    LOGTYPE_UNKNOWN = 0,
+    LOGTYPE_DATA = 1,
+    LOGTYPE_INODE = 2,
+    LOGTYPE_INODE_MAP = 3,
+    LOGTYPE_CHECKPOINT = 4,
+    LOGTYPE_CHECKPOINT_PTR = 5,
+} BlueSkyCloudLogType;
+
+/* A record which tracks an object which has been written to a local log,
+ * cached, locally, and/or written to the cloud. */
+#define CLOUDLOG_JOURNAL    0x01
+#define CLOUDLOG_CACHE      0x02
+#define CLOUDLOG_CLOUD      0x04
+typedef struct {
+    gint refcount;
+
+    BlueSkyFS *fs;
+
+    BlueSkyCloudLogType type;
+
+    // Bitmask of CLOUDLOG_* flags indicating where the object exists.
+    int location_flags;
+
+    // A stable identifier for the object (only changes when authenticated data
+    // is written out, but stays the same when the in-cloud cleaner relocates
+    // the object).
+    BlueSkyCloudID id;
+
+    // The inode which owns this data, if any, and an offset.
+    uint64_t inum;
+    int32_t inum_offset;
+
+    // The location of the object in the cloud, if available.
+    BlueSkyCloudPointer location;
+
+    // TODO: Location in journal/cache
+
+    // Pointers to other objects
+    GArray *pointers;
+
+    // Serialized data, if available in memory (otherwise NULL).
+    BlueSkyRCStr *data;
+} BlueSkyCloudLog;
+
+gboolean bluesky_cloudlog_equal(gconstpointer a, gconstpointer b);
+guint bluesky_cloudlog_hash(gconstpointer a);
+BlueSkyCloudLog *bluesky_cloudlog_new(BlueSkyFS *fs);
+gchar *bluesky_cloudlog_id_to_string(BlueSkyCloudID id);
+BlueSkyCloudID bluesky_cloudlog_id_from_string(const gchar *idstr);
+void bluesky_cloudlog_ref(BlueSkyCloudLog *log);
+void bluesky_cloudlog_unref(BlueSkyCloudLog *log);
+BlueSkyLogItem *bluesky_cloudlog_sync(BlueSkyCloudLog *log);
+void bluesky_cloudlog_insert(BlueSkyCloudLog *log);
+void bluesky_cloudlog_write_log(BlueSkyFS *fs);
+
 #ifdef __cplusplus
 }
 #endif