typedef struct {
uint64_t inum;
- /* The ID of the most recent version of the inode. */
- BlueSkyCloudID id;
-
- /* The location where that version is written in the cloud. */
- BlueSkyCloudPointer location;
-
- /* If the cloud log entry exists in memory, then a pointer to it, otherwise
- * NULL. */
+ /* A pointer to the cloud log entry for this inode. This may or may not
+ * actually have data loaded (it might just contain pointers to the data
+ * location, and in fact this will likely often be the case). */
BlueSkyCloudLog *item;
} InodeMapEntry;
InodeMapEntry *bluesky_inode_map_lookup(GSequence *inode_map, uint64_t inum,
int action);
BlueSkyCloudLog *bluesky_inode_map_serialize(BlueSkyFS *fs);
+void bluesky_inode_map_minimize(BlueSkyFS *fs);
gboolean bluesky_checkpoint_load(BlueSkyFS *fs);
journal_seq_start);
fs->log->journal_watermark = journal_seq_start;
+
+ bluesky_inode_map_minimize(fs);
}
/* Drop cached data for a given inode, if it is clean. inode must be locked. */
g_mutex_lock(fs->lock);
InodeMapEntry *entry = bluesky_inode_map_lookup(fs->inode_map,
log->inum, 1);
- entry->id = log->id;
- entry->location = log->location;
entry->item = log;
bluesky_cloudlog_ref(entry->item);
g_mutex_unlock(fs->lock);
!g_sequence_iter_is_end(j); j = g_sequence_iter_next(j))
{
InodeMapEntry *entry = (InodeMapEntry *)g_sequence_get(j);
- char *id = bluesky_cloudlog_id_to_string(entry->id);
- g_print(" Entry %"PRIu64" id=%s\n", entry->inum, id);
- g_free(id);
+ BlueSkyCloudLog *item = entry->item;
+ if (item != NULL) {
+ char *id = bluesky_cloudlog_id_to_string(item->id);
+ g_print(" Entry %"PRIu64" id=%s\n", entry->inum, id);
+ g_free(id);
+ } else {
+ g_print(" Entry %"PRIu64" not available\n", entry->inum);
+ }
}
}
}
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++;
}