diff --git a/src/ostree/ot-builtin-prune.c b/src/ostree/ot-builtin-prune.c index 73dfe5e5da..0b4e8698a6 100644 --- a/src/ostree/ot-builtin-prune.c +++ b/src/ostree/ot-builtin-prune.c @@ -208,6 +208,15 @@ ostree_builtin_prune (int argc, char **argv, OstreeCommandInvocation *invocation } else { + /* In this branch, we need to compute the reachability set manually. + * While we do this, we can't let new content in since it'll race with + * reachability calculations and we may immediately nuke it. So push an + * exclusive lock now. */ + g_autoptr(OstreeRepoAutoLock) lock = + ostree_repo_auto_lock_push (repo, OSTREE_REPO_LOCK_EXCLUSIVE, cancellable, error); + if (!lock) + return FALSE; + g_autoptr(GHashTable) all_refs = NULL; g_autoptr(GHashTable) reachable = ostree_repo_traverse_new_reachable (); g_autoptr(GHashTable) retain_branch_depth = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL); diff --git a/tests/test-prune.sh b/tests/test-prune.sh index bbb77a23de..0e628405d5 100755 --- a/tests/test-prune.sh +++ b/tests/test-prune.sh @@ -363,4 +363,16 @@ ${CMD_PREFIX} ostree --repo=repo prune --commit-only --keep-younger-than="1 week assert_repo_has_n_commits repo 4 assert_repo_has_n_non_commit_objects repo ${orig_obj_count} tap_ok --commit-only and --keep-younger-than + +reinitialize_commit_only_test_repo +for i in {1..10}; do + ${CMD_PREFIX} ostree --repo=repo prune --commit-only --keep-younger-than="1 week ago" & + commit=$(${CMD_PREFIX} ostree --repo=repo commit --branch foobar tree) + wait $! + if ! ostree show --repo=repo ${commit}; then + assert_not_reached "commit ${commit} on branch foobar was pruned?" + fi +done +tap_ok commit and prune together + tap_end