Class FileSnapshot
- Direct Known Subclasses:
PackFileSnapshot
This object tracks the last modified time of a file. Later during an
invocation of isModified(File)
the object will return true if the
file may have been modified and should be re-read from disk.
A snapshot does not "live update" when the underlying filesystem changes.
Callers must poll for updates by periodically invoking
isModified(File)
.
To work around the "racy git" problem (where a file may be modified multiple times within the granularity of the filesystem modification clock) this class may return true from isModified(File) if the last modification time of the file is less than 3 seconds ago.
-
Field Summary
FieldsModifier and TypeFieldDescriptionprivate boolean
True oncelastRead
is far later thanlastModified
.private static final DateTimeFormatter
private long
static final FileSnapshot
A FileSnapshot that is considered to always be modified.private final File
private final Object
Object that uniquely identifies the given file, ornull
if a file key is not availableprivate boolean
private FS.FileStoreAttributes
measured FileStore attributesprivate final Instant
Last observed modification time of the path.private boolean
private Instant
Last wall-clock time the path was read.private static final org.slf4j.Logger
static final FileSnapshot
A FileSnapshot that is clean if the file does not exist.private static final Object
private long
private final long
Underlying file-system size in bytes.private boolean
static final long
An unknown file size.private static final Instant
private boolean
-
Constructor Summary
ConstructorsModifierConstructorDescriptionprotected
FileSnapshot
(File file) Record a snapshot for a specific file path.protected
FileSnapshot
(File file, boolean useConfig) Record a snapshot for a specific file path.private
FileSnapshot
(Instant read, Instant modified, long size, Duration fsTimestampResolution, Object fileKey) -
Method Summary
Modifier and TypeMethodDescriptionboolean
boolean
equals
(FileSnapshot other) Compare two snapshots to see if they cache the same information.private long
private static Object
getFileKey
(BasicFileAttributes fileAttributes) int
hashCode()
private boolean
isFileKeyChanged
(Object currFileKey) boolean
isModified
(File path) Check if the path may have been modified since the snapshot was saved.private boolean
isModified
(Instant currLastModified) private boolean
isRacyClean
(Instant read) private boolean
isSizeChanged
(long currSize) long
long
Deprecated.Get time of last snapshot updatelong
static FileSnapshot
save
(long modified) Deprecated.usesave(Instant)
instead.static FileSnapshot
Record a snapshot for a specific file path.static FileSnapshot
Record a snapshot for a file for which the last modification time is already known.static FileSnapshot
saveNoConfig
(File path) Record a snapshot for a specific file path without using config file to get filesystem timestamp resolution.void
setClean
(FileSnapshot other) Update this snapshot when the content hasn't changed.long
size()
toString()
void
Wait until this snapshot's file can't be racy anymore(package private) boolean
(package private) boolean
(package private) boolean
(package private) boolean
-
Field Details
-
LOG
private static final org.slf4j.Logger LOG -
UNKNOWN_SIZE
public static final long UNKNOWN_SIZEAn unknown file size. This value is used when a comparison needs to happen purely on the lastUpdate.- See Also:
-
UNKNOWN_TIME
-
MISSING_FILEKEY
-
dateFmt
-
DIRTY
A FileSnapshot that is considered to always be modified.This instance is useful for application code that wants to lazily read a file, but only after
isModified(File)
gets invoked. The returned snapshot contains only invalid status information. -
MISSING_FILE
A FileSnapshot that is clean if the file does not exist.This instance is useful if the application wants to consider a missing file to be clean.
isModified(File)
will return false if the file path does not exist. -
lastModified
Last observed modification time of the path. -
lastRead
Last wall-clock time the path was read. -
cannotBeRacilyClean
private boolean cannotBeRacilyCleanTrue oncelastRead
is far later thanlastModified
. -
size
private final long sizeUnderlying file-system size in bytes. When set toUNKNOWN_SIZE
the size is not considered for modification checks. -
fileStoreAttributeCache
measured FileStore attributes -
fileKey
Object that uniquely identifies the given file, ornull
if a file key is not available -
file
-
sizeChanged
private boolean sizeChanged -
fileKeyChanged
private boolean fileKeyChanged -
lastModifiedChanged
private boolean lastModifiedChanged -
wasRacyClean
private boolean wasRacyClean -
delta
private long delta -
racyThreshold
private long racyThreshold
-
-
Constructor Details
-
FileSnapshot
Record a snapshot for a specific file path.This method should be invoked before the file is accessed.
- Parameters:
file
- the path to remember meta data for. The path's current status information is saved.
-
FileSnapshot
Record a snapshot for a specific file path.This method should be invoked before the file is accessed.
- Parameters:
file
- the path to remember meta data for. The path's current status information is saved.useConfig
- iftrue
read filesystem time resolution from configuration file otherwise use fallback resolution
-
FileSnapshot
-
-
Method Details
-
save
Record a snapshot for a specific file path.This method should be invoked before the file is accessed.
- Parameters:
path
- the path to later remember. The path's current status information is saved.- Returns:
- the snapshot.
-
saveNoConfig
Record a snapshot for a specific file path without using config file to get filesystem timestamp resolution.This method should be invoked before the file is accessed. It is used by FileBasedConfig to avoid endless recursion.
- Parameters:
path
- the path to later remember. The path's current status information is saved.- Returns:
- the snapshot.
-
getFileKey
-
save
Deprecated.usesave(Instant)
instead.Record a snapshot for a file for which the last modification time is already known.This method should be invoked before the file is accessed.
Note that this method cannot rely on measuring file timestamp resolution to avoid racy git issues caused by finite file timestamp resolution since it's unknown in which filesystem the file is located. Hence the worst case fallback for timestamp resolution is used.
- Parameters:
modified
- the last modification time of the file- Returns:
- the snapshot.
-
save
Record a snapshot for a file for which the last modification time is already known.This method should be invoked before the file is accessed.
Note that this method cannot rely on measuring file timestamp resolution to avoid racy git issues caused by finite file timestamp resolution since it's unknown in which filesystem the file is located. Hence the worst case fallback for timestamp resolution is used.
- Parameters:
modified
- the last modification time of the file- Returns:
- the snapshot.
-
lastModified
Deprecated.uselastModifiedInstant()
insteadGet time of last snapshot update- Returns:
- time of last snapshot update
-
lastModifiedInstant
Get time of last snapshot update- Returns:
- time of last snapshot update
-
size
public long size()- Returns:
- file size in bytes of last snapshot update
-
isModified
Check if the path may have been modified since the snapshot was saved.- Parameters:
path
- the path the snapshot describes.- Returns:
- true if the path needs to be read again.
-
setClean
Update this snapshot when the content hasn't changed.If the caller gets true from
isModified(File)
, re-reads the content, discovers the content is identical, andequals(FileSnapshot)
is true, it can usesetClean(FileSnapshot)
to make a futureisModified(File)
return false. The logic goes something like this:if (snapshot.isModified(path)) { FileSnapshot other = FileSnapshot.save(path); Content newContent = ...; if (oldContent.equals(newContent) && snapshot.equals(other)) snapshot.setClean(other); }
- Parameters:
other
- the other snapshot.
-
waitUntilNotRacy
Wait until this snapshot's file can't be racy anymore- Throws:
InterruptedException
- if sleep was interrupted
-
equals
Compare two snapshots to see if they cache the same information.- Parameters:
other
- the other snapshot.- Returns:
- true if the two snapshots share the same information.
-
equals
-
hashCode
public int hashCode() -
wasSizeChanged
boolean wasSizeChanged()- Returns:
true
if FileSnapshot.isModified(File) found the file size changed
-
wasFileKeyChanged
boolean wasFileKeyChanged()- Returns:
true
if FileSnapshot.isModified(File) found the file key changed
-
wasLastModifiedChanged
boolean wasLastModifiedChanged()- Returns:
true
if FileSnapshot.isModified(File) found the file's lastModified changed
-
wasLastModifiedRacilyClean
boolean wasLastModifiedRacilyClean()- Returns:
true
if FileSnapshot.isModified(File) detected that lastModified is racily clean
-
lastDelta
public long lastDelta()- Returns:
- the delta in nanoseconds between lastModified and lastRead during last racy check
-
lastRacyThreshold
public long lastRacyThreshold()- Returns:
- the racyLimitNanos threshold in nanoseconds during last racy check
-
toString
-
isRacyClean
-
getEffectiveRacyThreshold
private long getEffectiveRacyThreshold() -
isModified
-
isFileKeyChanged
-
isSizeChanged
private boolean isSizeChanged(long currSize)
-
lastModifiedInstant()
instead