Fix inProcessPackedRefsLock not shared with copies of the instance

The in process lock is intended to manage contention on locking the
packed-refs file within a single process without acquiring the file
system lock. Not sharing it across RefDirectory instances of the same
repository undermines that intent and results in more contention at the
file system level.

Change-Id: I68f11856aa0b4b1524f43554d7391a322a0a6897
Signed-off-by: Nasser Grainawi <quic_nasserg@quicinc.com>
This commit is contained in:
Nasser Grainawi 2023-05-02 16:30:44 -06:00
parent 140a8b365a
commit 06cfebd066
1 changed files with 3 additions and 1 deletions

View File

@ -155,7 +155,7 @@ public class RefDirectory extends RefDatabase {
* {@code RepositoryCache} is used, this lock instance will be used by all
* threads.
*/
final ReentrantLock inProcessPackedRefsLock = new ReentrantLock(true);
final ReentrantLock inProcessPackedRefsLock;
/**
* Number of modifications made to this database.
@ -190,6 +190,7 @@ public class RefDirectory extends RefDatabase {
packedRefs.set(refDb.packedRefs.get());
trustFolderStat = refDb.trustFolderStat;
trustPackedRefsStat = refDb.trustPackedRefsStat;
inProcessPackedRefsLock = refDb.inProcessPackedRefsLock;
}
RefDirectory(FileRepository db) {
@ -210,6 +211,7 @@ public class RefDirectory extends RefDatabase {
.getEnum(ConfigConstants.CONFIG_CORE_SECTION, null,
ConfigConstants.CONFIG_KEY_TRUST_PACKED_REFS_STAT,
TrustPackedRefsStat.UNSET);
inProcessPackedRefsLock = new ReentrantLock(true);
}
Repository getRepository() {