Change bed303e9b4 introduced the ability
to set timeout without blocking, but this caused a few problems.
- The acquire method has now different arguments according to
a backend driver being used
- The change broke the existing usage with blocking=<number>
This addresses these two problems.
Change-Id: I8cefa2f4a940082d17cde43d132a818940422176
See https://bugs.debian.org/1040271. In fact, I believe the Python
warning is right, so fixing it.
Change-Id: Ice2a90180c00d0d7a2e1f3b78d5e6222703f4acd
md5 is not an approved algorithm in FIPS mode, and trying to
instantiate a hashlib.md5() will fail when the system is running in
FIPS mode.
md5 is allowed when in a non-security context. There is a plan to
add a keyword parameter (usedforsecurity) to hashlib.md5() to annotate
whether or not the instance is being used in a security context.
In the case where it is not, the instantiation of md5 will be allowed.
See https://bugs.python.org/issue9216 for more details.
Some downstream python versions already support this parameter. To
support these versions, a new encapsulation of md5() has been added to
oslo_utils. See https://review.opendev.org/#/c/750031/
This patch is to replace the instances of hashlib.md5() with this new
encapsulation, adding an annotation indicating whether the usage is
a security context or not.
Reviewers need to pay particular attention as to whether the keyword
parameter (usedforsecurity) is set correctly.
Change-Id: Idbef0f0896753765372c8dfac8ab15e6be49922f
Depends-On: https://review.opendev.org/#/c/760160
If you're not intimately familiar with RFC 1808 it can be a bit tricky to
write tooz connection strings. In addition, some drivers do not document the
options that they recognize in a connection string. This can force a user to
read the driver code in order to figure out how to configure tooz to use said
driver, which should not be the case.
This change more explicitly documents the format of the connection string,
including which parts of an RFC 1808 URI it recognizes, and the options that
can be passed. It also clarifies which parts of the connection string are
optional (possibly because they have defaults) and which must always be
included.
Note that not every possible configuration is documented. For example, the
postgres driver supports multiple methods of configuring the connection host
and port. For consistency, I only documented the one that matches the other
drivers. This should be sufficient to allow a user to write a working
connection string.
This change also wires the etcd3 and etcd3gw drivers into the doc index since
they were missing before.
Change-Id: I66e54433115f27fb54badc2173f8f6044c49aacb
The connection is supposedly closed when blocking is False and the lock is not
acquired. Or when an exception happens in the locking code.
But if blocking is e.g. 5 seconds, then RetryError is raised but without
closing any connection at the end. This fixes that.
Change-Id: I7b40e466fe5fc01ee3f8c012f765aafca9ce716a
each lock creates it's own connection and only gets released when
garbage collection kicks in because of limitations
change logic so if we don't have lock, we don't have connection.
Change-Id: Ibf6eaf3ff3031424917e9fdb6920bf2fc1808b7c
Currently each driver in tooz only support exclusive lock, it is
inefficient in some scenarios which only need shared lock.
This patch adds shared lock in file driver.
Change-Id: I55a528977e74b27da736f421d2eee28c7aae8aa3
Implements: blueprint support-shared-lock
Co-Authored-By: Julien Danjou <julien@danjou.info>
Passing None makes psycopg2 >= 2.7 use the string "None" as a role rather than
nothing like it used to do.
Change-Id: Idf575930ea363a7e7e613ebdca4595a9ca8f7389
Any coordinator that implements (and they all should) group membership
needs a member_id field and copy it to self. Just do that by default for
all driver at __init__ time.
Change-Id: I66d82815afd4c6e9354212e5ab3fba17931c1bbc
This adds a method implement the common pattern of joining a group and
creating it if it does not exist.
Change-Id: Ie46e7c1d07599a20bd8c24e28e5936b9f47a8bf4
The current PostgreSQL driver only look for the host option in URL,
whereas it should also look for the hostname in the URL!
This patch makes sure you can override URL values with options, but also
read those URL values.
Change-Id: I70a13c2f61bdd3a04fd2b0ed4cbf8b2ca96cfec6
If connection fails to be established, the acquired attribute does not
exist and then you see warning such has:
Exception AttributeError: "'MySQLLock' object has no attribute 'acquired'" in
<bound method MySQLLock.__del__ of <tooz.drivers.mysql.MySQLLock object at 0x7f79479056d0>>
Change-Id: Id61775483c91ba4127d9dd8cb56d6629a51d7081
Some of the returns were missing, so to ensure that the
interface is consistent ensure that we always return true
or false as needed, and add tests to ensure this keeps on
being maintained.
Change-Id: I877111c3a1d1d300881625c5900d4a825c5f1684
Instead of having each driver index the last value of
each option, when all current drivers do not actually care
about any of the other indexes we can just use and provide
a option collapsing function that we by default apply to
all the existing drivers options (to avoid needing to index
by -1).
This avoids a confusion point for new folks, and one that
does not currently really provide any value (no driver in
tree besides one option in the redis driver uses/consumes
or understands multiple options in the first place).
Change-Id: Ia2898d84fd0e54871b829f4a95786a33accc20b8
Ensure that on python versions that can retain
the exceptions associated chain/causes that we make
an attempt to retain them, on versions of python
that do not have this at least attempt to retain the
chain (but we will not get the nice stack formatting
that comes along with that).
Change-Id: I7b46854c3969463009c39be28a3131d2d3179c82
This change adds a test to ensure that lock acquired from different
threads/processes work as expected. And fixes drivers when they won't.
With file driver, when two threads acquire the lock, when the first one
releases it, the second get a 'ValueError: I/O operation on closed file'
because the first have closed the file after releasing the lock.
Now, the file is open when the lock object is created and we let the GC
to close it when we don't need it anymore
With mysql, postgres, kazoo driver, multiple acquire inside the same
backend session, doesn't work like a exclusive lock, so we track the
status locally when we get the lock inside a process.
Change-Id: Ic990a79c9baebe534409c1a433e21f4a2f9a7d6a
Multiple calls to get_coord(name) should returns a different lock object
This is not true for all drivers. This change fixes that.
Change-Id: Ie14f0f252cc54317867efb3b0490b90078fff32b
Start to add/build a developer oriented doc that
can be further refined to explain to developers how
to use the different tooz drivers (and what the varying
drivers capabilities are).
Change-Id: I49f6bf5b397d6bc5426c074f6196c764c8938d23
Instead of raising raw psycopg2 errors/exceptions from the
postgresql driver we should make an attempt to translate
those errors/exceptions into a equivalent tooz exception to
make it so that users of tooz can handle the known driver
failure modes in a sane manner (users expecting to user tooz
as a pluggable abstraction will not be able to handle raw
psycopg2 errors/exceptions, especially if those users are
using different tooz backends at the same time).
Change-Id: Ic95e5fa21bb25096a31b5c5e38aa0b14afa05d87