repo: Add APIs for devino optimization between checkout -> commit
A fast way to generate new OSTree content using an existing tree is to checkout (as hard links), add/replace files, then call `ostree_repo_scan_hardlinks()`, then commit. But `ostree_repo_scan_hardlinks()` scans the entire repo, which can be slow if you have a lot of content. All we really need is a mapping of (device,inode) -> checksum just for the objects we checked out, then use that mapping for commits. This patch adds API so that callers can create a mapping via `ostree_repo_devino_cache_new()`, then pass it to `ostree_repo_checkout_tree_at()` which will populate it, and then `ostree_repo_write_directory_to_mtree()` can consume it. I plan to use this in rpm-ostree for package layering work. Notes: - The old `ostree_repo_scan_hardlinks()` API still works. - I tweaked the cache to be a set with the checksum colocated with the key, to avoid a separate malloc block per entry. https://github.com/GNOME/ostree/pull/167
This commit is contained in:
1 parent
21fbc16bc3
commit
5929ce9e0e
6 files changed
+157
-51
No files matched your search
@@ -418,6 +418,9 @@ void ostree_repo_commit_modifier_set_xattr_callback (OstreeRepoCommitModifier
|
||||
void ostree_repo_commit_modifier_set_sepolicy (OstreeRepoCommitModifier *modifier,
|
||||
OstreeSePolicy *sepolicy);
|
||||
|
||||
void ostree_repo_commit_modifier_set_devino_cache (OstreeRepoCommitModifier *modifier,
|
||||
OstreeRepoDevInoCache *cache);
|
||||
|
||||
OstreeRepoCommitModifier *ostree_repo_commit_modifier_ref (OstreeRepoCommitModifier *modifier);
|
||||
void ostree_repo_commit_modifier_unref (OstreeRepoCommitModifier *modifier);
|
||||
|
||||
@@ -531,10 +534,17 @@ typedef struct {
|
||||
|
||||
const char *subpath;
|
||||
|
||||
OstreeRepoDevInoCache *devino_to_csum_cache;
|
||||
|
||||
guint unused_uints[6];
|
||||
gpointer unused_ptrs[8];
|
||||
gpointer unused_ptrs[7];
|
||||
} OstreeRepoCheckoutOptions;
|
||||
|
||||
GType ostree_repo_devino_cache_get_type (void);
|
||||
OstreeRepoDevInoCache *ostree_repo_devino_cache_new (void);
|
||||
OstreeRepoDevInoCache * ostree_repo_devino_cache_ref (OstreeRepoDevInoCache *cache);
|
||||
void ostree_repo_devino_cache_unref (OstreeRepoDevInoCache *cache);
|
||||
|
||||
gboolean ostree_repo_checkout_tree_at (OstreeRepo *self,
|
||||
OstreeRepoCheckoutOptions *options,
|
||||
int destination_dfd,
|
||||
|
||||
Reference in new issue
Block a user