How do I build up an atomic file write operation? The file is to be written by a Java service and read by python scripts.
For the record, reads are far greater than writes. But the write happens in batches and tend to be long. The file size amounts to mega bytes.
Right now my approach is:
Is this the right approach? How can avoid conditions where the old file is deleted but the new filename is yet to be renamed?
Do these programming languages (python and java) offer constructs to lock and avoid this situation?
An atomic file operation is an operation that cannot be interrupted or "partially" performed. Either the entire operation is performed or the operation fails.
For example, an atomic read / write operation. Or atomic access to a property. But what does this mean? Generally, you can summarize atomic as "one at a time". For example, when accessing or mutating a property is atomic, it means that only one read or write operation can be performed at a time.
AFAIK no.
And the reason is that for such an atomic operation to be possible, there has to be OS support in the form of a transactional file system. And none of the mainstream operating system offer a transactional file system.
EDIT - I'm wrong for POSIX-compliant systems at least. The POSIX rename
syscall performs an atomic replace if a file with the target name already exists ... as pointed out by @janneb. That should be sufficient to do the OP's operation atomically.
However, the fact remains that the Java File.renameTo()
method is explicitly not guaranteed to be atomic, so it does not provide a cross-platform solution to the OP's problem.
EDIT 2 - With Java 7 you can use java.nio.file.Files.move(Path source, Path target, CopyOption... options)
with copyOptions and ATOMIC_MOVE
. If this is not supported (by the OS / file system) you should get an exception.
It's a classic producer/consumer problem. You should be able to solve this by using file renaming, which is atomic on POSIX systems.
At least on POSIX platforms, leave out step 3 (delete old file). In POSIX, rename within a filesystem is guaranteed to be atomic, and renaming on top of an existing file replaces it atomically.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With