Preparatory work before implementing proper cloud writing.
[bluesky.git] / bluesky / cloudlog.c
index 84e63d8..e1fd44a 100644 (file)
@@ -127,13 +127,6 @@ void bluesky_cloudlog_insert(BlueSkyCloudLog *log)
     g_mutex_unlock(log->fs->lock);
 }
 
-/* Serialize objects into a log segment to be written to the cloud. */
-struct log_state {
-    GString *data;
-    BlueSkyCloudPointer location;
-    GList *inode_list;
-};
-
 struct log_header {
     char magic[4];
     uint32_t size;
@@ -152,7 +145,7 @@ struct log_footer {
 };
 
 BlueSkyCloudPointer bluesky_cloudlog_serialize(BlueSkyCloudLog *log,
-                                               struct log_state *state)
+                                               BlueSkyCloudLogState *state)
 {
     if (log->location_flags & CLOUDLOG_CLOUD) {
         return log->location;
@@ -198,7 +191,7 @@ BlueSkyCloudPointer bluesky_cloudlog_serialize(BlueSkyCloudLog *log,
 
 static void find_inodes(gpointer key, gpointer value, gpointer user_data)
 {
-    struct log_state *state = (struct log_state *)user_data;
+    BlueSkyCloudLogState *state = (BlueSkyCloudLogState *)user_data;
     BlueSkyCloudLog *item = (BlueSkyCloudLog *)value;
 
     if (item->type != LOGTYPE_INODE)
@@ -212,34 +205,33 @@ void bluesky_cloudlog_write_log(BlueSkyFS *fs)
 {
     g_print("Starting cloudlog write...\n");
 
-    struct log_state state;
-    state.data = g_string_new("");
-    state.location.directory = 0;
-    state.location.sequence = 0;
-    state.location.offset = 0;
-    state.location.size = 0;
-    state.inode_list = NULL;
+    BlueSkyCloudLogState *state = fs->log_state;
+    state->data = g_string_new("");
 
     g_mutex_lock(fs->lock);
-    g_hash_table_foreach(fs->locations, find_inodes, &state);
+    g_hash_table_foreach(fs->locations, find_inodes, state);
     g_mutex_unlock(fs->lock);
 
-    while (state.inode_list != NULL) {
-        BlueSkyCloudLog *log = (BlueSkyCloudLog *)state.inode_list->data;
-        bluesky_cloudlog_serialize(log, &state);
-        state.inode_list = g_list_delete_link(state.inode_list,
-                                              state.inode_list);
+    while (state->inode_list != NULL) {
+        BlueSkyCloudLog *log = (BlueSkyCloudLog *)state->inode_list->data;
+        bluesky_cloudlog_serialize(log, state);
+        state->inode_list = g_list_delete_link(state->inode_list,
+                                               state->inode_list);
     }
 
-    g_print("Serialized %zd bytes of data\n", state.data->len);
+    g_print("Serialized %zd bytes of data\n", state->data->len);
 
     BlueSkyStoreAsync *async = bluesky_store_async_new(fs->store);
     async->op = STORE_OP_PUT;
     async->key = g_strdup_printf("log-%08d-%08d",
-                                 state.location.directory,
-                                 state.location.sequence);
-    async->data = bluesky_string_new_from_gstring(state.data);
+                                 state->location.directory,
+                                 state->location.sequence);
+    async->data = bluesky_string_new_from_gstring(state->data);
     bluesky_store_async_submit(async);
     bluesky_store_async_wait(async);
     bluesky_store_async_unref(async);
+
+    state->data = NULL;
+    state->location.sequence++;
+    state->location.offset = 0;
 }