Browse Source

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>
stable-5.1
Jonathan Nieder 7 years ago
parent
commit
d2cb1e7bf5
  1. 11
      org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java
  2. 21
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java
  3. 8
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java
  4. 3
      org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogWriter.java
  5. 7
      org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java
  6. 8
      org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java
  7. 4
      org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportSftp.java

11
org.eclipse.jgit.test/tst/org/eclipse/jgit/internal/storage/file/RefUpdateTest.java

@ -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 class RefUpdateTest extends SampleDataRepositoryTestCase {
// 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));

21
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/FileRepository.java

@ -56,7 +56,6 @@ import java.util.HashSet;
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 @@ public class FileRepository extends Repository {
} }
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));
} }

8
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/LockFile.java

@ -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 @@ import org.eclipse.jgit.util.FileUtils;
* 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 class LockFile {
* @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);
} }
}; };

3
org.eclipse.jgit/src/org/eclipse/jgit/internal/storage/file/ReflogWriter.java

@ -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;

7
org.eclipse.jgit/src/org/eclipse/jgit/lib/Constants.java

@ -691,6 +691,13 @@ public final class Constants {
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
} }

8
org.eclipse.jgit/src/org/eclipse/jgit/lib/Repository.java

@ -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 abstract class Repository implements AutoCloseable {
*/ */
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.

4
org.eclipse.jgit/src/org/eclipse/jgit/transport/TransportSftp.java

@ -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 @@ public class TransportSftp extends SshTransport implements WalkTransport {
@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…
Cancel
Save