config: Add a core/change-update-summary option
This commits adds and implements a boolean repo config option called "change-update-summary" which updates the summary file every time a ref changes (additions, updates, and deletions). The main impetus for this feature is that the `ostree create-usb` and `flatpak create-usb` commands depend on the repo summary being up to date. On the command line you can work around this by asking the user to run `ostree summary --update` but in the case of GNOME Software calling out to `flatpak create-usb` this wouldn't work because it's running as a user and the repo is owned by root. That strategy also means flatpak can't update the repo metadata refs for fear of invalidating the summary. Another use case for this relates to LAN updates. Specifically, the component of eos-updater that generates DNS-SD records advertising ostree refs depends on the repo summary being up to date. Since ostree_repo_regenerate_summary() now takes an exclusive lock, this should be safe to enable. However it's not enabled by default because of the performance cost, and because it's more useful on clients than servers (which likely have another mechanism for updating the summary). Fixes https://github.com/ostreedev/ostree/issues/1664 Closes: #1681 Approved by: jlebon
This commit is contained in:
1 parent
fb36b62f33
commit
6869bada49
7 files changed
+115
-14
No files matched your search
@@ -2202,6 +2202,12 @@ ostree_repo_commit_transaction (OstreeRepo *self,
|
||||
return FALSE;
|
||||
g_clear_pointer (&self->txn.collection_refs, g_hash_table_destroy);
|
||||
|
||||
/* Update the summary if change-update-summary is set, because doing so was
|
||||
* delayed for each ref change during the transaction.
|
||||
*/
|
||||
if (!_ostree_repo_maybe_regenerate_summary (self, cancellable, error))
|
||||
return FALSE;
|
||||
|
||||
self->in_transaction = FALSE;
|
||||
|
||||
if (!ot_ensure_unlinked_at (self->repo_dir_fd, "transaction", 0))
|
||||
|
||||
@@ -437,6 +437,11 @@ _ostree_repo_get_remote_inherited (OstreeRepo *self,
|
||||
const char *name,
|
||||
GError **error);
|
||||
|
||||
gboolean
|
||||
_ostree_repo_maybe_regenerate_summary (OstreeRepo *self,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
/* Locking APIs are currently private.
|
||||
* See https://github.com/ostreedev/ostree/pull/1555
|
||||
*/
|
||||
|
||||
@@ -1144,6 +1144,11 @@ _ostree_repo_write_ref (OstreeRepo *self,
|
||||
if (!_ostree_repo_update_mtime (self, error))
|
||||
return FALSE;
|
||||
|
||||
/* Update the summary after updating the mtime so the summary doesn't look
|
||||
* out of date */
|
||||
if (!self->in_transaction && !_ostree_repo_maybe_regenerate_summary (self, cancellable, error))
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
@@ -5386,7 +5386,8 @@ summary_add_ref_entry (OstreeRepo *self,
|
||||
* will aid clients in working out when to check for updates.
|
||||
*
|
||||
* It is regenerated automatically after a commit if
|
||||
* `core/commit-update-summary` is set.
|
||||
* `core/commit-update-summary` is set, and automatically after any ref is
|
||||
* added, removed, or updated if `core/change-update-summary` is set.
|
||||
*
|
||||
* If the `core/collection-id` key is set in the configuration, it will be
|
||||
* included as %OSTREE_SUMMARY_COLLECTION_ID in the summary file. Refs that
|
||||
@@ -5592,6 +5593,28 @@ ostree_repo_regenerate_summary (OstreeRepo *self,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Regenerate the summary if `core/change-update-summary` is set */
|
||||
gboolean
|
||||
_ostree_repo_maybe_regenerate_summary (OstreeRepo *self,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
gboolean update_summary;
|
||||
|
||||
if (!ot_keyfile_get_boolean_with_default (self->config, "core",
|
||||
"change-update-summary", FALSE,
|
||||
&update_summary, error))
|
||||
return FALSE;
|
||||
|
||||
if (update_summary && !ostree_repo_regenerate_summary (self,
|
||||
NULL,
|
||||
cancellable,
|
||||
error))
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_ostree_repo_is_locked_tmpdir (const char *filename)
|
||||
{
|
||||
|
||||
@@ -752,8 +752,8 @@ ostree_builtin_commit (int argc, char **argv, OstreeCommandInvocation *invocatio
|
||||
|
||||
if (!skip_commit)
|
||||
{
|
||||
gboolean update_summary;
|
||||
guint64 timestamp;
|
||||
gboolean change_update_summary;
|
||||
|
||||
if (!opt_no_bindings)
|
||||
{
|
||||
@@ -824,21 +824,32 @@ ostree_builtin_commit (int argc, char **argv, OstreeCommandInvocation *invocatio
|
||||
if (!ostree_repo_commit_transaction (repo, &stats, cancellable, error))
|
||||
goto out;
|
||||
|
||||
/* The default for this option is FALSE, even for archive repos,
|
||||
* because ostree supports multiple processes committing to the same
|
||||
* repo (but different refs) concurrently, and in fact gnome-continuous
|
||||
* actually does this. In that context it's best to update the summary
|
||||
* explicitly instead of automatically here. */
|
||||
if (!ot_keyfile_get_boolean_with_default (ostree_repo_get_config (repo), "core",
|
||||
"commit-update-summary", FALSE,
|
||||
&update_summary, error))
|
||||
"change-update-summary", FALSE,
|
||||
&change_update_summary, error))
|
||||
goto out;
|
||||
|
||||
if (update_summary && !ostree_repo_regenerate_summary (repo,
|
||||
NULL,
|
||||
cancellable,
|
||||
error))
|
||||
goto out;
|
||||
/* No need to update it again if we did for each ref change */
|
||||
if (opt_orphan || !change_update_summary)
|
||||
{
|
||||
gboolean commit_update_summary;
|
||||
|
||||
/* The default for this option is FALSE, even for archive repos,
|
||||
* because ostree supports multiple processes committing to the same
|
||||
* repo (but different refs) concurrently, and in fact gnome-continuous
|
||||
* actually does this. In that context it's best to update the summary
|
||||
* explicitly instead of automatically here. */
|
||||
if (!ot_keyfile_get_boolean_with_default (ostree_repo_get_config (repo), "core",
|
||||
"commit-update-summary", FALSE,
|
||||
&commit_update_summary, error))
|
||||
goto out;
|
||||
|
||||
if (commit_update_summary && !ostree_repo_regenerate_summary (repo,
|
||||
NULL,
|
||||
cancellable,
|
||||
error))
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user