X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fbluesky-private.h;h=85eb99c78e23c5fdaa5082d50a912d7a0f56bcb1;hb=6955b27db8185d222adb07e57d207f7f421037e6;hp=e5b5b583919576614862bb79eb2cd2df06c86610;hpb=a82b60b3b683840a7074110831bcbaa16a40f0eb;p=bluesky.git diff --git a/bluesky/bluesky-private.h b/bluesky/bluesky-private.h index e5b5b58..85eb99c 100644 --- a/bluesky/bluesky-private.h +++ b/bluesky/bluesky-private.h @@ -33,6 +33,8 @@ extern int bluesky_watermark_high_total; /* TODO: Make this go away entirely. */ BlueSkyFS *bluesky_new_fs(gchar *name); +void bluesky_inode_free_resources(BlueSkyInode *inode); + /* Linked list update functions for LRU lists. */ void bluesky_list_unlink(GList *head, GList *item); GList *bluesky_list_prepend(GList *head, BlueSkyInode *inode); @@ -45,7 +47,16 @@ BlueSkyInode *bluesky_list_tail(GList *head); void bluesky_serialize_superblock(GString *out, BlueSkyFS *fs); BlueSkyFS *bluesky_deserialize_superblock(const gchar *buf); BlueSkyCloudLog *bluesky_serialize_inode(BlueSkyInode *inode); -gboolean bluesky_deserialize_inode(BlueSkyInode *inode, const gchar *buf); +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, + GString *writable); /* Storage layer. Requests can be performed asynchronously, so these objects * help keep track of operations in progress. */ @@ -120,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); @@ -171,9 +187,41 @@ 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. */ +struct log_header { + uint32_t magic; // HEADER_MAGIC + uint8_t type; // Object type + '0' + uint32_t offset; // Starting byte offset of the log header + uint32_t size1; // Size of the data item (bytes) + uint32_t size2; // + uint32_t size3; // + uint64_t inum; // Inode which owns this data, if any + BlueSkyCloudID id; // Object identifier +} __attribute__((packed)); + +struct log_footer { + uint32_t magic; // FOOTER_MAGIC + uint32_t crc; // Computed from log_header to log_footer.magic +} __attribute__((packed)); + +struct cloudlog_header { + char magic[4]; + uint8_t type; + BlueSkyCloudID id; + uint64_t inum; + uint32_t size1, size2, size3; +} __attribute__((packed)); + +#define JOURNAL_MAGIC "\nLog" +#define CLOUDLOG_MAGIC "AgI-" + /* 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 @@ -201,6 +249,9 @@ struct _BlueSkyCloudLog { uint64_t inum; int32_t inum_offset; + // The size of encrypted object data, not including any headers + int data_size; + // The location of the object in the cloud, if available. BlueSkyCloudPointer location; @@ -230,7 +281,7 @@ struct _BlueSkyCloudLogState { gboolean bluesky_cloudlog_equal(gconstpointer a, gconstpointer b); guint bluesky_cloudlog_hash(gconstpointer a); -BlueSkyCloudLog *bluesky_cloudlog_new(BlueSkyFS *fs); +BlueSkyCloudLog *bluesky_cloudlog_new(BlueSkyFS *fs, const BlueSkyCloudID *id); gchar *bluesky_cloudlog_id_to_string(BlueSkyCloudID id); BlueSkyCloudID bluesky_cloudlog_id_from_string(const gchar *idstr); void bluesky_cloudlog_ref(BlueSkyCloudLog *log); @@ -238,6 +289,7 @@ void bluesky_cloudlog_unref(BlueSkyCloudLog *log); void bluesky_cloudlog_stats_update(BlueSkyCloudLog *log, int type); void bluesky_cloudlog_sync(BlueSkyCloudLog *log); void bluesky_cloudlog_insert(BlueSkyCloudLog *log); +BlueSkyCloudLog *bluesky_cloudlog_get(BlueSkyFS *fs, BlueSkyCloudID id); void bluesky_cloudlog_fetch(BlueSkyCloudLog *log); BlueSkyCloudPointer bluesky_cloudlog_serialize(BlueSkyCloudLog *log, BlueSkyFS *fs); @@ -246,6 +298,7 @@ void bluesky_cloudlog_flush(BlueSkyFS *fs); /* Logging infrastructure for ensuring operations are persistently recorded to * disk. */ #define BLUESKY_CRC32C_SEED (~(uint32_t)0) +#define BLUESKY_CRC32C_VALIDATOR ((uint32_t)0xb798b438UL) uint32_t crc32c(uint32_t crc, const char *buf, unsigned int length); uint32_t crc32c_finalize(uint32_t crc); @@ -296,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); @@ -305,6 +361,8 @@ BlueSkyCacheFile *bluesky_cachefile_lookup(BlueSkyFS *fs, int clouddir, int log_seq); void bluesky_cachefile_gc(BlueSkyFS *fs); +void bluesky_replay(BlueSkyFS *fs); + /* Used to track log segments that are being written to the cloud. */ typedef struct { BlueSkyRCStr *data; @@ -340,8 +398,8 @@ typedef struct { /* A sorted list (by inode number) of InodeMapEntry objects. */ GSequence *map_entries; - /* The location where this inode map section is stored in the cloud. */ - BlueSkyCloudPointer location; + /* The serialized version of the inode map data. */ + BlueSkyCloudLog *serialized; /* Have there been changes that require writing this section out again? */ gboolean dirty; @@ -349,6 +407,9 @@ typedef struct { 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 }