X-Git-Url: http://git.vrable.net/?a=blobdiff_plain;f=bluesky%2Fbluesky-private.h;h=85eb99c78e23c5fdaa5082d50a912d7a0f56bcb1;hb=6955b27db8185d222adb07e57d207f7f421037e6;hp=9f973a35e5b59e3f2dee96691a0a3c2e09a66698;hpb=2b3dd7b15178288761500a6896376b4d44d3bfae;p=bluesky.git diff --git a/bluesky/bluesky-private.h b/bluesky/bluesky-private.h index 9f973a3..85eb99c 100644 --- a/bluesky/bluesky-private.h +++ b/bluesky/bluesky-private.h @@ -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,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 @@ -208,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; @@ -245,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); @@ -304,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); @@ -361,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