A simple API to swap two files on a filesystem atomically
Project description
Atomic file swapping
Sadly, this is not a nuclear-powered utility to swap files.
atomicswap
is a Python module that implements the swapping of two files on a filesystem
in a single operation that can't be broken up; either the entire operation
completes correctly or none of it completes. This prevents the filesystem
from being left in an inconsistent state and avoids certain race conditions.
The API is very simple; only a single swap()
function is provided. The
function takes two file paths for the two files to be swapped. In the event
that either path is a relative path, you may also provide file descriptors
for directories that the relative paths should start from; if either is
missing then the path is relative to the current working directory. Paths
can be provided either as Python strings or pathlib
paths.
Installation
The latest stable version of atomicswap
can be installed from the Python
Package Index using pip
in the normal manner:
pip install atomicswap
If you want to try out the latest code then you can install it from the GitHub repository:
pip install atomicswap@git+https://github.com/nickovs/atomicswap.git
Example
Swapping the files /etc/something/active
and /etc/something/standby
in
a single operation can be performed as follows:
from atomicswap import swap
...
swap("/etc/something/active", "/etc/something/standby")
Alternatively, if using Path
objects, this could be implemented as:
from pathlib import Path
from atomicswap import swap
...
base_dir = Path("/etc/something")
swap(base_dir / "active", base_dir / "standby")
Platform support
Currently atomicswap
supports Linux, macOS and Windows. Note that the Windows
implementation does not support specifying the base directories for relative paths
using directory file descriptors.
Dependencies
On both macOS and Linux atomicswap
is not dependent on any non-standard
libraries or third party packages. On Windows it requires
pywin32
.
Implementation details
Both Linux and macOS have kernel system calls that provide the simultaneous,
atomic swapping of the names of two files. On Linux the system call is named
renameat2
while on macOS it is named renameatx_np
, but the operation is
much the same: passing a specific flag to the extended version of the rename
function causes it to swap the names of two existing files rather than just
changing the name of one file. On macOS the renameatx_np
is exposed in the
standard C library and can be called directly. Not all Linux distributions expose
the renameat2
system call in their C library so the syscall
wrapper function
is used instead.
While there is no equivalent single function to perform the same operation on Windows, it is possible to perform an atomic swap operation using the Windows Kernel Transaction Manager and Transactional NTFS. Unfortunately Microsoft have stated that "TxF may not be available in future versions of Microsoft Windows", which potentially limits the utility of this sort of implementation.
License
atomicswap
is released under the MIT license. See LICENSE.md for details.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file atomicswap-0.2.2.tar.gz
.
File metadata
- Download URL: atomicswap-0.2.2.tar.gz
- Upload date:
- Size: 5.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.16
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 3a994cbb23d5bf9bb378fa61f42624aabf64167c461e5498af5dbddf8fb2c44c |
|
MD5 | 4e56cf6553c00ef3ff0a216a1b1f4acd |
|
BLAKE2b-256 | a109ba423c4067e8218e71913d0e42236564a6773015ce263040be462138b59d |
File details
Details for the file atomicswap-0.2.2-py3-none-any.whl
.
File metadata
- Download URL: atomicswap-0.2.2-py3-none-any.whl
- Upload date:
- Size: 9.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.9.16
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 1426d69369c4dc5a758516430e0adcaa31f28e9c36122ab1014828c94b3ade70 |
|
MD5 | aad44f5da07b7eb1fe359f77ca8459db |
|
BLAKE2b-256 | 16d0c2b6825c50b805d8f92ac5d0b27c6dfcf7ddccee8f6e3a514fa9c7cacd0a |