}
if (action != 0) {
- bluesky_cloudlog_unref(range->serialized);
+ bluesky_cloudlog_unref_delayed(range->serialized);
range->serialized = NULL;
}
InodeMapEntry *entry = (InodeMapEntry *)g_sequence_get(i);
uint64_t inum = GUINT64_TO_LE(entry->inum);
g_string_append_len(buf, (const char *)&inum, sizeof(inum));
+ bluesky_cloudlog_ref(entry->item);
g_array_append_val(log->links, entry->item);
i = g_sequence_iter_next(i);
}
}
}
+/* Minimize resources consumed the inode map. This should only be called once
+ * an updated inode map has been serialized to the cloud, and will replace
+ * cloud log objects with skeletal versions that just reference the data
+ * location in the cloud (rather than pinning all object data in memory). */
+void bluesky_inode_map_minimize(BlueSkyFS *fs)
+{
+ GSequenceIter *i = g_sequence_get_begin_iter(fs->inode_map);
+ while (!g_sequence_iter_is_end(i)) {
+ InodeMapRange *range = (InodeMapRange *)g_sequence_get(i);
+
+ if (range->serialized != NULL)
+ bluesky_cloudlog_erase(range->serialized);
+
+ i = g_sequence_iter_next(i);
+ }
+}
+
/* Reconstruct the inode map from data stored in the cloud. */
static void bluesky_inode_map_deserialize(BlueSkyFS *fs, BlueSkyCloudLog *imap)
{
entry->item = g_array_index(section->links,
BlueSkyCloudLog *, j);
bluesky_cloudlog_ref(entry->item);
- entry->id = entry->item->id;
- entry->location = entry->item->location;
fs->next_inum = MAX(fs->next_inum, entry->inum + 1);
inum++;
}