summaryrefslogtreecommitdiff
path: root/refs/files-backend.c
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2017-11-15 03:14:27 (GMT)
committerJunio C Hamano <gitster@pobox.com>2017-11-15 03:14:27 (GMT)
commitffb0b5762e903acc146cb21525f3c643de6facce (patch)
treea0d500e075136e58d918772a22d7ecc09b37ee2c /refs/files-backend.c
parentd4a5de7bde4791fabc61225336920f83801f26d2 (diff)
parent7c6bd25c7d65e777b5bb26ad5c8248fb3607e6d5 (diff)
downloadgit-ffb0b5762e903acc146cb21525f3c643de6facce.zip
git-ffb0b5762e903acc146cb21525f3c643de6facce.tar.gz
git-ffb0b5762e903acc146cb21525f3c643de6facce.tar.bz2
Merge branch 'mh/avoid-rewriting-packed-refs'
Recent update to the refs infrastructure implementation started rewriting packed-refs file more often than before; this has been optimized again for most trivial cases. * mh/avoid-rewriting-packed-refs: files-backend: don't rewrite the `packed-refs` file unnecessarily t1409: check that `packed-refs` is not rewritten unnecessarily
Diffstat (limited to 'refs/files-backend.c')
-rw-r--r--refs/files-backend.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 2bd54e1..b956215 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -2606,7 +2606,23 @@ static int files_transaction_prepare(struct ref_store *ref_store,
goto cleanup;
}
backend_data->packed_refs_locked = 1;
- ret = ref_transaction_prepare(packed_transaction, err);
+
+ if (is_packed_transaction_needed(refs->packed_ref_store,
+ packed_transaction)) {
+ ret = ref_transaction_prepare(packed_transaction, err);
+ } else {
+ /*
+ * We can skip rewriting the `packed-refs`
+ * file. But we do need to leave it locked, so
+ * that somebody else doesn't pack a reference
+ * that we are trying to delete.
+ */
+ if (ref_transaction_abort(packed_transaction, err)) {
+ ret = TRANSACTION_GENERIC_ERROR;
+ goto cleanup;
+ }
+ backend_data->packed_transaction = NULL;
+ }
}
cleanup: