Merge branch 'stable-5.0'
* stable-5.0: Use constant for ".lock" Simplify locking of FileRepository's index snapshot Refactor FileRepository.detectIndexChange() Change-Id: Ifd427711359bcf38b2c877b2143d45bff0c9895a Signed-off-by: Jonathan Nieder <jrn@google.com>
This commit is contained in:
commit
d2cb1e7bf5
|
@ -45,8 +45,9 @@
|
||||||
|
|
||||||
package org.eclipse.jgit.internal.storage.file;
|
package org.eclipse.jgit.internal.storage.file;
|
||||||
|
|
||||||
import static org.eclipse.jgit.lib.Constants.CHARSET;
|
|
||||||
import static org.eclipse.jgit.junit.Assert.assertEquals;
|
import static org.eclipse.jgit.junit.Assert.assertEquals;
|
||||||
|
import static org.eclipse.jgit.lib.Constants.CHARSET;
|
||||||
|
import static org.eclipse.jgit.lib.Constants.LOCK_SUFFIX;
|
||||||
import static org.junit.Assert.assertEquals;
|
import static org.junit.Assert.assertEquals;
|
||||||
import static org.junit.Assert.assertFalse;
|
import static org.junit.Assert.assertFalse;
|
||||||
import static org.junit.Assert.assertNotNull;
|
import static org.junit.Assert.assertNotNull;
|
||||||
|
@ -819,11 +820,11 @@ public void tryRenameWhenLocked(String toLock, String fromName,
|
||||||
// Check that the involved refs are the same despite the failure
|
// Check that the involved refs are the same despite the failure
|
||||||
assertExists(false, toName);
|
assertExists(false, toName);
|
||||||
if (!toLock.equals(toName))
|
if (!toLock.equals(toName))
|
||||||
assertExists(false, toName + ".lock");
|
assertExists(false, toName + LOCK_SUFFIX);
|
||||||
assertExists(true, toLock + ".lock");
|
assertExists(true, toLock + LOCK_SUFFIX);
|
||||||
if (!toLock.equals(fromName))
|
if (!toLock.equals(fromName))
|
||||||
assertExists(false, "logs/" + fromName + ".lock");
|
assertExists(false, "logs/" + fromName + LOCK_SUFFIX);
|
||||||
assertExists(false, "logs/" + toName + ".lock");
|
assertExists(false, "logs/" + toName + LOCK_SUFFIX);
|
||||||
assertEquals(oldHeadId, db.resolve(Constants.HEAD));
|
assertEquals(oldHeadId, db.resolve(Constants.HEAD));
|
||||||
assertEquals(oldfromId, db.resolve(fromName));
|
assertEquals(oldfromId, db.resolve(fromName));
|
||||||
assertNull(db.resolve(toName));
|
assertNull(db.resolve(toName));
|
||||||
|
|
|
@ -56,7 +56,6 @@
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.locks.ReentrantLock;
|
|
||||||
|
|
||||||
import org.eclipse.jgit.annotations.Nullable;
|
import org.eclipse.jgit.annotations.Nullable;
|
||||||
import org.eclipse.jgit.api.errors.JGitInternalException;
|
import org.eclipse.jgit.api.errors.JGitInternalException;
|
||||||
|
@ -125,7 +124,7 @@ public class FileRepository extends Repository {
|
||||||
private final RefDatabase refs;
|
private final RefDatabase refs;
|
||||||
private final ObjectDirectory objectDatabase;
|
private final ObjectDirectory objectDatabase;
|
||||||
|
|
||||||
private final ReentrantLock snapshotLock = new ReentrantLock();
|
private final Object snapshotLock = new Object();
|
||||||
|
|
||||||
// protected by snapshotLock
|
// protected by snapshotLock
|
||||||
private FileSnapshot snapshot;
|
private FileSnapshot snapshot;
|
||||||
|
@ -553,29 +552,23 @@ private void detectIndexChanges() {
|
||||||
}
|
}
|
||||||
|
|
||||||
File indexFile = getIndexFile();
|
File indexFile = getIndexFile();
|
||||||
snapshotLock.lock();
|
synchronized (snapshotLock) {
|
||||||
try {
|
|
||||||
if (snapshot == null) {
|
if (snapshot == null) {
|
||||||
snapshot = FileSnapshot.save(indexFile);
|
snapshot = FileSnapshot.save(indexFile);
|
||||||
} else if (snapshot.isModified(indexFile)) {
|
return;
|
||||||
snapshotLock.unlock();
|
|
||||||
notifyIndexChanged(false);
|
|
||||||
}
|
}
|
||||||
} finally {
|
if (!snapshot.isModified(indexFile)) {
|
||||||
if (snapshotLock.isHeldByCurrentThread()) {
|
return;
|
||||||
snapshotLock.unlock();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
notifyIndexChanged(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@Override
|
@Override
|
||||||
public void notifyIndexChanged(boolean internal) {
|
public void notifyIndexChanged(boolean internal) {
|
||||||
snapshotLock.lock();
|
synchronized (snapshotLock) {
|
||||||
try {
|
|
||||||
snapshot = FileSnapshot.save(getIndexFile());
|
snapshot = FileSnapshot.save(getIndexFile());
|
||||||
} finally {
|
|
||||||
snapshotLock.unlock();
|
|
||||||
}
|
}
|
||||||
fireEvent(new IndexChangedEvent(internal));
|
fireEvent(new IndexChangedEvent(internal));
|
||||||
}
|
}
|
||||||
|
|
|
@ -44,6 +44,8 @@
|
||||||
|
|
||||||
package org.eclipse.jgit.internal.storage.file;
|
package org.eclipse.jgit.internal.storage.file;
|
||||||
|
|
||||||
|
import static org.eclipse.jgit.lib.Constants.LOCK_SUFFIX;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
|
@ -74,7 +76,6 @@
|
||||||
* name.
|
* name.
|
||||||
*/
|
*/
|
||||||
public class LockFile {
|
public class LockFile {
|
||||||
static final String SUFFIX = ".lock"; //$NON-NLS-1$
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Unlock the given file.
|
* Unlock the given file.
|
||||||
|
@ -106,14 +107,15 @@ public static boolean unlock(File file) {
|
||||||
* @return lock file
|
* @return lock file
|
||||||
*/
|
*/
|
||||||
static File getLockFile(File file) {
|
static File getLockFile(File file) {
|
||||||
return new File(file.getParentFile(), file.getName() + SUFFIX);
|
return new File(file.getParentFile(),
|
||||||
|
file.getName() + LOCK_SUFFIX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Filter to skip over active lock files when listing a directory. */
|
/** Filter to skip over active lock files when listing a directory. */
|
||||||
static final FilenameFilter FILTER = new FilenameFilter() {
|
static final FilenameFilter FILTER = new FilenameFilter() {
|
||||||
@Override
|
@Override
|
||||||
public boolean accept(File dir, String name) {
|
public boolean accept(File dir, String name) {
|
||||||
return !name.endsWith(SUFFIX);
|
return !name.endsWith(LOCK_SUFFIX);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
package org.eclipse.jgit.internal.storage.file;
|
package org.eclipse.jgit.internal.storage.file;
|
||||||
|
|
||||||
import static org.eclipse.jgit.lib.Constants.HEAD;
|
import static org.eclipse.jgit.lib.Constants.HEAD;
|
||||||
|
import static org.eclipse.jgit.lib.Constants.LOCK_SUFFIX;
|
||||||
import static org.eclipse.jgit.lib.Constants.R_HEADS;
|
import static org.eclipse.jgit.lib.Constants.R_HEADS;
|
||||||
import static org.eclipse.jgit.lib.Constants.R_NOTES;
|
import static org.eclipse.jgit.lib.Constants.R_NOTES;
|
||||||
import static org.eclipse.jgit.lib.Constants.R_REFS;
|
import static org.eclipse.jgit.lib.Constants.R_REFS;
|
||||||
|
@ -84,7 +85,7 @@ public class ReflogWriter {
|
||||||
* @return the name of the ref's lock ref.
|
* @return the name of the ref's lock ref.
|
||||||
*/
|
*/
|
||||||
public static String refLockFor(String name) {
|
public static String refLockFor(String name) {
|
||||||
return name + LockFile.SUFFIX;
|
return name + LOCK_SUFFIX;
|
||||||
}
|
}
|
||||||
|
|
||||||
private final RefDirectory refdb;
|
private final RefDirectory refdb;
|
||||||
|
|
|
@ -691,6 +691,13 @@ public static byte[] encode(String str) {
|
||||||
public static final ObjectId EMPTY_BLOB_ID = ObjectId
|
public static final ObjectId EMPTY_BLOB_ID = ObjectId
|
||||||
.fromString("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391");
|
.fromString("e69de29bb2d1d6434b8b29ae775ad8c2e48c5391");
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Suffix of lock file name
|
||||||
|
*
|
||||||
|
* @since 5.0
|
||||||
|
*/
|
||||||
|
public static final String LOCK_SUFFIX = ".lock"; //$NON-NLS-1$
|
||||||
|
|
||||||
private Constants() {
|
private Constants() {
|
||||||
// Hide the default constructor
|
// Hide the default constructor
|
||||||
}
|
}
|
||||||
|
|
|
@ -48,6 +48,8 @@
|
||||||
|
|
||||||
package org.eclipse.jgit.lib;
|
package org.eclipse.jgit.lib;
|
||||||
|
|
||||||
|
import static org.eclipse.jgit.lib.Constants.LOCK_SUFFIX;
|
||||||
|
|
||||||
import java.io.BufferedOutputStream;
|
import java.io.BufferedOutputStream;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
|
@ -1368,10 +1370,12 @@ public RepositoryState getRepositoryState() {
|
||||||
*/
|
*/
|
||||||
public static boolean isValidRefName(String refName) {
|
public static boolean isValidRefName(String refName) {
|
||||||
final int len = refName.length();
|
final int len = refName.length();
|
||||||
if (len == 0)
|
if (len == 0) {
|
||||||
return false;
|
return false;
|
||||||
if (refName.endsWith(".lock")) //$NON-NLS-1$
|
}
|
||||||
|
if (refName.endsWith(LOCK_SUFFIX)) {
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Refs may be stored as loose files so invalid paths
|
// Refs may be stored as loose files so invalid paths
|
||||||
// on the local system must also be invalid refs.
|
// on the local system must also be invalid refs.
|
||||||
|
|
|
@ -43,6 +43,8 @@
|
||||||
|
|
||||||
package org.eclipse.jgit.transport;
|
package org.eclipse.jgit.transport;
|
||||||
|
|
||||||
|
import static org.eclipse.jgit.lib.Constants.LOCK_SUFFIX;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.FileNotFoundException;
|
import java.io.FileNotFoundException;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -344,7 +346,7 @@ OutputStream writeFile(final String path,
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
void writeFile(String path, byte[] data) throws IOException {
|
void writeFile(String path, byte[] data) throws IOException {
|
||||||
final String lock = path + ".lock"; //$NON-NLS-1$
|
final String lock = path + LOCK_SUFFIX;
|
||||||
try {
|
try {
|
||||||
super.writeFile(lock, data);
|
super.writeFile(lock, data);
|
||||||
try {
|
try {
|
||||||
|
|
Loading…
Reference in New Issue