Package org.agrona
Class MarkFile
- java.lang.Object
-
- org.agrona.MarkFile
-
- All Implemented Interfaces:
java.lang.AutoCloseable
public class MarkFile extends java.lang.Object implements java.lang.AutoCloseable
AMarkFile
is used to mark the presence of a running component and to track liveness.The assumptions are: (1) the version field is an int in size, (2) the timestamp field is a long in size, and (3) the version field comes before the timestamp field.
-
-
Field Summary
Fields Modifier and Type Field Description private UnsafeBuffer
buffer
private java.util.concurrent.atomic.AtomicBoolean
isClosed
private java.nio.MappedByteBuffer
mappedBuffer
private java.io.File
markFile
private java.io.File
parentDir
private int
timestampFieldOffset
private int
versionFieldOffset
-
Constructor Summary
Constructors Constructor Description MarkFile(java.io.File markFile, boolean shouldPreExist, int versionFieldOffset, int timestampFieldOffset, int totalFileLength, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Create aMarkFile
if none present.MarkFile(java.io.File directory, java.lang.String filename, boolean warnIfDirectoryExists, boolean dirDeleteOnStart, int versionFieldOffset, int timestampFieldOffset, int totalFileLength, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Create a directory and mark file if none present.MarkFile(java.io.File directory, java.lang.String filename, int versionFieldOffset, int timestampFieldOffset, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Map a pre-existingMarkFile
if one present and is active.MarkFile(java.nio.MappedByteBuffer mappedBuffer, int versionFieldOffset, int timestampFieldOffset)
Manage aMarkFile
given a mapped file and offsets of version and timestamp.MarkFile(UnsafeBuffer buffer, int versionFieldOffset, int timestampFieldOffset)
Manage aMarkFile
given a buffer and offsets of version and timestamp.
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description UnsafeBuffer
buffer()
Returns the underlyingUnsafeBuffer
.void
close()
void
deleteDirectory(boolean ignoreFailures)
Delete parent directory.static void
ensureDirectoryExists(java.io.File directory, java.lang.String filename, boolean warnIfDirectoryExists, boolean dirDeleteOnStart, int versionFieldOffset, int timestampFieldOffset, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Ensure the directory exists, i.e.static void
ensureMarkFileLink(java.io.File serviceDir, java.io.File actualFile, java.lang.String linkFilename)
Ensure a link file exists if required for the actual mark file.static boolean
isActive(java.nio.MappedByteBuffer byteBuffer, EpochClock epochClock, long timeoutMs, int versionFieldOffset, int timestampFieldOffset, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Check ifMarkFile
is active, i.e.boolean
isClosed()
Checks ifMarkFile
is closed.static java.nio.MappedByteBuffer
mapExistingFile(java.io.File markFile, java.util.function.Consumer<java.lang.String> logger, long offset, long length)
Map existingMarkFile
.static java.nio.MappedByteBuffer
mapExistingMarkFile(java.io.File markFile, int versionFieldOffset, int timestampFieldOffset, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Map existingMarkFile
.static java.nio.MappedByteBuffer
mapNewOrExistingMarkFile(java.io.File markFile, boolean shouldPreExist, int versionFieldOffset, int timestampFieldOffset, long totalFileLength, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Map new of existingMarkFile
.java.nio.MappedByteBuffer
mappedByteBuffer()
Returns the underlyingMappedByteBuffer
.java.io.File
markFile()
ReturnsMarkFile
.java.io.File
parentDirectory()
Returns parent directory.void
signalReady(int version)
Perform an ordered put of the version field.protected static void
sleep(long durationMs)
Put thread to sleep for the given duration and restore interrupted status if thread is interrupted while sleeping.void
timestampOrdered(long timestamp)
Set timestamp field using an ordered put.long
timestampVolatile()
Perform volatile read of the timestamp field.long
timestampWeak()
Perform weak/plain read of the timestamp field.private static void
validateOffsets(int versionFieldOffset, int timestampFieldOffset)
int
versionVolatile()
Perform volatile read of the version field.int
versionWeak()
Perform weak/plain read of the version field.static java.nio.MappedByteBuffer
waitForFileMapping(java.util.function.Consumer<java.lang.String> logger, java.io.File markFile, long deadlineMs, EpochClock epochClock)
Await the creation of theMarkFile
.
-
-
-
Field Detail
-
versionFieldOffset
private final int versionFieldOffset
-
timestampFieldOffset
private final int timestampFieldOffset
-
parentDir
private final java.io.File parentDir
-
markFile
private final java.io.File markFile
-
mappedBuffer
private final java.nio.MappedByteBuffer mappedBuffer
-
buffer
private final UnsafeBuffer buffer
-
isClosed
private final java.util.concurrent.atomic.AtomicBoolean isClosed
-
-
Constructor Detail
-
MarkFile
public MarkFile(java.io.File directory, java.lang.String filename, boolean warnIfDirectoryExists, boolean dirDeleteOnStart, int versionFieldOffset, int timestampFieldOffset, int totalFileLength, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Create a directory and mark file if none present. Checking if an active Mark file exists and is active. Old Mark file is deleted and recreated if not active.Total length of Mark file will be mapped until
close()
is called.- Parameters:
directory
- for the Mark file.filename
- of the Mark file.warnIfDirectoryExists
- for logging purposes.dirDeleteOnStart
- if desired.versionFieldOffset
- to use for version field access.timestampFieldOffset
- to use for timestamp field access.totalFileLength
- to allocate when creating new Mark file.timeoutMs
- for the activity check (in milliseconds).epochClock
- to use for time checks.versionCheck
- to use for existing Mark file and version field.logger
- to use to signal progress or null.
-
MarkFile
public MarkFile(java.io.File markFile, boolean shouldPreExist, int versionFieldOffset, int timestampFieldOffset, int totalFileLength, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Create aMarkFile
if none present. Checking if an activeMarkFile
exists and is active. ExistingMarkFile
is used if not active.Total length of Mark file will be mapped until
close()
is called.- Parameters:
markFile
- to use.shouldPreExist
- or not.versionFieldOffset
- to use for version field access.timestampFieldOffset
- to use for timestamp field access.totalFileLength
- to allocate when creating newMarkFile
.timeoutMs
- for the activity check (in milliseconds).epochClock
- to use for time checks.versionCheck
- to use for existingMarkFile
and version field.logger
- to use to signal progress or null.
-
MarkFile
public MarkFile(java.io.File directory, java.lang.String filename, int versionFieldOffset, int timestampFieldOffset, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Map a pre-existingMarkFile
if one present and is active.Total length of
MarkFile
will be mapped untilclose()
is called.- Parameters:
directory
- for theMarkFile
file.filename
- of theMarkFile
file.versionFieldOffset
- to use for version field access.timestampFieldOffset
- to use for timestamp field access.timeoutMs
- for the activity check (in milliseconds) and for how long to wait for file to exist.epochClock
- to use for time checks.versionCheck
- to use for existingMarkFile
file and version field.logger
- to use to signal progress or null.
-
MarkFile
public MarkFile(java.nio.MappedByteBuffer mappedBuffer, int versionFieldOffset, int timestampFieldOffset)
Manage aMarkFile
given a mapped file and offsets of version and timestamp.If mappedBuffer is not null, then it will be unmapped upon
close()
.- Parameters:
mappedBuffer
- for theMarkFile
fields.versionFieldOffset
- for the version field.timestampFieldOffset
- for the timestamp field.
-
MarkFile
public MarkFile(UnsafeBuffer buffer, int versionFieldOffset, int timestampFieldOffset)
Manage aMarkFile
given a buffer and offsets of version and timestamp.- Parameters:
buffer
- for theMarkFile
fieldsversionFieldOffset
- for the version fieldtimestampFieldOffset
- for the timestamp field
-
-
Method Detail
-
isClosed
public boolean isClosed()
Checks ifMarkFile
is closed.- Returns:
true
ifMarkFile
is closed.
-
close
public void close()
- Specified by:
close
in interfacejava.lang.AutoCloseable
-
signalReady
public void signalReady(int version)
Perform an ordered put of the version field.- Parameters:
version
- to be signaled.
-
versionVolatile
public int versionVolatile()
Perform volatile read of the version field.- Returns:
- value of the version field.
-
versionWeak
public int versionWeak()
Perform weak/plain read of the version field.- Returns:
- value of the version field.
-
timestampOrdered
public void timestampOrdered(long timestamp)
Set timestamp field using an ordered put.- Parameters:
timestamp
- to be set.
-
timestampVolatile
public long timestampVolatile()
Perform volatile read of the timestamp field.- Returns:
- value of the timestamp field.
-
timestampWeak
public long timestampWeak()
Perform weak/plain read of the timestamp field.- Returns:
- value of the timestamp field.
-
deleteDirectory
public void deleteDirectory(boolean ignoreFailures)
Delete parent directory.- Parameters:
ignoreFailures
- should the failures be silently ignored.
-
parentDirectory
public java.io.File parentDirectory()
Returns parent directory.- Returns:
- parent directory.
-
mappedByteBuffer
public java.nio.MappedByteBuffer mappedByteBuffer()
Returns the underlyingMappedByteBuffer
.- Returns:
- reference to the
MappedByteBuffer
.
-
buffer
public UnsafeBuffer buffer()
Returns the underlyingUnsafeBuffer
.- Returns:
- reference to the
UnsafeBuffer
.
-
ensureDirectoryExists
public static void ensureDirectoryExists(java.io.File directory, java.lang.String filename, boolean warnIfDirectoryExists, boolean dirDeleteOnStart, int versionFieldOffset, int timestampFieldOffset, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Ensure the directory exists, i.e. create if it does not exist yet and re-create if it already exists.- Parameters:
directory
- to create.filename
- of theMarkFile
.warnIfDirectoryExists
- should print warning if directory already exists.dirDeleteOnStart
- should directory be deleted if it already exists. When the flag is set tofalse
the check will be made to see if theMarkFile
is active.Note: the directory will be deleted anyway even if the flag is
false
.versionFieldOffset
- offset of the version field.timestampFieldOffset
- offset of the timestamp field.timeoutMs
- timeout in milliseconds.epochClock
- epoch clock.versionCheck
-MarkFile
version check function.logger
- to use for reporting warnings.- Throws:
java.lang.IllegalStateException
- ifMarkFile
already exists and is active anddirDeleteOnStart=false
.
-
waitForFileMapping
public static java.nio.MappedByteBuffer waitForFileMapping(java.util.function.Consumer<java.lang.String> logger, java.io.File markFile, long deadlineMs, EpochClock epochClock)
Await the creation of theMarkFile
.
-
mapExistingMarkFile
public static java.nio.MappedByteBuffer mapExistingMarkFile(java.io.File markFile, int versionFieldOffset, int timestampFieldOffset, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Map existingMarkFile
.- Parameters:
markFile
- theMarkFile
.versionFieldOffset
- offset of the version field.timestampFieldOffset
- offset of the timestamp field.timeoutMs
- timeout in milliseconds.epochClock
- epoch clock.versionCheck
- version check function.logger
- for the warnings.- Returns:
MappedByteBuffer
for theMarkFile
.- Throws:
java.lang.IllegalStateException
- if timeout is reached.java.lang.IllegalStateException
- ifMarkFile
has wrong size.
-
mapNewOrExistingMarkFile
public static java.nio.MappedByteBuffer mapNewOrExistingMarkFile(java.io.File markFile, boolean shouldPreExist, int versionFieldOffset, int timestampFieldOffset, long totalFileLength, long timeoutMs, EpochClock epochClock, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Map new of existingMarkFile
.- Parameters:
markFile
- theMarkFile
.shouldPreExist
- shouldMarkFile
already exist.versionFieldOffset
- offset of the version field.timestampFieldOffset
- offset of the timestamp field.totalFileLength
- total file length to be mapped.timeoutMs
- timeout in milliseconds.epochClock
- epoch clock.versionCheck
- version check function.logger
- for the warnings.- Returns:
MappedByteBuffer
for theMarkFile
.- Throws:
java.lang.IllegalStateException
- if timeout is reached.
-
mapExistingFile
public static java.nio.MappedByteBuffer mapExistingFile(java.io.File markFile, java.util.function.Consumer<java.lang.String> logger, long offset, long length)
Map existingMarkFile
.
-
isActive
public static boolean isActive(java.nio.MappedByteBuffer byteBuffer, EpochClock epochClock, long timeoutMs, int versionFieldOffset, int timestampFieldOffset, java.util.function.IntConsumer versionCheck, java.util.function.Consumer<java.lang.String> logger)
Check ifMarkFile
is active, i.e. still in use.- Parameters:
byteBuffer
- theMappedByteBuffer
.epochClock
- epoch clock.timeoutMs
- timeout in milliseconds.versionFieldOffset
- offset of the version field.timestampFieldOffset
- offset of the timestamp field.versionCheck
- version check function.logger
- for the warnings.- Returns:
true
ifMarkFile
is active.
-
ensureMarkFileLink
public static void ensureMarkFileLink(java.io.File serviceDir, java.io.File actualFile, java.lang.String linkFilename)
Ensure a link file exists if required for the actual mark file. A link file will contain the pathname of the actual mark file's parent directory. This is useful if the mark file should be stored on a different storage medium to the directory of the service. This will create a file with name oflinkFilename
in theserviceDir
. IfactualFile
is an immediate child ofserviceDir
then any file with the name oflinkFilename
will be deleted from theserviceDir
(so that links won't be present if not required).- Parameters:
serviceDir
- directory where the mark file would normally be stored (e.g. archiveDir, clusterDir).actualFile
- location of actual mark file, e.g. /dev/shm/service/node0/archive-mark.datlinkFilename
- short name that should be used for the link file, e.g. archive-mark.lnk
-
sleep
protected static void sleep(long durationMs)
Put thread to sleep for the given duration and restore interrupted status if thread is interrupted while sleeping.- Parameters:
durationMs
- sleep duration in milliseconds.
-
validateOffsets
private static void validateOffsets(int versionFieldOffset, int timestampFieldOffset)
-
-