deltas: Take a shared repo lock while reindexing deltas
authorAlexander Larsson <alexl@redhat.com>
Fri, 9 Oct 2020 08:15:42 +0000 (10:15 +0200)
committerAlexander Larsson <alexl@redhat.com>
Fri, 23 Oct 2020 11:06:46 +0000 (13:06 +0200)
This ensures we're not racing with a prune operation that can be removing
the delta indexes we're relying on.

src/libostree/ostree-repo-static-delta-core.c

index 670a10a51531e0cd7c1ce2249b9f79bccd0c982b..5370d1520a648861b01c4f52082e4e3cce55f9cb 100644 (file)
@@ -1265,6 +1265,12 @@ ostree_repo_static_delta_reindex (OstreeRepo                 *repo,
   g_autoptr(GPtrArray) all_deltas = NULL;
   g_autoptr(GHashTable) deltas_to_commit_ht = NULL; /* map: to checksum -> ptrarray of from checksums (or NULL) */
 
+  /* Protect against parallel prune operation */
+  g_autoptr(OstreeRepoAutoLock) lock =
+    _ostree_repo_auto_lock_push (repo, OSTREE_REPO_LOCK_SHARED, cancellable, error);
+  if (!lock)
+    return FALSE;
+
   deltas_to_commit_ht = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify)null_or_ptr_array_unref);
 
   if (opt_to_commit == NULL)