Thread (79 messages) 79 messages, 4 authors, 2024-12-20

Re: [PATCH 3/7] refs/files: add count field to ref_lock

From: Christian Couder <hidden>
Date: 2024-12-10 17:22:43

On Mon, Dec 9, 2024 at 12:11 PM Karthik Nayak [off-list ref] wrote:
When refs are updated in the files-backend, a lock is obtained for the
corresponding file path. This is the case even for reflogs, i.e. a lock
is obtained on the reference path instead of the reflog path. This
works, since generally, reflogs are updated alongside the ref.

The upcoming patches will add support for reflog updates in ref
transaction. This means, in a particular transaction we want to have ref
updates and reflog updates. For refs, in a given transaction there can
only be one update. But, we can theoretically have multiple reflog
updates in a given transaction.
Nit: Giving an example might help understand where multiple reflog
updates can happen in a given transaction. Alternatively pointing to
an existing doc that contains such an example or explanations might
help too.
quoted hunk ↗ jump to hunk
@@ -2572,18 +2588,25 @@ static int lock_ref_for_update(struct files_ref_store *refs,
                        goto out;
        }

-       ret = lock_raw_ref(refs, update->refname, mustexist,
-                          affected_refnames,
-                          &lock, &referent,
-                          &update->type, err);
-       if (ret) {
-               char *reason;
+       lock = strmap_get(&backend_data->ref_locks, update->refname);
+       if (lock) {
+               lock->count = lock->count + 1;
Nit:
              lock->count++;
+       } else {
+               ret = lock_raw_ref(refs, update->refname, mustexist,
+                                  affected_refnames,
+                                  &lock, &referent,
+                                  &update->type, err);
+               if (ret) {
+                       char *reason;
+
+                       reason = strbuf_detach(err, NULL);
+                       strbuf_addf(err, "cannot lock ref '%s': %s",
+                                   ref_update_original_update_refname(update), reason);
+                       free(reason);
+                       goto out;
+               }

-               reason = strbuf_detach(err, NULL);
-               strbuf_addf(err, "cannot lock ref '%s': %s",
-                           ref_update_original_update_refname(update), reason);
-               free(reason);
-               goto out;
+               strmap_put(&backend_data->ref_locks, update->refname, lock);
        }

        update->backend_data = lock;
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help