Repository navigation
fix(deps): update dependency filelock to v4 - #465
Open
renovate[bot] wants to merge 1 commit into
Open
renovate[bot] wants to merge 1 commit into
renovate[bot] wants to merge 1 commit into
Conversation
|
Important Review skippedBot user detected. To trigger a single review, invoke the ⚙️ Run configuration
You can disable this status message by setting the Use the checkbox below for a quick retry:
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
renovate
Bot
force-pushed
the
renovate/filelock-4.x
branch
2 times, most recently
from
September 24, 2026 05:03
57e3d19 to
2fad156
Compare
renovate
Bot
force-pushed
the
renovate/filelock-4.x
branch
6 times, most recently
from
October 2, 2026 00:41
e4b4f26 to
a30e2ea
Compare
renovate
Bot
force-pushed
the
renovate/filelock-4.x
branch
4 times, most recently
from
October 10, 2026 01:43
1c4b94d to
aed37a4
Compare
renovate
Bot
force-pushed
the
renovate/filelock-4.x
branch
5 times, most recently
from
October 18, 2026 09:51
96daa21 to
5b3eb55
Compare
renovate
Bot
force-pushed
the
renovate/filelock-4.x
branch
from
October 19, 2026 01:42
5b3eb55 to
c92749e
Compare
renovate
Bot
force-pushed
the
renovate/filelock-4.x
branch
from
October 19, 2026 06:07
c92749e to
f5fd5f3
Compare
This branch has not been deployed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR contains the following updates:
>=3.20.3,<4→>=4.2.4,<5Release Notes
tox-dev/py-filelock (filelock)
v4.2.4Compare Source
PyPI release
Full Changelog: tox-dev/filelock@4.2.3...4.2.4
v4.2.3Compare Source
types.LazyImportTypeno longer triggersAttributeErroratexit. #860
EFTYPEwhen a no-follow open refuses a symlink in a soft reader/writer lock's protocol tree, so heartbeatreports lost ownership rather than a transient refresh error.
PyPI release
Full Changelog: tox-dev/filelock@4.2.2...4.2.3
v4.2.2Compare Source
Bug fixes
with lock:ended, when an earlieracquire()had failed because the working directory no longer exists. That call still raisesFileNotFoundError, and it now leaves the lock's hold count unchanged. #856 by @spicysharkco.PyPI release
Full Changelog
v4.2.1Compare Source
Bug fixes
AsyncReadWriteLock.close()andAsyncSoftReadWriteLock.close()end only the holds that tasks acquired through that wrapper. A reader that arrives duringclose()gets the closed error instead of joining the ending hold. After synchronous code closes or force-releases the shared lock, the wrappers refuse to admit readers into the ended hold, andclose()on such a wrapper returns. Closing one wrapper no longer ends a task's nested hold taken through another wrapper on the same path. #832 by @gaborbernat.ReadWriteLocklocks again after arelease()that an exception from a signal handler interrupted. The async read-write wrappers stop admitting readers into such a level. The async read-write locks forget a hold whose backend release failed after the backend let go, and they free the memory of each acquire that times out or is canceled.AsyncFileLockreturns fromrelease()after a few hundred acquires gave up behind a waiting one. An exception from a signal handler delivered while anAsyncFileLockcall joins its queue no longer blocks every later call on that lock. #833 by @gaborbernat.ReadWriteLockacting on-journal,-walor-shmfiles another process puts beside its database: a write could land in another file, a reader could get in beside a writer, and an acquire could fail. SQLite now opens the database by name only in a directory no other account can write, and through a private hard link elsewhere. On Windows the directory's access control list decides. Where hard links are unavailable, keep the database in a directory other accounts cannot write, such as one under%LOCALAPPDATA%. The lock removes link directories through a checked descriptor rather than by name, reads a link directory's name only when the locking account owns it, and leaves alone a directory with other content renamed onto a link directory's name. A database whose schema takes more than a few kilobytes to load raisesValueErrorinstead of running past the acquire timeout. #834 by @gaborbernat.UnixFileLockno longer truncates a file it did not create, such as one renamed to the lock path, and no longer appliesmodeto it. Anon_acquiredhook that writes holder metadata now truncates the file itself. A lease (Linux) or an oplock (Windows) on the lock file or a soft lock's marker no longer holdsacquire()past itstimeoutorblocking=False, and an oplock no longer holdsrelease();ReadWriteLockon Windows waits for itstimeoutand raisesTimeout. On Windows, amodewithout group and other bits, such as0o600, now creates the lock file with an owner-only permission list; theReadWriteLockdatabase gets the same. The soft locks' writability check no longer follows a symlink swapped in at the lock path. On a filesystem withoutflock, a contender from another account now waits on a marker it cannot write instead of raisingPermissionError. #835 by @gaborbernat.SoftFileLock,MarkerSoftFileLockandSoftFileLeaseremoving a live holder's marker in three cases: the holder and the contender run in Linux time namespaces with different boottime offsets; only one of them can read the boot id; a process other than the owner rewrote the marker. Soft markers no longer carry group or other write bits. A process name containing a carriage return or another line separator no longer makes the stale check raiseValueError. When/proc/self/ns/timeexists but cannot be read, the stale check no longer compares start times and keeps the marker. #836 by @gaborbernat.AsyncSoftReadWriteLockgives back one level on release, so synchronous readers of a shared singleton keep theirs.SoftReadWriteLocktracks read levels per thread:release()from a thread that holds none raisesRuntimeError. After its heartbeat recorded a lost hold, it refuses new acquires until that hold is released. #838 by @gaborbernat.StrictSoftFileLockcreates<path>.filelockand itsclaimsdirectory with the lock'smodeand sets the sticky bit (a directory flag that lets only a file's owner remove it) on both. On the next acquisition it narrows a directory it owns that an earlier release created wider; it leaves a directory of another account as it is, so remove such leftovers by hand. It reachesclaimsthrough a descriptor opened without following symlinks; on Windows it holds both directories open and refuses a junction (a directory that points at another directory). Under a sticky parent such as/tmpit refuses a coordination directory of another account, asSoftReadWriteLockdoes for<path>.rw. One read grace now covers a whole claim scan, a failed claim cleanup no longer leaves the sentinel descriptor open, and a non-regular node at a sentinel private-record name raisesSoftFileLockProtocolError. On Windows, contenders read claims without blocking their owner's unlink. #839 by @gaborbernat.acquireorrelease. A release that a signal handler cuts short after it has started now completes before the error propagates. A handler that acquires the lock its own thread is releasing now getsRuntimeErrorinstead of a hold that stays held. The singleton cache no longer hands out anis_singleton=Truelock or aReadWriteLockwhose finalizer is running, which released the new holder's lock. A signal duringos.fork()no longer leaves the other threads blocked in their next lock call, and a fork from another thread no longer waits for aReadWriteLockacquire on a busy database. #840 by @gaborbernat.is_singleton=Truelookup no longer returns a cached lock whose relative path now resolves to another file; a held lock still matches the file it holds. A rename of the lock's directory during a hold no longer leaves the marker behind or reports a false lease compromise, and a waiter no longer creates a second lock file in a directory that was renamed away. #841 by @gaborbernat.SoftReadWriteLockreaches its records through descriptors of<path>.rwandgenorholdersopened without following symlinks. On Windows it holds those directories open and refuses a junction (a directory that points at another directory). A tree swapped in after an earlier acquire therefore cannot redirect them. Its heartbeat rewrites a holder record only when the name still leads to the file it created, and does not block on a FIFO (a named pipe). A heartbeat that finds<path>.rwreplaced by a symlink or junction reports the hold lost instead of ending the heartbeat thread. A live lock object repeats the ownership check whenever the tree it opens is not the one it prepared. #842 by @gaborbernat.SoftFileLock,MarkerSoftFileLockandSoftFileLeaseremoving or displacing a live holder's marker in five cases. ext4 gave a freed inode number to the next marker. A stalledFileLockremoved itsENOSYSplaceholder after a peer replaced it. A failed acquire cleaned up after a successor took the path. A stale break left the lock path empty while it checked the marker it had moved. Alifetimebreak judged a marker by a reused inode number. On Linux and macOS a stale marker now changes hands in one atomic exchange. On other platforms without one, except Windows, including NFS and SMB, the marker stays in place and waits fortimeoutorbreak_lock(). Restoring a marker no longer follows a symlink found under the break name. A holder that releases while a peer's exchange has its marker aside leaves a record no lock parses, so the put-back lands a marker that ages out. A lease heartbeat that finds another file at the lock path once, while a peer's break has its marker aside, waits for the next refresh before it reports a compromise. A contender that finds a dead breaker's marker puts back the marker that breaker left under its break name. A marker is the breaker's own only when it names the breaker's process on this host; the same process number on another host is a holder. A contender takes a stranded marker under a name of its own before it puts the marker back, so two contenders no longer reverse each other's exchange and remove the live holder's marker. A claim left behind by a failed put-back is retried on the next poll. #843 by @gaborbernat.AsyncReadWriteLockorAsyncSoftReadWriteLockacquire that waits for another process now stops the wait and raises the cancellation. It used to wait until that process released, or raiseTimeout. Athread_local=TrueAsyncFileLockthat threads with their own event loops share no longer deadlocks when one thread waits for the lock while another holds it. #844 by @gaborbernat.SoftReadWriteLockrefuses a commit that lands a whole retention window behind the log, so two committers stalled at adjacent generations can no longer admit a second writer. Its stale check samples the clock before it reads a holder record, so a pause between the two no longer counts as time the record stayed unchanged. #845 by @gaborbernat.SoftFileLockcontender evicting an empty marker after two seconds while its owner held the lock. The owner is aSoftFileLockbefore 3.22, which writes nothing into its marker, or a current one still writing its record. An empty marker now reads as held, andtimeout,lifetimeorbreak_lock()clears it. A contender that finds an empty marker a dead breaker left aside puts it back instead of removing it. #846 by @gaborbernat.ReadWriteLockon Windows acting on-journaland-walfiles another account places beside its database: an acquire could fail withOperationalError, or SQLite could replay the journal and delete the file it names. The lock now reads the database directory's access control list. Where an account other than the locking account,SYSTEMandAdministratorscan add or remove names, SQLite opens a hard link inside a directory only those accounts can write. A filesystem without hard links raisesOSError. #854 by @gaborbernat.SoftReadWriteLocksubclasses sharing singleton instances with the base class or sibling subclasses. Each concrete class now keeps its own cache and construction guard, including after fork, while preserving cooperative class-definition keywords. #855 by @AryanRG.PyPI release
Full Changelog
v4.2.0Compare Source
Bug fixes
StrictSoftFileLockraisingSoftFileLockProtocolErroron Windows when a contender read a claim whose owner was still finishing its unlink. #829 by @gaborbernat.Performance
import filelockis about twice as fast: lock types other thanFileLockload on first use. #831 by @gaborbernat.🐍 PyPI release
📜 Full Changelog
v4.1.2Compare Source
Bug fixes
sqlite_masterfor the schema probe. #827 by @DawnofGenX.IsADirectoryError(orPermissionErroron Windows) for a directory lock path regardless of its write permissions. #822 by @feiiiiii5.AsyncReadWriteLockworker thread was between two operations. #828 by @gaborbernat.PyPI release
Full Changelog
v4.1.1Compare Source
Bug fixes
/dev/fdlookup implicated in a kernel panic by opening SQLite through a validated hard link. The database directory must be writable and support hard links; alias creation failure raisesOSError. #820 by @gaborbernat.ReadWriteLockhard-link directory names so forged owners cannot abort acquisition. #821 by @dxbjavid.PyPI release
Full Changelog
v4.1.0Compare Source
Features
OwnerMode,CompromiseReasonandhas_fcntlfromfilelock. #790 by @gaborbernat.AcquireReturnProxyis generic in the lock type, sowith lock.acquire() as held:typesheldas the lock's own class. #803 by @gaborbernat.Timeoutfrom a soft lock names a holder on another host or in another PID namespace, which no contender ever reclaims. #815 by @gaborbernat.DecimalorFraction, as a file lock'stimeoutalready did, and a read-write lock or lease refuses aboolor string one. #815 by @gaborbernat.Bug fixes
is_lock_held_by_usandis_lock_held_by_usreturnFalsefor a marker an earlier process with the same PID left behind. #774 by @lprnmns.SoftFileLockremoves its marker when writing it fails and closing the descriptor fails too, so the lock path no longer stays blocked. #775 by @harbinresearcher.acquireandacquireno longer wait pasttimeoutwhenpoll_intervalis longer than the time left. #777 by @feiiiiii5.SoftReadWriteLockignores a generation-log entry whose name is not 20 ASCII digits, which used to stop its heartbeat thread or delete real generations. #778 by @dxbjavid.ReadWriteLock,SoftReadWriteLockand their async wrappers treat ainftimeout like-1and raiseValueErrorfor a blockingnanone. #779 by @darrenhuai.ReadWriteLockandSoftReadWriteLockaccept a timeout aboveTIMEOUT_MAXinstead of raisingOverflowError. #780 by @darrenhuai.acquireraisesValueErrorfor a blockingnantimeout or apoll_intervalaboveTIMEOUT_MAX, and treats ainftimeout like-1. #781 by @gaborbernat.SoftFileLockandMarkerSoftFileLocktreat a marker cut before its final newline as malformed, so a crash-truncated record self-heals and a read mid-write no longer breaks a live lock. #782 by @gaborbernat.UnixFileLockno longer deletes another process's live marker when it falls back to a soft lock onENOSYS, and on macOS a lock path ending in a separator raisesFileNotFoundErrorinstead of retrying. #785 by @gaborbernat.SoftFileLockandSoftFileLeaseput back a live successor's marker that a racing stale break moved aside, so a third contender no longer acquires beside the successor. #786 by @gaborbernat.StrictSoftFileLockremoves every claim a failed acquire published, counts anEEXISTlink that landed as published, and no longer reportsis_lockedafter a failed claim cleanup. #787 by @gaborbernat.exceptiongroupbackport, a release failure under the defaultcontext_error_policyno longer turns intoModuleNotFoundError; cleanup failures chain instead of grouping, andon_acquiredis allowed. #788 by @gaborbernat.AsyncReadWriteLockandAsyncSoftReadWriteLockdrop a task's hold when a caller cancels it during a release that still completes, instead of blocking every later writer. #789 by @gaborbernat.SoftFileLeasereleases a lease dropped while held, at garbage collection or interpreter exit, and raisesValueErrorfor aheartbeat_intervalaboveTIMEOUT_MAX. #791 by @gaborbernat.StrictSoftFileLockjudges an abandoned private record's age by the filesystem's clock, so a client clock ahead of an NFS server no longer aborts live publications. #792 by @gaborbernat.BaseAsyncFileLockraisesRuntimeErrorinstead ofCancelledErrorwhen its executor shuts down with the call still queued, and a waiter interrupted by anything else no longer wedges later calls. #793 by @gaborbernat.ReadWriteLockon a held database no longer drops the holder's lock, so other processes stay excluded. #794 by @gaborbernat.SoftReadWriteLockno longer admits a second writer after<path>.rwis removed under a live instance, and flushes each snapshot before publishing it so a crash cannot leave an empty one that wedges every peer. #795 by @gaborbernat.SoftFileLeasereclaims a deadMarkerSoftFileLockowner, and expires a lease or a malformed soft marker after it stays unchanged on the contender's own monotonic clock, so clock skew cannot break it. #796 by @gaborbernat.SoftReadWriteLock.close()makes an acquire still waiting in another thread raiseRuntimeError, where it used to take the lock on the closed instance and hold it until the process exited. #798 by @gaborbernat.SoftReadWriteLockreads the head fromgen/HEAD, so a client whose cached directory listing is more than 64 generations stale no longer takes an old generation for the head and forks the log. #799 by @gaborbernat.BaseAsyncFileLock, it releases on alooprunning in another thread, or in place once no loop is left; thelifetimecheck and path resolution now run in the executor. #800 by @gaborbernat.SoftReadWriteLockwaits out a holder's ownstale_thresholdbefore evicting it, keys its singleton on the path its log sits beside, and no longer leaks ledger entries or the holder record of a failed acquire. #801 by @gaborbernat.lock_descriptorraisesValueErrorfor a blockingpoll_intervalaboveTIMEOUT_MAXup front, instead ofOverflowErroronce the descriptor is contended. #802 by @sricharanreddycheruku.BaseFileLockrejects aboolor string timeout, an out-of-rangemodeand a non-boolblockingset at any time, rejects unknown options on a singleton cache hit, and tracks anon_acquiredreacquire. #803 by @gaborbernat.StrictSoftFileLockraisesSoftFileLockProtocolErrornaming a directory, symlink or exited soft-lock owner's marker at the lock path, andlock_path_occupantshows what blocks it. #804 by @gaborbernat.ReadWriteLockraisesValueErrorfor a WAL-mode database instead ofdisk I/O error, and its/dev/fdfallback links beside the database, so a lock off the TMPDIR filesystem no longer fails withEXDEV. #805 by @gaborbernat.ReadWriteLock.release()from a thread that holds no read level raisesRuntimeErrorinstead of ending another thread's read lock and letting a writer in. #806 by @gaborbernat.SoftFileLockLifetimeWarningderives fromFutureWarninginstead ofDeprecationWarning, so Python shows it by default outside__main__. #807 by @gaborbernat.SoftFileLockapplies an explicitmodepast the umask asUnixFileLockdoes, and reads a marker number spelled other than in ASCII digits, or a lease with an empty token, as malformed. #807 by @gaborbernat.ReadWriteLockraisesOSErrorwhen its database is unlinked or replaced while an acquisition waits, instead of taking a lock that no later opener sees. #808 by @gaborbernat.releasewithforce=Trueand garbage collection release holds exited threads left, and arelease()re-entered from a signal handler closes the descriptor once. #810 by @gaborbernat.SoftFileLeaserecords alease_durationgiven as afloatsubclass, such as NumPy's, in a form every contender parses, so a live lease is no longer evicted as malformed. #815 by @gaborbernat.StrictSoftFileLockraisesSoftFileLockProtocolErrorfor a file at the lock path it cannot parse once it stays unchanged for two seconds, instead of waiting on it forever. #815 by @gaborbernat.BaseFileLock.timeoutfrom a string emits aDeprecationWarningand from aboolraisesTypeError; pass the number of seconds instead. #815 by @gaborbernat.ValueErrorfor a timeout too large for afloat, and a singleton accepts a timeout that waits as long as the cached one, such asinffor-1. #815 by @gaborbernat.ReadWriteLockconnects through a private hard link, so cycling a lock beside a holder no longer adds an open descriptor per connection. #815 by @gaborbernat.SoftFileLockandSoftFileLeasere-check a stale marker right before breaking it, so a marker recreated since the check is no longer moved aside for a third contender to take the path. #815 by @gaborbernat.RuntimeError, where it used to hang that thread or leave the lock held after the outer release. #815 by @gaborbernat.BaseAsyncFileLocksingleton the garbage collector finalizes leaves the singleton cache first, so a new lock on the path waits for its release instead of re-entering a hold that release then drops. #815 by @gaborbernat.BaseAsyncFileLockreleases every thread's hold, including one on a daemon thread's event loop at interpreter exit, instead of leaving it held. #815 by @gaborbernat.SoftFileLockand its marker and lease variants no longer leave their marker behind when a signal handler interrupts a release; the retried release, or the next acquire on Windows, removes it. #815 by @gaborbernat.SoftReadWriteLockraisesValueErrorfor aheartbeat_intervalaboveTIMEOUT_MAX, which killed its heartbeat thread, and an interrupted release still removes its record. #815 by @gaborbernat.AsyncReadWriteLockreleases only its own hold on a singleton it shares with synchronous users, where it used to end their read transaction too. #815 by @gaborbernat.Documentation
og:urland sitemap entries point at the versioned page on Read the Docs instead of a domain-root URL that returns 404. #813 by @gaborbernat.🐍 PyPI release
📜 Full Changelog
v4.0.12Compare Source
Bug fixes
sqlite_masterfor the schema probe. #769 by @Vikram12301.PyPI release
Full Changelog
v4.0.11Compare Source
Bug fixes
ReadWriteLockandAsyncReadWriteLockuse a validated private hard link when/dev/fdhas no entry for the database descriptor, supporting NetBSD's static descriptor directory beyond descriptor 63. The temporary location must share a filesystem with the database. The symlink refusal test accepts NetBSD's error wording by @gaborbernat.PyPI release
Full Changelog
v4.0.10Compare Source
Bug fixes
AsyncFileLockwith anotherloop,executororrun_in_executor, or a singletonSoftFileLeasewith anotherlease_duration,heartbeat_intervaloron_compromise, now raisesValueErrorinstead of returning the lock with its original options. #765 by @kokotatan.PyPI release
Full Changelog
v4.0.9Compare Source
Bug fixes
ReadWriteLockandAsyncReadWriteLockclose the descriptor that checks the database path once SQLite has connected, so on PyPy a dropped lock leaves no descriptor open until garbage collection runs. #763 by @gaborbernat.Security
ReadWriteLockandAsyncReadWriteLockrefuse a symlink at the database path instead of following it, so a user who can create names in a shared lock directory cannot point the lock at another file (GHSA-j8f7-rjxc-mr56) by @gaborbernat.PyPI release
Full Changelog
v4.0.8Compare Source
Bug fixes
ReadWriteLock.release()andSoftReadWriteLock.release()from a thread that does not hold the write lock now raiseRuntimeErrorinstead of dropping the holder's lock and letting a second writer in. #761 by @feiiiiii5.PyPI release
Full Changelog
v4.0.7Compare Source
Bug fixes
ValueErrorat construction whenmodedenies the owner read or write, such asmode=0o444, instead of failing on a later acquire and staying broken until someone deletes the lock file. #760 by @gaborbernat.PyPI release
Full Changelog
v4.0.6Compare Source
Bug fixes
-1before reentrantReadWriteLockandSoftReadWriteLockacquisition. Preserve unlimited waits and nonblocking acquisition. #756 by @feiiiiii5.PyPI release
Full Changelog
v4.0.5Compare Source
Bug fixes
MarkerSoftFileLockacquisition and prevent contenders from evicting live protocol-2 owners after two seconds. Reclaim recognized records after owner death; preserve unknown contracts. #751 by @DawnofGenX.timeoutandblockingsettings in sync and asyncReadWriteLockacquisition, including waits between tasks on one instance. Preserve explicit per-call overrides. #752 by @DawnofGenX.0o000files. Keep mode-bit checks enabled for privileged processes on filesystems that support POSIX permissions. #753 by @pasmud.StrictSoftFileLockclaims after a read-permission retry expires. Recheck the directory before raising a protocol error so concurrent removal does not turn a stale claim listing into an acquisition failure. #754 by @januththedev.-1in blockingAsyncReadWriteLockandAsyncSoftReadWriteLockacquisitions. Keep-1as an unlimited wait and ignore timeouts whenblocking=False. #755 by @pasmud.PyPI release
Full Changelog
v4.0.4Compare Source
Bug fixes
PyPI release
Full Changelog
v4.0.3Compare Source
Bug fixes
RuntimeError: Cannot install a trace function while another trace function is being installedunder coverage or a debugger. filelock skips its fork-safety audit hook there, so forking from inside a thread's own lock-state transition no longer raises immediately on those versions. #747 by @gaborbernat.PyPI release
Full Changelog
v4.0.2Compare Source
Bug fixes
acquire()andrelease()on athread_local=Falselock no longer leak the OS lock, close a descriptor twice, drop a lease token, or leave a false deadlock after a cross-thread release (#744). #745 by @gaborbernat.AsyncReadWriteLockandAsyncSoftReadWriteLocknow give eachasynciotask its own hold, so tasks sharing one instance no longer enter the write lock together. #746 by @gaborbernat.PyPI release
Full Changelog
v4.0.1Compare Source
Bug fixes
poll_intervalis now validated at construction, on the setter, and onacquire(): a negative, non-finite, or non-numeric value raisesValueError/TypeErrorimmediately instead of failing insidetime.sleep. #739 by @Pitchfork-and-Torch.PyPI release
Full Changelog
v4.0.0Compare Source
Features
SoftReadWriteLockexposesgenerationas a fencing token for the protected resource and reports a lost hold throughon_compromiseandcompromise. #738 by @gaborbernat.Bug fixes
SoftReadWriteLockon-disk protocol is a generation log under<path>.rw, and a process running an earlier release does not see it: an old and a new participant on one lock path do not exclude each other. Stop every participant, upgrade them all, then restart them; the new code ignores leftover.state,.writeand.readers/files, and you can delete them. The filesystem must provide no-replace hard links, as it must forStrictSoftFileLock, so a runtime withoutos.linkraisesSoftFileLockProtocolErroron acquire. Constructing a singleton again with a differenton_compromise, or withpoll_intervalat or abovestale_threshold, now raisesValueError. #738 by @gaborbernat.SoftReadWriteLockno longer deadlocks when a holder dies on another host mid-transition, andrelease()no longer waits on a mutex a dead host left behind. The state mutex is gone. Each transition is one atomic snapshot commit, and liveness is a heartbeat nonce read on the observer's own clock rather than anmtimeread against another host's. #738 by @gaborbernat.PyPI release
Full Changelog
Configuration
📅 Schedule: (UTC)
🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.
♻ Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.
🔕 Ignore: Close this PR and you won't be reminded about this update again.
This PR was generated by Mend Renovate. View the repository job log.