}
}
+/* Erase the information contained within the in-memory cloud log
+ * representation. This does not free up the item itself, but frees the data
+ * and references to other log items and resets the type back to unknown. If
+ * the object was written out to persistent storage, all state about it can be
+ * recovered by loading the object back in. The object must be locked before
+ * calling this function. */
+void bluesky_cloudlog_erase(BlueSkyCloudLog *log)
+{
+ g_assert(log->data_lock_count == 0);
+
+ log->type = LOGTYPE_UNKNOWN;
+ log->data_size = 0;
+ bluesky_string_unref(log->data);
+ log->data = NULL;
+ log->data_lock_count = 0;
+
+ for (int i = 0; i < log->links->len; i++) {
+ BlueSkyCloudLog *c = g_array_index(log->links,
+ BlueSkyCloudLog *, i);
+ bluesky_cloudlog_unref(c);
+ }
+ g_array_unref(log->links);
+ log->links = g_array_new(FALSE, TRUE, sizeof(BlueSkyCloudLog *));
+}
+
/* Start a write of the object to the local log. */
void bluesky_cloudlog_sync(BlueSkyCloudLog *log)
{
/* Add the given entry to the global hash table containing cloud log entries.
* Takes ownership of the caller's reference. */
+void bluesky_cloudlog_insert_locked(BlueSkyCloudLog *log)
+{
+ g_hash_table_insert(log->fs->locations, &log->id, log);
+}
+
void bluesky_cloudlog_insert(BlueSkyCloudLog *log)
{
g_mutex_lock(log->fs->lock);
- g_hash_table_insert(log->fs->locations, &log->id, log);
+ bluesky_cloudlog_insert(log);
g_mutex_unlock(log->fs->lock);
}
log->location.size = state->data->len - log->location.offset;
+ g_string_free(data1, TRUE);
+ g_string_free(data2, TRUE);
+ g_string_free(data3, TRUE);
+
/* If the object we flushed was an inode, update the inode map. */
if (log->type == LOGTYPE_INODE) {
g_mutex_lock(fs->lock);