Bug fixes
acquireandacquireraiseTypeErrorfor a blocking that is not abool, as the constructor and theblockingsetter already do. A truthy value such as the string"false"used to count asTrue, so a call meant as a single attempt waited for the instance'stimeout, and without a limit at the default-1(#870) by @simpleqt and @gaborbernat.- A
SoftFileLockacquisition whose first read of its new marker's identity failed reads it again before rolling back. On Windows the rollback could otherwise not recognize the marker it had created, and the empty marker it left blocked the path for every later acquisition, since no contender breaks an empty marker (#869) by @simpleqt and @gaborbernat. - A
fork()child of a process holding aSoftFileLeasestarts from an unheld claim. It used to inherit the parent's token, last compromise and heartbeat, sotokenandcompromisereported a claim the child never held whileis_lockedreported it unheld (#868) by @dxbjavid and @gaborbernat. - A nested acquire of a held
FileLockorSoftFileLockno longer creates the lock file's parent directory. After a rename of that directory during the hold, the nested acquire recreated the old name, and when a file had taken the name it raisedFileExistsErrorand left the hold's recursion count incremented (#878) by @0x5t4l1n and @gaborbernat. - Fix
ReadWriteLockfailing every acquire with "link directory ... was replaced while opening" in a group-writable directory whose inherited ACL, such as an NFSv4 one on ZFS, opens the link directory to the group. The lock now closes the empty link directory to its owner, and where the filesystem refuses that, such as ZFS withaclmode=restricted, it names the directory to make writable by its owner only (#898) by @gaborbernat. - Fix
SoftFileLock,MarkerSoftFileLockandSoftFileLeaseraisingOverflowErrorout ofacquire(), or never reclaiming a dead holder's lock, when a stranded restore claim beside the lock names a process number outside1..2**31-1or spells it in non-ASCII digits. Such a claim is now ignored, as no filelock writes one (#871) by @dxbjavid and @gaborbernat. - Fix soft locks on Windows keeping the marker of a holder that has exited while another process still holds a handle to it, such as a parent's
subprocess.Popenafterwait()ormultiprocessing.Processafterjoin(). Acquiring such a lock with the defaulttimeout=-1waited forever (#874) by @nk-batman21. - Fix the read-only reopen of a lock file this account cannot write resolving a relative path against the working directory of the moment. A
chdirbetween the refusedO_RDWRopen and the reopen made the acquisition wait on a file that is not there, or probe one in another directory. The reopen now uses the path the acquisition pinned (#889) by @dxbjavid and @gaborbernat. - Handle
EMLINK, the error FreeBSD reports when a no-follow open refuses a symlink, in a soft reader/writer lock's protocol tree, so heartbeat reports lost ownership there rather than a transient refresh error (#866) by @pacocartones and @gaborbernat. - Resolving
ReadWriteLockorAsyncReadWriteLockraises theImportErrorwhen a module other than Python'ssqlite3is missing, as in a frozen application that left out a filelock submodule. The names areNoneonly without SQLite (#880) by @pintu544 and @gaborbernat.
Documentation
- The lock-probing recipe in the how-to guide probes with
blocking=Falseinstead of a tinytimeout(#873) by @tongwentao and @gaborbernat.
Packaging
- Releases now run on the shared tox-dev/github-workflows pipeline, with a locked release toolchain and generated GitHub Release notes (#885) by @gaborbernat.
New Contributors
- @simpleqt made their first contribution in #869
- @KennyMcSimpson made their first contribution in #875
- @0x5t4l1n made their first contribution in #878
- @tongwentao made their first contribution in #873
- @pacocartones made their first contribution in #866
- @nk-batman21 made their first contribution in #874
- @pintu544 made their first contribution in #880
- @00200200 made their first contribution in #877