core: Cache pack indexes
This is a 10x speedup on heavy users of ostree_repo_find_object(), such as ostree-pull.
This commit is contained in:
parent
920cbbc242
commit
3f02a1fd56
|
|
@ -64,6 +64,9 @@ struct _OstreeRepoPrivate {
|
||||||
GFile *remote_cache_dir;
|
GFile *remote_cache_dir;
|
||||||
GFile *config_file;
|
GFile *config_file;
|
||||||
|
|
||||||
|
GPtrArray *cached_meta_indexes;
|
||||||
|
GPtrArray *cached_content_indexes;
|
||||||
|
|
||||||
gboolean inited;
|
gboolean inited;
|
||||||
gboolean in_transaction;
|
gboolean in_transaction;
|
||||||
|
|
||||||
|
|
@ -93,6 +96,8 @@ ostree_repo_finalize (GObject *object)
|
||||||
g_hash_table_destroy (priv->pack_data_mappings);
|
g_hash_table_destroy (priv->pack_data_mappings);
|
||||||
if (priv->config)
|
if (priv->config)
|
||||||
g_key_file_free (priv->config);
|
g_key_file_free (priv->config);
|
||||||
|
ot_clear_ptrarray (&priv->cached_meta_indexes);
|
||||||
|
ot_clear_ptrarray (&priv->cached_content_indexes);
|
||||||
|
|
||||||
G_OBJECT_CLASS (ostree_repo_parent_class)->finalize (object);
|
G_OBJECT_CLASS (ostree_repo_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
@ -1582,19 +1587,30 @@ ostree_repo_list_pack_indexes (OstreeRepo *self,
|
||||||
ot_lptrarray GPtrArray *ret_meta_indexes = NULL;
|
ot_lptrarray GPtrArray *ret_meta_indexes = NULL;
|
||||||
ot_lptrarray GPtrArray *ret_data_indexes = NULL;
|
ot_lptrarray GPtrArray *ret_data_indexes = NULL;
|
||||||
|
|
||||||
superindex_path = g_file_get_child (priv->pack_dir, "index");
|
if (priv->cached_meta_indexes)
|
||||||
|
|
||||||
if (g_file_query_exists (superindex_path, cancellable))
|
|
||||||
{
|
{
|
||||||
if (!list_pack_checksums_from_superindex_file (superindex_path, &ret_meta_indexes,
|
ret_meta_indexes = g_ptr_array_ref (priv->cached_meta_indexes);
|
||||||
&ret_data_indexes,
|
ret_data_indexes = g_ptr_array_ref (priv->cached_content_indexes);
|
||||||
cancellable, error))
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ret_meta_indexes = g_ptr_array_new_with_free_func ((GDestroyNotify)g_free);
|
superindex_path = g_file_get_child (priv->pack_dir, "index");
|
||||||
ret_data_indexes = g_ptr_array_new_with_free_func ((GDestroyNotify)g_free);
|
|
||||||
|
if (g_file_query_exists (superindex_path, cancellable))
|
||||||
|
{
|
||||||
|
if (!list_pack_checksums_from_superindex_file (superindex_path, &ret_meta_indexes,
|
||||||
|
&ret_data_indexes,
|
||||||
|
cancellable, error))
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ret_meta_indexes = g_ptr_array_new_with_free_func ((GDestroyNotify)g_free);
|
||||||
|
ret_data_indexes = g_ptr_array_new_with_free_func ((GDestroyNotify)g_free);
|
||||||
|
}
|
||||||
|
|
||||||
|
priv->cached_meta_indexes = g_ptr_array_ref (ret_meta_indexes);
|
||||||
|
priv->cached_content_indexes = g_ptr_array_ref (ret_data_indexes);
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = TRUE;
|
ret = TRUE;
|
||||||
|
|
@ -1671,6 +1687,9 @@ ostree_repo_regenerate_pack_index (OstreeRepo *self,
|
||||||
GVariantBuilder *meta_index_content_builder = NULL;
|
GVariantBuilder *meta_index_content_builder = NULL;
|
||||||
GVariantBuilder *data_index_content_builder = NULL;
|
GVariantBuilder *data_index_content_builder = NULL;
|
||||||
|
|
||||||
|
ot_clear_ptrarray (&priv->cached_meta_indexes);
|
||||||
|
ot_clear_ptrarray (&priv->cached_content_indexes);
|
||||||
|
|
||||||
superindex_path = g_file_get_child (priv->pack_dir, "index");
|
superindex_path = g_file_get_child (priv->pack_dir, "index");
|
||||||
|
|
||||||
ot_clear_ptrarray (&pack_indexes);
|
ot_clear_ptrarray (&pack_indexes);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue