RefDirectory.pack: Only rely on packed refs from disk
Since packed-refs is read from disk anyway, don't rely on the in-memory copy as that is racy and if outdated, could result in commit of pack-refs throwing an exception. This change also avoids a possible unnecessary double read of packed-refs from disk. Change-Id: I684a64991f53f8bdad58bbd248aae6522d11267d Signed-off-by: Kaushik Lingarkar <quic_kaushikl@quicinc.com>
This commit is contained in:
parent
4652dd956e
commit
4f7627be24
|
@ -746,13 +746,13 @@ private void pack(Collection<String> refs,
|
||||||
try {
|
try {
|
||||||
LockFile lck = lockPackedRefsOrThrow();
|
LockFile lck = lockPackedRefsOrThrow();
|
||||||
try {
|
try {
|
||||||
final PackedRefList packed = getPackedRefs();
|
PackedRefList oldPacked = refreshPackedRefs();
|
||||||
RefList<Ref> cur = readPackedRefs();
|
RefList<Ref> newPacked = oldPacked;
|
||||||
|
|
||||||
// Iterate over all refs to be packed
|
// Iterate over all refs to be packed
|
||||||
boolean dirty = false;
|
boolean dirty = false;
|
||||||
for (String refName : refs) {
|
for (String refName : refs) {
|
||||||
Ref oldRef = readRef(refName, cur);
|
Ref oldRef = readRef(refName, newPacked);
|
||||||
if (oldRef == null) {
|
if (oldRef == null) {
|
||||||
continue; // A non-existent ref is already correctly packed.
|
continue; // A non-existent ref is already correctly packed.
|
||||||
}
|
}
|
||||||
|
@ -769,11 +769,11 @@ private void pack(Collection<String> refs,
|
||||||
}
|
}
|
||||||
|
|
||||||
dirty = true;
|
dirty = true;
|
||||||
int idx = cur.find(refName);
|
int idx = newPacked.find(refName);
|
||||||
if (idx >= 0) {
|
if (idx >= 0) {
|
||||||
cur = cur.set(idx, newRef);
|
newPacked = newPacked.set(idx, newRef);
|
||||||
} else {
|
} else {
|
||||||
cur = cur.add(idx, newRef);
|
newPacked = newPacked.add(idx, newRef);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!dirty) {
|
if (!dirty) {
|
||||||
|
@ -782,7 +782,7 @@ private void pack(Collection<String> refs,
|
||||||
}
|
}
|
||||||
|
|
||||||
// The new content for packed-refs is collected. Persist it.
|
// The new content for packed-refs is collected. Persist it.
|
||||||
commitPackedRefs(lck, cur, packed,false);
|
commitPackedRefs(lck, newPacked, oldPacked,false);
|
||||||
|
|
||||||
// Now delete the loose refs which are now packed
|
// Now delete the loose refs which are now packed
|
||||||
for (String refName : refs) {
|
for (String refName : refs) {
|
||||||
|
@ -809,7 +809,7 @@ private void pack(Collection<String> refs,
|
||||||
if (currentLooseRef == null || currentLooseRef.isSymbolic()) {
|
if (currentLooseRef == null || currentLooseRef.isSymbolic()) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
Ref packedRef = cur.get(refName);
|
Ref packedRef = newPacked.get(refName);
|
||||||
ObjectId clr_oid = currentLooseRef.getObjectId();
|
ObjectId clr_oid = currentLooseRef.getObjectId();
|
||||||
if (clr_oid != null
|
if (clr_oid != null
|
||||||
&& clr_oid.equals(packedRef.getObjectId())) {
|
&& clr_oid.equals(packedRef.getObjectId())) {
|
||||||
|
|
Loading…
Reference in New Issue