Browse Source

Use Instant for smudge time in DirCache and DirCacheEntry

Change-Id: I98050a51baf4726c5717ef62ce7f026173666bdf
Signed-off-by: Matthias Sohn <matthias.sohn@sap.com>
stable-5.1
Matthias Sohn 5 years ago
parent
commit
d8d9427277
  1. 6
      org.eclipse.jgit/.settings/.api_filters
  2. 10
      org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java
  3. 34
      org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java

6
org.eclipse.jgit/.settings/.api_filters

@ -15,6 +15,12 @@
<message_argument value="getLastModifiedInstant()"/> <message_argument value="getLastModifiedInstant()"/>
</message_arguments> </message_arguments>
</filter> </filter>
<filter id="1142947843">
<message_arguments>
<message_argument value="5.1.9"/>
<message_argument value="mightBeRacilyClean(Instant)"/>
</message_arguments>
</filter>
<filter id="1142947843"> <filter id="1142947843">
<message_arguments> <message_arguments>
<message_argument value="5.1.9"/> <message_argument value="5.1.9"/>

10
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCache.java vendored

@ -58,6 +58,7 @@ import java.io.OutputStream;
import java.security.DigestOutputStream; import java.security.DigestOutputStream;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.text.MessageFormat; import java.text.MessageFormat;
import java.time.Instant;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Comparator; import java.util.Comparator;
@ -497,9 +498,7 @@ public class DirCache {
throw new CorruptObjectException(JGitText.get().DIRCHasTooManyEntries); throw new CorruptObjectException(JGitText.get().DIRCHasTooManyEntries);
snapshot = FileSnapshot.save(liveFile); snapshot = FileSnapshot.save(liveFile);
// TODO (ms) combine smudge_s and smudge_ns into Duration Instant smudge = snapshot.lastModifiedInstant();
int smudge_s = (int) (snapshot.lastModifiedInstant().getEpochSecond());
int smudge_ns = snapshot.lastModifiedInstant().getNano();
// Load the individual file entries. // Load the individual file entries.
// //
@ -508,8 +507,9 @@ public class DirCache {
sortedEntries = new DirCacheEntry[entryCnt]; sortedEntries = new DirCacheEntry[entryCnt];
final MutableInteger infoAt = new MutableInteger(); final MutableInteger infoAt = new MutableInteger();
for (int i = 0; i < entryCnt; i++) for (int i = 0; i < entryCnt; i++) {
sortedEntries[i] = new DirCacheEntry(infos, infoAt, in, md, smudge_s, smudge_ns); sortedEntries[i] = new DirCacheEntry(infos, infoAt, in, md, smudge);
}
// After the file entries are index extensions, and then a footer. // After the file entries are index extensions, and then a footer.
// //

34
org.eclipse.jgit/src/org/eclipse/jgit/dircache/DirCacheEntry.java vendored

@ -145,10 +145,9 @@ public class DirCacheEntry {
/** Flags which are never stored to disk. */ /** Flags which are never stored to disk. */
private byte inCoreFlags; private byte inCoreFlags;
// TODO (ms): use Instant to combine smudge_s and smudge_ns
DirCacheEntry(final byte[] sharedInfo, final MutableInteger infoAt, DirCacheEntry(final byte[] sharedInfo, final MutableInteger infoAt,
final InputStream in, final MessageDigest md, final int smudge_s, final InputStream in, final MessageDigest md, final Instant smudge)
final int smudge_ns) throws IOException { throws IOException {
info = sharedInfo; info = sharedInfo;
infoOffset = infoAt.value; infoOffset = infoAt.value;
@ -217,8 +216,9 @@ public class DirCacheEntry {
md.update(nullpad, 0, padLen); md.update(nullpad, 0, padLen);
} }
if (mightBeRacilyClean(smudge_s, smudge_ns)) if (mightBeRacilyClean(smudge)) {
smudgeRacilyClean(); smudgeRacilyClean();
}
} }
/** /**
@ -346,8 +346,29 @@ public class DirCacheEntry {
* @param smudge_ns * @param smudge_ns
* nanoseconds component of the index's last modified time. * nanoseconds component of the index's last modified time.
* @return true if extra careful checks should be used. * @return true if extra careful checks should be used.
* @deprecated use {@link #mightBeRacilyClean(Instant)} instead
*/ */
@Deprecated
public final boolean mightBeRacilyClean(int smudge_s, int smudge_ns) { public final boolean mightBeRacilyClean(int smudge_s, int smudge_ns) {
return mightBeRacilyClean(Instant.ofEpochSecond(smudge_s, smudge_ns));
}
/**
* Is it possible for this entry to be accidentally assumed clean?
* <p>
* The "racy git" problem happens when a work file can be updated faster
* than the filesystem records file modification timestamps. It is possible
* for an application to edit a work file, update the index, then edit it
* again before the filesystem will give the work file a new modification
* timestamp. This method tests to see if file was written out at the same
* time as the index.
*
* @param smudge
* index's last modified time.
* @return true if extra careful checks should be used.
* @since 5.1.9
*/
public final boolean mightBeRacilyClean(Instant smudge) {
// If the index has a modification time then it came from disk // If the index has a modification time then it came from disk
// and was not generated from scratch in memory. In such cases // and was not generated from scratch in memory. In such cases
// the entry is 'racily clean' if the entry's cached modification // the entry is 'racily clean' if the entry's cached modification
@ -357,8 +378,9 @@ public class DirCacheEntry {
// //
final int base = infoOffset + P_MTIME; final int base = infoOffset + P_MTIME;
final int mtime = NB.decodeInt32(info, base); final int mtime = NB.decodeInt32(info, base);
if (smudge_s == mtime) if (smudge.getEpochSecond() == mtime) {
return smudge_ns <= NB.decodeInt32(info, base + 4); return smudge.getNano() <= NB.decodeInt32(info, base + 4);
}
return false; return false;
} }

Loading…
Cancel
Save