From 591150b9e9dc4770e02a112567b9aaf970e90245 Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Wed, 12 May 2021 16:44:50 +0800 Subject: [PATCH 1/2] Add spec and tar Signed-off-by: Fan Zhang --- kazoo-2.2.1.tar.gz | Bin 0 -> 108037 bytes python-kazoo.spec | 2132 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 2132 insertions(+) create mode 100644 kazoo-2.2.1.tar.gz create mode 100644 python-kazoo.spec diff --git a/kazoo-2.2.1.tar.gz b/kazoo-2.2.1.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..5472a0197f28370e9304143be9d7ac50c2ec67d7 GIT binary patch literal 108037 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ℜ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 T^!5Gxik3wbO!UP8_RBv3W^rvE literal 0 HcmV?d00001 diff --git a/python-kazoo.spec b/python-kazoo.spec new file mode 100644 index 0000000..83625e1 --- /dev/null +++ b/python-kazoo.spec @@ -0,0 +1,2132 @@ +%global _empty_manifest_terminate_build 0 +Name: python-kazoo +Version: 2.2.1 +Release: 1 +Summary: Higher Level Zookeeper Client +License: Apache-2.0 +URL: https://kazoo.readthedocs.org +Source0: https://files.pythonhosted.org/packages/60/5c/210aa291f9b5be2d0424d512a04dea2f06db816f27289ad1080e267129ec/kazoo-2.2.1.tar.gz +BuildArch: noarch +%description +===== +Kazoo +===== + +.. image:: https://travis-ci.org/python-zk/kazoo.svg?branch=master + :target: https://travis-ci.org/python-zk/kazoo + :alt: Travis Build + +.. image:: https://img.shields.io/pypi/v/kazoo.svg + :target: https://pypi.python.org/pypi/kazoo/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/dm/kazoo.svg + :target: https://pypi.python.org/pypi/kazoo/ + :alt: Downloads + +``kazoo`` implements a higher level API to `Apache Zookeeper`_ for Python +clients. + +See `the full docs`_ for more information. + +License +======= + +``kazoo`` is offered under the Apache License 2.0. + +Authors +======= + +``kazoo`` started under the `Nimbus Project`_ and through collaboration with +the open-source community has been merged with code from `Mozilla`_ and the +`Zope Corporation`_. It has since gathered an active community of over two +dozen contributors. + +.. _Apache Zookeeper: http://zookeeper.apache.org/ +.. _the full docs: http://kazoo.rtfd.org/ +.. _Nimbus Project: http://www.nimbusproject.org/ +.. _Zope Corporation: http://zope.com/ +.. _Mozilla: http://www.mozilla.org/ + + +Changelog +========= + +2.2.1 (2015-06-17) +------------------ + +Features +******** + +Bug Handling +************ +- handle NameError with basestring on py3k. + +Documentation +************* + +2.2 (2015-06-15) +---------------- + +Documentation +************* + +Features +******** + +- Issue #234: Add support for reconfig cluster membership operation + +Bug Handling +************ + +- #315: multiple acquires of a kazoo lock using the lock recipe would + block when using `acquire` even when non-blocking is specified (only + when the lock was/has been already acquired). +- #318: At exit register takes ``*args`` and ``**kwargs`` not args and kargs + +Documentation +************* + +2.1 (2015-05-11) +---------------- + +Features +******** + +- Start running tests against Zookeeper 3.5.0 alpha and explicitly configure + the `admin.serverPort` in tests to avoid port conflicts. The Zookeeper + alpha version is not yet officially supported. +- Integrate eventlet *handler* support into kazoo so that along with [gevent, + threading] handlers there can now be a dedicated eventlet handler for + projects that need to (or want to) use eventlet (such as those working + in the openstack community). The ``requirements_eventlet.txt`` file lists + the optional eventlet requirement(s) that needs to be satisfied when this + new handler is used. +- Use ``six`` to nicely handle the cross compatibility of kazoo with + python 2.x and 3.x (reducing/removing the need to have custom compatibility + code that replicates what six already provides). +- Add ``state_change_event`` to ``kazoo.recipe.partitioner.SetPartitioner`` + which is set on every state change. +- Add a NonBlockingLease recipe. The recipe allows e.g. cron jobs scheduled + on multiple machines to ensure that at most N instances will run a particular + job, with lease timeout for graceful handover in case of node failures. + + +Bug Handling +************ + +- #291: Kazoo lock recipe was only partially re-entrant in that multiple + calls to `acquire` would obtain the the lock but the first call to `release` + would remove the underlying lock. This would leave the X - 1 other `acquire` + statements unprotected (and no longer holding there expected lock). To fix + this the comment about that lock recipe being re-entrant has been removed + and multiple acquires will now block when attempted. + +- #78: Kazoo now uses socketpairs instead of pipes making it compatible with + Windows. + +- #144, #221: Let `client.command` work with IPv6 addresses. + +- #216: Fixed timeout for ConnectionHandler._invoke. + +- #261: Creating a sequential znode under / doesn't work. + +- #274: Add server_version() retries (by default 4 attempts will be made) to + better handle flakey responses. + +- #271: Fixed handling of KazooState.SUSPENDED in SetPartitioner. + +- #283: Fixed a race condition in SetPartitioner when party changes during + handling of lock acquisition. + +- #303: don't crash on random input as the hosts string. + +Documentation +************* + +- #222: Document that committed on the transaction is used to ensure only one + commit and is not an indicator of whether operations in the transaction + returned desired results. + +2.0 (2014-06-19) +---------------- + +Documentation +************* + +- Extend support to Python 3.4, deprecating Python 3.2. +- Issue #198: Mention Zake as a sophisticated kazoo mock testing library. +- Issue #181: Add documentation on basic logging setup. + + +2.0b1 (2014-04-24) +------------------ + +API Changes +*********** + +- Null or None data is no longer treated as "". Pull req #165, patch by + Raul Gutierrez S. This will affect how you should treat null data in a + znode vs. an empty string. +- Passing acl=[] to create() now works properly instead of an InvalidACLError + as it returned before. Patch by Raul Gutierrez S in PR #164. +- Removed the dependency on zope.interface. The classes in the interfaces + module are left for documentation purposes only (issue #131). + +Features +******** + +- Logging levels have been reduced. + + - Logging previously at the ``logging.DEBUG`` level is now logged at + the ``kazoo.loggingsupport.BLATHER`` level (5). + + - Some low-level logging previously at the ``logging.INFO`` level is + now logged at the ``logging.DEBUG`` level. + +- Issue #133: Introduce a new environment variable `ZOOKEEPER_PORT_OFFSET` + for the testing support, to run the testing cluster on a different range. + +Bug Handling +************ + +- When authenticating via add_auth() the auth data will be saved to ensure that + the authentication happens on reconnect (as is the case when feeding auth + data via KazooClient's constructor). PR #172, patch by Raul Gutierrez S. +- Change gevent import to remove deprecation warning when newer gevent is + used. PR #191, patch by Hiroaki Kawai. +- Lock recipe was failing to use the client's sleep_func causing issues with + gevent. Issue #150. +- Calling a DataWatch or ChildrenWatch instance twice (decorator) now throws + an exception as only a single function can be associated with a single + watcher. Issue #154. +- Another fix for atexit handling so that when disposing of connections the + atexit handler is removed. PR #190, patch by Devaev Maxim. +- Fix atexit handling for kazoo threading handler, PR #183. Patch by + Brian Wickman. +- Partitioner should handle a suspended connection properly and restore + an allocated state if it was allocated previously. Patch by Manish Tomar. +- Issue #167: Closing a client that was never started throws a type error. + Patch by Joshua Harlow. +- Passing dictionaries to KazooClient.__init__() wasn't actually working + properly. Patch by Ryan Uber. +- Issue #119: Handler timeout takes the max of the random interval or + the read timeout to ensure a negative number isn't used for the read + timeout. +- Fix ordering of exception catches in lock.acquire as it was capturing a + parent exception before the child. Patch by ReneSac. +- Fix issue with client.stop() not always setting the client state to + KeeperState.CLOSED. Patch by Jyrki Pulliainen in PR #174. +- Issue #169: Fixed pipes leaking into child processes. + +Documentation +************* + +- Add section on contributing recipes, add maintainer/status information for + existing recipes. +- Add note about alternate use of DataWatch. + +1.3.1 (2013-09-25) +------------------ + +Bug Handling +************ + +- #118, #125, #128: Fix unknown variable in KazooClient `command_retry` + argument handling. + +- #126: Fix `KazooRetry.copy` to correctly copy sleep function. + +- #118: Correct session/socket timeout conversion (int vs. float). + +Documentation +************* + +- #121: Add a note about `kazoo.recipe.queue.LockingQueue` requiring a + Zookeeper 3.4+ server. + + +1.3 (2013-09-05) +---------------- + +Features +******** + +- #115: Limit the backends we use for SLF4J during tests. + +- #112: Add IPv6 support. Patch by Dan Kruchinin. + +1.2.1 (2013-08-01) +------------------ + +Bug Handling +************ + +- Issue #108: Circular import fail when importing kazoo.recipe.watchers + directly has now been resolved. Watchers and partitioner properly import + the KazooState from kazoo.protocol.states rather than kazoo.client. +- Issue #109: Partials not usable properly as a datawatch call can now be + used. All funcs will be called with 3 args and fall back to 2 args if + there's an argument error. +- Issue #106, #107: `client.create_async` didn't strip change root from the + returned path. + +1.2 (2013-07-24) +---------------- + +Features +******** + +- KazooClient can now be stopped more reliably even if its in the middle + of a long retry sleep. This utilizes the new interrupt feature of + KazooRetry which lets the sleep be broken down into chunks and an + interrupt function called to determine if the retry should fail early. + +- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a + max deadline, transition properly when connection fails to LOST, and + setup separate connection retry behavior from client command retry + behavior. Patches by Mike Lundy. + +- Issue #100: Make it easier to see exception context in threading and + connection modules. + +- Issue #85: Increase information density of logs and don't prevent + dynamic reconfiguration of log levels at runtime. + +- Data-watchers for the same node are no longer 'stacked'. That is, if + a get and an exists call occur for the same node with the same watch + function, then it will be registered only once. This change results in + Kazoo behaving per Zookeeper client spec regarding repeat watch use. + +Bug Handling +************ + +- Issue #53: Throw a warning upon starting if the chroot path doesn't exist + so that it's more obvious when the chroot should be created before + performing more operations. + +- Kazoo previously would let the same function be registered as a data-watch + or child-watch multiple times, and then call it multiple times upon being + triggered. This was non-compliant Zookeeper client behavior, the same + watch can now only be registered once for the same znode path per Zookeeper + client documentation. + +- Issue #105: Avoid rare import lock problems by moving module imports in + client.py to the module scope. + +- Issue #103: Allow prefix-less sequential znodes. + +- Issue #98: Extend testing ZK harness to work with different file locations + on some versions of Debian/Ubuntu. + +- Issue #97: Update some docstrings to reflect current state of handlers. + +- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a + max deadline, transition properly when connection fails to LOST, and + setup separate connection retry behavior from client command retry + behavior. Patches by Mike Lundy. + +API Changes +*********** + +- The `kazoo.testing.harness.KazooTestHarness` class directly inherits from + `unittest.TestCase` and you need to ensure to call its `__init__` method. + +- DataWatch no longer takes any parameters besides for the optional function + during instantiation. The additional options are now implicitly True, with + the user being left to ignore events as they choose. See the DataWatch + API docs for more information. + +- Issue #99: Better exception raised when the writer fails to close. A + WriterNotClosedException that inherits from KazooException is now raised + when the writer fails to close in time. + +1.1 (2013-06-08) +---------------- + +Features +******** + +- Issue #93: Add timeout option to lock/semaphore acquire methods. + +- Issue #79 / #90: Add ability to pass the WatchedEvent to DataWatch and + ChildWatch functions. + +- Respect large client timeout values when closing the connection. + +- Add a `max_leases` consistency check to the semaphore recipe. + +- Issue #76: Extend testing helpers to allow customization of the Java + classpath by specifying the new `ZOOKEEPER_CLASSPATH` environment variable. + +- Issue #65: Allow non-blocking semaphore acquisition. + +Bug Handling +************ + +- Issue #96: Provide Windows compatibility in testing harness. + +- Issue #95: Handle errors deserializing connection response. + +- Issue #94: Clean up stray bytes in connection pipe. + +- Issue #87 / #88: Allow re-acquiring lock after cancel. + +- Issue #77: Use timeout in initial socket connection. + +- Issue #69: Only ensure path once in lock and semaphore recipes. + +- Issue #68: Closing the connection causes exceptions to be raised by watchers + which assume the connection won't be closed when running commands. + +- Issue #66: Require ping reply before sending another ping, otherwise the + connection will be considered dead and a ConnectionDropped will be raised + to trigger a reconnect. + +- Issue #63: Watchers weren't reset on lost connection. + +- Issue #58: DataWatcher failed to re-register for changes after non-existent + node was created then deleted. + +API Changes +*********** + +- KazooClient.create_async now supports the makepath argument. + +- KazooClient.ensure_path now has an async version, ensure_path_async. + +1.0 (2013-03-26) +---------------- + +Features +******** + +- Added a LockingQueue recipe. The queue first locks an item and removes it + from the queue only after the consume() method is called. This enables other + nodes to retake the item if an error occurs on the first node. + +Bug Handling +************ + +- Issue #50: Avoid problems with sleep function in mixed gevent/threading + setup. + +- Issue #56: Avoid issues with watch callbacks evaluating to false. + +1.0b1 (2013-02-24) +------------------ + +Features +******** + +- Refactored the internal connection handler to use a single thread. It now + uses a deque and pipe to signal the ZK thread that there's a new command to + send, so that the ZK thread can send it, or retrieve a response. + Processing ZK requests and responses serially in a single thread eliminates + the need for a bunch of the locking, the peekable queue and two threads + working on the same underlying socket. + +- Issue #48: Added documentation for the `retry` helper module. + +- Issue #55: Fix `os.pipe` file descriptor leak and introduce a + `KazooClient.close` method. The method is particular useful in tests, where + multiple KazooClients are created and closed in the same process. + +Bug Handling +************ + +- Issue #46: Avoid TypeError in GeneratorContextManager on process shutdown. + +- Issue #43: Let DataWatch return node data if allow_missing_node is used. + +0.9 (2013-01-07) +---------------- + +API Changes +*********** + +- When a retry operation ultimately fails, it now raises a + `kazoo.retry.RetryFailedError` exception, instead of a general `Exception` + instance. `RetryFailedError` also inherits from the base `KazooException`. + +Features +******** + +- Improvements to Debian packaging rules. + +Bug Handling +************ + +- Issue #39 / #41: Handle connection dropped errors during session writes. + Ensure client connection is re-established to a new ZK node if available. + +- Issue #38: Set `CLOEXEC` flag on all sockets when available. + +- Issue #37 / #40: Handle timeout errors during `select` calls on sockets. + +- Issue #36: Correctly set `ConnectionHandler.writer_stopped` even if an + exception is raised inside the writer, like a retry operation failing. + +0.8 (2012-10-26) +---------------- + +API Changes +*********** + +- The `KazooClient.__init__` took as `watcher` argument as its second keyword + argument. The argument had no effect anymore since version 0.5 and was + removed. + +Bug Handling +************ + +- Issue #35: `KazooClient.__init__` didn't pass on `retry_max_delay` to the + retry helper. + +- Issue #34: Be more careful while handling socket connection errors. + +0.7 (2012-10-15) +---------------- + +Features +******** + +- DataWatch now has a `allow_missing_node` setting that allows a watch to be + set on a node that doesn't exist when the DataWatch is created. +- Add new Queue recipe, with optional priority support. +- Add new Counter recipe. +- Added debian packaging rules. + +Bug Handling +************ + +- Issue #31 fixed: Only catch KazooExceptions in catch-all calls. +- Issue #15 fixed again: Force sleep delay to be a float to appease gevent. +- Issue #29 fixed: DataWatch and ChildrenWatch properly re-register their + watches on server disconnect. + +0.6 (2012-09-27) +---------------- + +API Changes +*********** + +- Node paths are assumed to be Unicode objects. Under Python 2 pure-ascii + strings will also be accepted. Node values are considered bytes. The byte + type is an alias for `str` under Python 2. +- New KeeperState.CONNECTED_RO state for Zookeeper servers connected in + read-only mode. +- New NotReadOnlyCallError exception when issuing a write change against a + server thats currently read-only. + +Features +******** + +- Add support for Python 3.2, 3.3 and PyPy (only for the threading handler). +- Handles connecting to Zookeeper 3.4+ read-only servers. +- Automatic background scanning for a Read/Write server when connected to a + server in read-only mode. +- Add new Semaphore recipe. +- Add a new `retry_max_delay` argument to the client and by default limit the + retry delay to at most an hour regardless of exponential backoff settings. +- Add new `randomize_hosts` argument to `KazooClient`, allowing one to disable + host randomization. + +Bug Handling +************ + +- Fix bug with locks not handling intermediary lock contenders disappearing. +- Fix bug with set_data type check failing to catch unicode values. +- Fix bug with gevent 0.13.x backport of peekable queue. +- Fix PatientChildrenWatch to use handler specific sleep function. + +0.5 (2012-09-06) +---------------- + +Skipping a version to reflect the magnitude of the change. Kazoo is now a pure +Python client with no C bindings. This release should run without a problem +on alternate Python implementations such as PyPy and Jython. Porting to Python +3 in the future should also be much easier. + +Documentation +************* + +- Docs have been restructured to handle the new classes and locations of the + methods from the pure Python refactor. + +Bug Handling +************ + +This change may introduce new bugs, however there is no longer the possibility +of a complete Python segfault due to errors in the C library and/or the C +binding. + +- Possible segfaults from the C lib are gone. +- Password mangling due to the C lib is gone. +- The party recipes didn't set their participating flag to False after + leaving. + +Features +******** + +- New `client.command` and `client.server_version` API, exposing Zookeeper's + four letter commands and giving access to structured version information. +- Added 'include_data' option for get_children to include the node's Stat + object. +- Substantial increase in logging data with debug mode. All correspondence with + the Zookeeper server can now be seen to help in debugging. + +API Changes +*********** + +- The testing helpers have been moved from `testing.__init__` into a + `testing.harness` module. The official API's of `KazooTestCase` and + `KazooTestHarness` can still be directly imported from `testing`. +- The kazoo.handlers.util module was removed. +- Backwards compatible exception class aliases are provided for now in kazoo + exceptions for the prior C exception names. +- Unicode strings now work fine for node names and are properly converted to + and from unicode objects. +- The data value argument for the create and create_async methods of the + client was made optional and defaults to an empty byte string. The data + value must be a byte string. Unicode values are no longer allowed and + will raise a TypeError. + + +0.3 (2012-08-23) +---------------- + +API Changes +*********** + +- Handler interface now has an rlock_object for use by recipes. + +Bug Handling +************ + +- Fixed password bug with updated zc-zookeeper-static release, which retains + null bytes in the password properly. +- Fixed reconnect hammering, so that the reconnection follows retry jitter and + retry backoff's. +- Fixed possible bug with using a threading.Condition in the set partitioner. + Set partitioner uses new rlock_object handler API to get an appropriate RLock + for gevent. +- Issue #17 fixed: Wrap timeout exceptions with staticmethod so they can be + used directly as intended. Patch by Bob Van Zant. +- Fixed bug with client reconnection looping indefinitely using an expired + session id. + +0.2 (2012-08-12) +---------------- + +Documentation +************* + +- Fixed doc references to start_async using an AsyncResult object, it uses + an Event object. + +Bug Handling +************ + +- Issue #16 fixed: gevent zookeeper logging failed to handle a monkey patched + logging setup. Logging is now setup such that a greenlet is used for logging + messages under gevent, and the thread one is used otherwise. +- Fixed bug similar to #14 for ChildrenWatch on the session listener. +- Issue #14 fixed: DataWatch had inconsistent handling of the node it was + watching not existing. DataWatch also properly spawns its _get_data function + to avoid blocking session events. +- Issue #15 fixed: sleep_func for SequentialGeventHandler was not set on the + class appropriately leading to additional arguments being passed to + gevent.sleep. +- Issue #9 fixed: Threads/greenlets didn't gracefully shut down. Handler now + has a start/stop that is used by the client when calling start and stop that + shuts down the handler workers. This addresses errors and warnings that could + be emitted upon process shutdown regarding a clean exit of the workers. +- Issue #12 fixed: gevent 0.13 doesn't use the same start_new_thread as gevent + 1.0 which resulted in a fully monkey-patched environment halting due to the + wrong thread. Updated to use the older kazoo method of getting the real thread + module object. + +API Changes +*********** + +- The KazooClient handler is now officially exposed as KazooClient.handler + so that the appropriate sync objects can be used by end-users. +- Refactored ChildrenWatcher used by SetPartitioner into a publicly exposed + PatientChildrenWatch under recipe.watchers. + +Deprecations +************ + +- connect/connect_async has been renamed to start/start_async to better match + the stop to indicate connection handling. The prior names are aliased for + the time being. + +Recipes +******* + +- Added Barrier and DoubleBarrier implementation. + +0.2b1 (2012-07-27) +------------------ + +Bug Handling +************ + +- ZOOKEEPER-1318: SystemError is caught and rethrown as the proper invalid + state exception in older zookeeper python bindings where this issue is still + valid. +- ZOOKEEPER-1431: Install the latest zc-zookeeper-static library or use the + packaged ubuntu one for ubuntu 12.04 or later. +- ZOOKEEPER-553: State handling isn't checked via this method, we track it in + a simpler manner with the watcher to ensure we know the right state. + +Features +******** + +- Exponential backoff with jitter for retrying commands. +- Gevent 0.13 and 1.0b support. +- Lock, Party, SetPartitioner, and Election recipe implementations. +- Data and Children watching API's. +- State transition handling with listener registering to handle session state + changes (choose to fatal the app on session expiration, etc.) +- Zookeeper logging stream redirected into Python logging channel under the + name 'Zookeeper'. +- Base client library with handler support for threading and gevent async + environments. + +%package -n python2-kazoo +Summary: Higher Level Zookeeper Client +Provides: python-kazoo +BuildRequires: python2-devel +BuildRequires: python2-setuptools +Requires: python2-six +Requires: python2-six +Requires: python2-coverage +Requires: python2-mock +Requires: python2-nose +Requires: python2-flake8 +Requires: python2-gevent +Requires: python2-eventlet +%description -n python2-kazoo +===== +Kazoo +===== + +.. image:: https://travis-ci.org/python-zk/kazoo.svg?branch=master + :target: https://travis-ci.org/python-zk/kazoo + :alt: Travis Build + +.. image:: https://img.shields.io/pypi/v/kazoo.svg + :target: https://pypi.python.org/pypi/kazoo/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/dm/kazoo.svg + :target: https://pypi.python.org/pypi/kazoo/ + :alt: Downloads + +``kazoo`` implements a higher level API to `Apache Zookeeper`_ for Python +clients. + +See `the full docs`_ for more information. + +License +======= + +``kazoo`` is offered under the Apache License 2.0. + +Authors +======= + +``kazoo`` started under the `Nimbus Project`_ and through collaboration with +the open-source community has been merged with code from `Mozilla`_ and the +`Zope Corporation`_. It has since gathered an active community of over two +dozen contributors. + +.. _Apache Zookeeper: http://zookeeper.apache.org/ +.. _the full docs: http://kazoo.rtfd.org/ +.. _Nimbus Project: http://www.nimbusproject.org/ +.. _Zope Corporation: http://zope.com/ +.. _Mozilla: http://www.mozilla.org/ + + +Changelog +========= + +2.2.1 (2015-06-17) +------------------ + +Features +******** + +Bug Handling +************ +- handle NameError with basestring on py3k. + +Documentation +************* + +2.2 (2015-06-15) +---------------- + +Documentation +************* + +Features +******** + +- Issue #234: Add support for reconfig cluster membership operation + +Bug Handling +************ + +- #315: multiple acquires of a kazoo lock using the lock recipe would + block when using `acquire` even when non-blocking is specified (only + when the lock was/has been already acquired). +- #318: At exit register takes ``*args`` and ``**kwargs`` not args and kargs + +Documentation +************* + +2.1 (2015-05-11) +---------------- + +Features +******** + +- Start running tests against Zookeeper 3.5.0 alpha and explicitly configure + the `admin.serverPort` in tests to avoid port conflicts. The Zookeeper + alpha version is not yet officially supported. +- Integrate eventlet *handler* support into kazoo so that along with [gevent, + threading] handlers there can now be a dedicated eventlet handler for + projects that need to (or want to) use eventlet (such as those working + in the openstack community). The ``requirements_eventlet.txt`` file lists + the optional eventlet requirement(s) that needs to be satisfied when this + new handler is used. +- Use ``six`` to nicely handle the cross compatibility of kazoo with + python 2.x and 3.x (reducing/removing the need to have custom compatibility + code that replicates what six already provides). +- Add ``state_change_event`` to ``kazoo.recipe.partitioner.SetPartitioner`` + which is set on every state change. +- Add a NonBlockingLease recipe. The recipe allows e.g. cron jobs scheduled + on multiple machines to ensure that at most N instances will run a particular + job, with lease timeout for graceful handover in case of node failures. + + +Bug Handling +************ + +- #291: Kazoo lock recipe was only partially re-entrant in that multiple + calls to `acquire` would obtain the the lock but the first call to `release` + would remove the underlying lock. This would leave the X - 1 other `acquire` + statements unprotected (and no longer holding there expected lock). To fix + this the comment about that lock recipe being re-entrant has been removed + and multiple acquires will now block when attempted. + +- #78: Kazoo now uses socketpairs instead of pipes making it compatible with + Windows. + +- #144, #221: Let `client.command` work with IPv6 addresses. + +- #216: Fixed timeout for ConnectionHandler._invoke. + +- #261: Creating a sequential znode under / doesn't work. + +- #274: Add server_version() retries (by default 4 attempts will be made) to + better handle flakey responses. + +- #271: Fixed handling of KazooState.SUSPENDED in SetPartitioner. + +- #283: Fixed a race condition in SetPartitioner when party changes during + handling of lock acquisition. + +- #303: don't crash on random input as the hosts string. + +Documentation +************* + +- #222: Document that committed on the transaction is used to ensure only one + commit and is not an indicator of whether operations in the transaction + returned desired results. + +2.0 (2014-06-19) +---------------- + +Documentation +************* + +- Extend support to Python 3.4, deprecating Python 3.2. +- Issue #198: Mention Zake as a sophisticated kazoo mock testing library. +- Issue #181: Add documentation on basic logging setup. + + +2.0b1 (2014-04-24) +------------------ + +API Changes +*********** + +- Null or None data is no longer treated as "". Pull req #165, patch by + Raul Gutierrez S. This will affect how you should treat null data in a + znode vs. an empty string. +- Passing acl=[] to create() now works properly instead of an InvalidACLError + as it returned before. Patch by Raul Gutierrez S in PR #164. +- Removed the dependency on zope.interface. The classes in the interfaces + module are left for documentation purposes only (issue #131). + +Features +******** + +- Logging levels have been reduced. + + - Logging previously at the ``logging.DEBUG`` level is now logged at + the ``kazoo.loggingsupport.BLATHER`` level (5). + + - Some low-level logging previously at the ``logging.INFO`` level is + now logged at the ``logging.DEBUG`` level. + +- Issue #133: Introduce a new environment variable `ZOOKEEPER_PORT_OFFSET` + for the testing support, to run the testing cluster on a different range. + +Bug Handling +************ + +- When authenticating via add_auth() the auth data will be saved to ensure that + the authentication happens on reconnect (as is the case when feeding auth + data via KazooClient's constructor). PR #172, patch by Raul Gutierrez S. +- Change gevent import to remove deprecation warning when newer gevent is + used. PR #191, patch by Hiroaki Kawai. +- Lock recipe was failing to use the client's sleep_func causing issues with + gevent. Issue #150. +- Calling a DataWatch or ChildrenWatch instance twice (decorator) now throws + an exception as only a single function can be associated with a single + watcher. Issue #154. +- Another fix for atexit handling so that when disposing of connections the + atexit handler is removed. PR #190, patch by Devaev Maxim. +- Fix atexit handling for kazoo threading handler, PR #183. Patch by + Brian Wickman. +- Partitioner should handle a suspended connection properly and restore + an allocated state if it was allocated previously. Patch by Manish Tomar. +- Issue #167: Closing a client that was never started throws a type error. + Patch by Joshua Harlow. +- Passing dictionaries to KazooClient.__init__() wasn't actually working + properly. Patch by Ryan Uber. +- Issue #119: Handler timeout takes the max of the random interval or + the read timeout to ensure a negative number isn't used for the read + timeout. +- Fix ordering of exception catches in lock.acquire as it was capturing a + parent exception before the child. Patch by ReneSac. +- Fix issue with client.stop() not always setting the client state to + KeeperState.CLOSED. Patch by Jyrki Pulliainen in PR #174. +- Issue #169: Fixed pipes leaking into child processes. + +Documentation +************* + +- Add section on contributing recipes, add maintainer/status information for + existing recipes. +- Add note about alternate use of DataWatch. + +1.3.1 (2013-09-25) +------------------ + +Bug Handling +************ + +- #118, #125, #128: Fix unknown variable in KazooClient `command_retry` + argument handling. + +- #126: Fix `KazooRetry.copy` to correctly copy sleep function. + +- #118: Correct session/socket timeout conversion (int vs. float). + +Documentation +************* + +- #121: Add a note about `kazoo.recipe.queue.LockingQueue` requiring a + Zookeeper 3.4+ server. + + +1.3 (2013-09-05) +---------------- + +Features +******** + +- #115: Limit the backends we use for SLF4J during tests. + +- #112: Add IPv6 support. Patch by Dan Kruchinin. + +1.2.1 (2013-08-01) +------------------ + +Bug Handling +************ + +- Issue #108: Circular import fail when importing kazoo.recipe.watchers + directly has now been resolved. Watchers and partitioner properly import + the KazooState from kazoo.protocol.states rather than kazoo.client. +- Issue #109: Partials not usable properly as a datawatch call can now be + used. All funcs will be called with 3 args and fall back to 2 args if + there's an argument error. +- Issue #106, #107: `client.create_async` didn't strip change root from the + returned path. + +1.2 (2013-07-24) +---------------- + +Features +******** + +- KazooClient can now be stopped more reliably even if its in the middle + of a long retry sleep. This utilizes the new interrupt feature of + KazooRetry which lets the sleep be broken down into chunks and an + interrupt function called to determine if the retry should fail early. + +- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a + max deadline, transition properly when connection fails to LOST, and + setup separate connection retry behavior from client command retry + behavior. Patches by Mike Lundy. + +- Issue #100: Make it easier to see exception context in threading and + connection modules. + +- Issue #85: Increase information density of logs and don't prevent + dynamic reconfiguration of log levels at runtime. + +- Data-watchers for the same node are no longer 'stacked'. That is, if + a get and an exists call occur for the same node with the same watch + function, then it will be registered only once. This change results in + Kazoo behaving per Zookeeper client spec regarding repeat watch use. + +Bug Handling +************ + +- Issue #53: Throw a warning upon starting if the chroot path doesn't exist + so that it's more obvious when the chroot should be created before + performing more operations. + +- Kazoo previously would let the same function be registered as a data-watch + or child-watch multiple times, and then call it multiple times upon being + triggered. This was non-compliant Zookeeper client behavior, the same + watch can now only be registered once for the same znode path per Zookeeper + client documentation. + +- Issue #105: Avoid rare import lock problems by moving module imports in + client.py to the module scope. + +- Issue #103: Allow prefix-less sequential znodes. + +- Issue #98: Extend testing ZK harness to work with different file locations + on some versions of Debian/Ubuntu. + +- Issue #97: Update some docstrings to reflect current state of handlers. + +- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a + max deadline, transition properly when connection fails to LOST, and + setup separate connection retry behavior from client command retry + behavior. Patches by Mike Lundy. + +API Changes +*********** + +- The `kazoo.testing.harness.KazooTestHarness` class directly inherits from + `unittest.TestCase` and you need to ensure to call its `__init__` method. + +- DataWatch no longer takes any parameters besides for the optional function + during instantiation. The additional options are now implicitly True, with + the user being left to ignore events as they choose. See the DataWatch + API docs for more information. + +- Issue #99: Better exception raised when the writer fails to close. A + WriterNotClosedException that inherits from KazooException is now raised + when the writer fails to close in time. + +1.1 (2013-06-08) +---------------- + +Features +******** + +- Issue #93: Add timeout option to lock/semaphore acquire methods. + +- Issue #79 / #90: Add ability to pass the WatchedEvent to DataWatch and + ChildWatch functions. + +- Respect large client timeout values when closing the connection. + +- Add a `max_leases` consistency check to the semaphore recipe. + +- Issue #76: Extend testing helpers to allow customization of the Java + classpath by specifying the new `ZOOKEEPER_CLASSPATH` environment variable. + +- Issue #65: Allow non-blocking semaphore acquisition. + +Bug Handling +************ + +- Issue #96: Provide Windows compatibility in testing harness. + +- Issue #95: Handle errors deserializing connection response. + +- Issue #94: Clean up stray bytes in connection pipe. + +- Issue #87 / #88: Allow re-acquiring lock after cancel. + +- Issue #77: Use timeout in initial socket connection. + +- Issue #69: Only ensure path once in lock and semaphore recipes. + +- Issue #68: Closing the connection causes exceptions to be raised by watchers + which assume the connection won't be closed when running commands. + +- Issue #66: Require ping reply before sending another ping, otherwise the + connection will be considered dead and a ConnectionDropped will be raised + to trigger a reconnect. + +- Issue #63: Watchers weren't reset on lost connection. + +- Issue #58: DataWatcher failed to re-register for changes after non-existent + node was created then deleted. + +API Changes +*********** + +- KazooClient.create_async now supports the makepath argument. + +- KazooClient.ensure_path now has an async version, ensure_path_async. + +1.0 (2013-03-26) +---------------- + +Features +******** + +- Added a LockingQueue recipe. The queue first locks an item and removes it + from the queue only after the consume() method is called. This enables other + nodes to retake the item if an error occurs on the first node. + +Bug Handling +************ + +- Issue #50: Avoid problems with sleep function in mixed gevent/threading + setup. + +- Issue #56: Avoid issues with watch callbacks evaluating to false. + +1.0b1 (2013-02-24) +------------------ + +Features +******** + +- Refactored the internal connection handler to use a single thread. It now + uses a deque and pipe to signal the ZK thread that there's a new command to + send, so that the ZK thread can send it, or retrieve a response. + Processing ZK requests and responses serially in a single thread eliminates + the need for a bunch of the locking, the peekable queue and two threads + working on the same underlying socket. + +- Issue #48: Added documentation for the `retry` helper module. + +- Issue #55: Fix `os.pipe` file descriptor leak and introduce a + `KazooClient.close` method. The method is particular useful in tests, where + multiple KazooClients are created and closed in the same process. + +Bug Handling +************ + +- Issue #46: Avoid TypeError in GeneratorContextManager on process shutdown. + +- Issue #43: Let DataWatch return node data if allow_missing_node is used. + +0.9 (2013-01-07) +---------------- + +API Changes +*********** + +- When a retry operation ultimately fails, it now raises a + `kazoo.retry.RetryFailedError` exception, instead of a general `Exception` + instance. `RetryFailedError` also inherits from the base `KazooException`. + +Features +******** + +- Improvements to Debian packaging rules. + +Bug Handling +************ + +- Issue #39 / #41: Handle connection dropped errors during session writes. + Ensure client connection is re-established to a new ZK node if available. + +- Issue #38: Set `CLOEXEC` flag on all sockets when available. + +- Issue #37 / #40: Handle timeout errors during `select` calls on sockets. + +- Issue #36: Correctly set `ConnectionHandler.writer_stopped` even if an + exception is raised inside the writer, like a retry operation failing. + +0.8 (2012-10-26) +---------------- + +API Changes +*********** + +- The `KazooClient.__init__` took as `watcher` argument as its second keyword + argument. The argument had no effect anymore since version 0.5 and was + removed. + +Bug Handling +************ + +- Issue #35: `KazooClient.__init__` didn't pass on `retry_max_delay` to the + retry helper. + +- Issue #34: Be more careful while handling socket connection errors. + +0.7 (2012-10-15) +---------------- + +Features +******** + +- DataWatch now has a `allow_missing_node` setting that allows a watch to be + set on a node that doesn't exist when the DataWatch is created. +- Add new Queue recipe, with optional priority support. +- Add new Counter recipe. +- Added debian packaging rules. + +Bug Handling +************ + +- Issue #31 fixed: Only catch KazooExceptions in catch-all calls. +- Issue #15 fixed again: Force sleep delay to be a float to appease gevent. +- Issue #29 fixed: DataWatch and ChildrenWatch properly re-register their + watches on server disconnect. + +0.6 (2012-09-27) +---------------- + +API Changes +*********** + +- Node paths are assumed to be Unicode objects. Under Python 2 pure-ascii + strings will also be accepted. Node values are considered bytes. The byte + type is an alias for `str` under Python 2. +- New KeeperState.CONNECTED_RO state for Zookeeper servers connected in + read-only mode. +- New NotReadOnlyCallError exception when issuing a write change against a + server thats currently read-only. + +Features +******** + +- Add support for Python 3.2, 3.3 and PyPy (only for the threading handler). +- Handles connecting to Zookeeper 3.4+ read-only servers. +- Automatic background scanning for a Read/Write server when connected to a + server in read-only mode. +- Add new Semaphore recipe. +- Add a new `retry_max_delay` argument to the client and by default limit the + retry delay to at most an hour regardless of exponential backoff settings. +- Add new `randomize_hosts` argument to `KazooClient`, allowing one to disable + host randomization. + +Bug Handling +************ + +- Fix bug with locks not handling intermediary lock contenders disappearing. +- Fix bug with set_data type check failing to catch unicode values. +- Fix bug with gevent 0.13.x backport of peekable queue. +- Fix PatientChildrenWatch to use handler specific sleep function. + +0.5 (2012-09-06) +---------------- + +Skipping a version to reflect the magnitude of the change. Kazoo is now a pure +Python client with no C bindings. This release should run without a problem +on alternate Python implementations such as PyPy and Jython. Porting to Python +3 in the future should also be much easier. + +Documentation +************* + +- Docs have been restructured to handle the new classes and locations of the + methods from the pure Python refactor. + +Bug Handling +************ + +This change may introduce new bugs, however there is no longer the possibility +of a complete Python segfault due to errors in the C library and/or the C +binding. + +- Possible segfaults from the C lib are gone. +- Password mangling due to the C lib is gone. +- The party recipes didn't set their participating flag to False after + leaving. + +Features +******** + +- New `client.command` and `client.server_version` API, exposing Zookeeper's + four letter commands and giving access to structured version information. +- Added 'include_data' option for get_children to include the node's Stat + object. +- Substantial increase in logging data with debug mode. All correspondence with + the Zookeeper server can now be seen to help in debugging. + +API Changes +*********** + +- The testing helpers have been moved from `testing.__init__` into a + `testing.harness` module. The official API's of `KazooTestCase` and + `KazooTestHarness` can still be directly imported from `testing`. +- The kazoo.handlers.util module was removed. +- Backwards compatible exception class aliases are provided for now in kazoo + exceptions for the prior C exception names. +- Unicode strings now work fine for node names and are properly converted to + and from unicode objects. +- The data value argument for the create and create_async methods of the + client was made optional and defaults to an empty byte string. The data + value must be a byte string. Unicode values are no longer allowed and + will raise a TypeError. + + +0.3 (2012-08-23) +---------------- + +API Changes +*********** + +- Handler interface now has an rlock_object for use by recipes. + +Bug Handling +************ + +- Fixed password bug with updated zc-zookeeper-static release, which retains + null bytes in the password properly. +- Fixed reconnect hammering, so that the reconnection follows retry jitter and + retry backoff's. +- Fixed possible bug with using a threading.Condition in the set partitioner. + Set partitioner uses new rlock_object handler API to get an appropriate RLock + for gevent. +- Issue #17 fixed: Wrap timeout exceptions with staticmethod so they can be + used directly as intended. Patch by Bob Van Zant. +- Fixed bug with client reconnection looping indefinitely using an expired + session id. + +0.2 (2012-08-12) +---------------- + +Documentation +************* + +- Fixed doc references to start_async using an AsyncResult object, it uses + an Event object. + +Bug Handling +************ + +- Issue #16 fixed: gevent zookeeper logging failed to handle a monkey patched + logging setup. Logging is now setup such that a greenlet is used for logging + messages under gevent, and the thread one is used otherwise. +- Fixed bug similar to #14 for ChildrenWatch on the session listener. +- Issue #14 fixed: DataWatch had inconsistent handling of the node it was + watching not existing. DataWatch also properly spawns its _get_data function + to avoid blocking session events. +- Issue #15 fixed: sleep_func for SequentialGeventHandler was not set on the + class appropriately leading to additional arguments being passed to + gevent.sleep. +- Issue #9 fixed: Threads/greenlets didn't gracefully shut down. Handler now + has a start/stop that is used by the client when calling start and stop that + shuts down the handler workers. This addresses errors and warnings that could + be emitted upon process shutdown regarding a clean exit of the workers. +- Issue #12 fixed: gevent 0.13 doesn't use the same start_new_thread as gevent + 1.0 which resulted in a fully monkey-patched environment halting due to the + wrong thread. Updated to use the older kazoo method of getting the real thread + module object. + +API Changes +*********** + +- The KazooClient handler is now officially exposed as KazooClient.handler + so that the appropriate sync objects can be used by end-users. +- Refactored ChildrenWatcher used by SetPartitioner into a publicly exposed + PatientChildrenWatch under recipe.watchers. + +Deprecations +************ + +- connect/connect_async has been renamed to start/start_async to better match + the stop to indicate connection handling. The prior names are aliased for + the time being. + +Recipes +******* + +- Added Barrier and DoubleBarrier implementation. + +0.2b1 (2012-07-27) +------------------ + +Bug Handling +************ + +- ZOOKEEPER-1318: SystemError is caught and rethrown as the proper invalid + state exception in older zookeeper python bindings where this issue is still + valid. +- ZOOKEEPER-1431: Install the latest zc-zookeeper-static library or use the + packaged ubuntu one for ubuntu 12.04 or later. +- ZOOKEEPER-553: State handling isn't checked via this method, we track it in + a simpler manner with the watcher to ensure we know the right state. + +Features +******** + +- Exponential backoff with jitter for retrying commands. +- Gevent 0.13 and 1.0b support. +- Lock, Party, SetPartitioner, and Election recipe implementations. +- Data and Children watching API's. +- State transition handling with listener registering to handle session state + changes (choose to fatal the app on session expiration, etc.) +- Zookeeper logging stream redirected into Python logging channel under the + name 'Zookeeper'. +- Base client library with handler support for threading and gevent async + environments. + +%package help +Summary: Development documents and examples for kazoo +Provides: python2-kazoo-doc +%description help +===== +Kazoo +===== + +.. image:: https://travis-ci.org/python-zk/kazoo.svg?branch=master + :target: https://travis-ci.org/python-zk/kazoo + :alt: Travis Build + +.. image:: https://img.shields.io/pypi/v/kazoo.svg + :target: https://pypi.python.org/pypi/kazoo/ + :alt: Latest Version + +.. image:: https://img.shields.io/pypi/dm/kazoo.svg + :target: https://pypi.python.org/pypi/kazoo/ + :alt: Downloads + +``kazoo`` implements a higher level API to `Apache Zookeeper`_ for Python +clients. + +See `the full docs`_ for more information. + +License +======= + +``kazoo`` is offered under the Apache License 2.0. + +Authors +======= + +``kazoo`` started under the `Nimbus Project`_ and through collaboration with +the open-source community has been merged with code from `Mozilla`_ and the +`Zope Corporation`_. It has since gathered an active community of over two +dozen contributors. + +.. _Apache Zookeeper: http://zookeeper.apache.org/ +.. _the full docs: http://kazoo.rtfd.org/ +.. _Nimbus Project: http://www.nimbusproject.org/ +.. _Zope Corporation: http://zope.com/ +.. _Mozilla: http://www.mozilla.org/ + + +Changelog +========= + +2.2.1 (2015-06-17) +------------------ + +Features +******** + +Bug Handling +************ +- handle NameError with basestring on py3k. + +Documentation +************* + +2.2 (2015-06-15) +---------------- + +Documentation +************* + +Features +******** + +- Issue #234: Add support for reconfig cluster membership operation + +Bug Handling +************ + +- #315: multiple acquires of a kazoo lock using the lock recipe would + block when using `acquire` even when non-blocking is specified (only + when the lock was/has been already acquired). +- #318: At exit register takes ``*args`` and ``**kwargs`` not args and kargs + +Documentation +************* + +2.1 (2015-05-11) +---------------- + +Features +******** + +- Start running tests against Zookeeper 3.5.0 alpha and explicitly configure + the `admin.serverPort` in tests to avoid port conflicts. The Zookeeper + alpha version is not yet officially supported. +- Integrate eventlet *handler* support into kazoo so that along with [gevent, + threading] handlers there can now be a dedicated eventlet handler for + projects that need to (or want to) use eventlet (such as those working + in the openstack community). The ``requirements_eventlet.txt`` file lists + the optional eventlet requirement(s) that needs to be satisfied when this + new handler is used. +- Use ``six`` to nicely handle the cross compatibility of kazoo with + python 2.x and 3.x (reducing/removing the need to have custom compatibility + code that replicates what six already provides). +- Add ``state_change_event`` to ``kazoo.recipe.partitioner.SetPartitioner`` + which is set on every state change. +- Add a NonBlockingLease recipe. The recipe allows e.g. cron jobs scheduled + on multiple machines to ensure that at most N instances will run a particular + job, with lease timeout for graceful handover in case of node failures. + + +Bug Handling +************ + +- #291: Kazoo lock recipe was only partially re-entrant in that multiple + calls to `acquire` would obtain the the lock but the first call to `release` + would remove the underlying lock. This would leave the X - 1 other `acquire` + statements unprotected (and no longer holding there expected lock). To fix + this the comment about that lock recipe being re-entrant has been removed + and multiple acquires will now block when attempted. + +- #78: Kazoo now uses socketpairs instead of pipes making it compatible with + Windows. + +- #144, #221: Let `client.command` work with IPv6 addresses. + +- #216: Fixed timeout for ConnectionHandler._invoke. + +- #261: Creating a sequential znode under / doesn't work. + +- #274: Add server_version() retries (by default 4 attempts will be made) to + better handle flakey responses. + +- #271: Fixed handling of KazooState.SUSPENDED in SetPartitioner. + +- #283: Fixed a race condition in SetPartitioner when party changes during + handling of lock acquisition. + +- #303: don't crash on random input as the hosts string. + +Documentation +************* + +- #222: Document that committed on the transaction is used to ensure only one + commit and is not an indicator of whether operations in the transaction + returned desired results. + +2.0 (2014-06-19) +---------------- + +Documentation +************* + +- Extend support to Python 3.4, deprecating Python 3.2. +- Issue #198: Mention Zake as a sophisticated kazoo mock testing library. +- Issue #181: Add documentation on basic logging setup. + + +2.0b1 (2014-04-24) +------------------ + +API Changes +*********** + +- Null or None data is no longer treated as "". Pull req #165, patch by + Raul Gutierrez S. This will affect how you should treat null data in a + znode vs. an empty string. +- Passing acl=[] to create() now works properly instead of an InvalidACLError + as it returned before. Patch by Raul Gutierrez S in PR #164. +- Removed the dependency on zope.interface. The classes in the interfaces + module are left for documentation purposes only (issue #131). + +Features +******** + +- Logging levels have been reduced. + + - Logging previously at the ``logging.DEBUG`` level is now logged at + the ``kazoo.loggingsupport.BLATHER`` level (5). + + - Some low-level logging previously at the ``logging.INFO`` level is + now logged at the ``logging.DEBUG`` level. + +- Issue #133: Introduce a new environment variable `ZOOKEEPER_PORT_OFFSET` + for the testing support, to run the testing cluster on a different range. + +Bug Handling +************ + +- When authenticating via add_auth() the auth data will be saved to ensure that + the authentication happens on reconnect (as is the case when feeding auth + data via KazooClient's constructor). PR #172, patch by Raul Gutierrez S. +- Change gevent import to remove deprecation warning when newer gevent is + used. PR #191, patch by Hiroaki Kawai. +- Lock recipe was failing to use the client's sleep_func causing issues with + gevent. Issue #150. +- Calling a DataWatch or ChildrenWatch instance twice (decorator) now throws + an exception as only a single function can be associated with a single + watcher. Issue #154. +- Another fix for atexit handling so that when disposing of connections the + atexit handler is removed. PR #190, patch by Devaev Maxim. +- Fix atexit handling for kazoo threading handler, PR #183. Patch by + Brian Wickman. +- Partitioner should handle a suspended connection properly and restore + an allocated state if it was allocated previously. Patch by Manish Tomar. +- Issue #167: Closing a client that was never started throws a type error. + Patch by Joshua Harlow. +- Passing dictionaries to KazooClient.__init__() wasn't actually working + properly. Patch by Ryan Uber. +- Issue #119: Handler timeout takes the max of the random interval or + the read timeout to ensure a negative number isn't used for the read + timeout. +- Fix ordering of exception catches in lock.acquire as it was capturing a + parent exception before the child. Patch by ReneSac. +- Fix issue with client.stop() not always setting the client state to + KeeperState.CLOSED. Patch by Jyrki Pulliainen in PR #174. +- Issue #169: Fixed pipes leaking into child processes. + +Documentation +************* + +- Add section on contributing recipes, add maintainer/status information for + existing recipes. +- Add note about alternate use of DataWatch. + +1.3.1 (2013-09-25) +------------------ + +Bug Handling +************ + +- #118, #125, #128: Fix unknown variable in KazooClient `command_retry` + argument handling. + +- #126: Fix `KazooRetry.copy` to correctly copy sleep function. + +- #118: Correct session/socket timeout conversion (int vs. float). + +Documentation +************* + +- #121: Add a note about `kazoo.recipe.queue.LockingQueue` requiring a + Zookeeper 3.4+ server. + + +1.3 (2013-09-05) +---------------- + +Features +******** + +- #115: Limit the backends we use for SLF4J during tests. + +- #112: Add IPv6 support. Patch by Dan Kruchinin. + +1.2.1 (2013-08-01) +------------------ + +Bug Handling +************ + +- Issue #108: Circular import fail when importing kazoo.recipe.watchers + directly has now been resolved. Watchers and partitioner properly import + the KazooState from kazoo.protocol.states rather than kazoo.client. +- Issue #109: Partials not usable properly as a datawatch call can now be + used. All funcs will be called with 3 args and fall back to 2 args if + there's an argument error. +- Issue #106, #107: `client.create_async` didn't strip change root from the + returned path. + +1.2 (2013-07-24) +---------------- + +Features +******** + +- KazooClient can now be stopped more reliably even if its in the middle + of a long retry sleep. This utilizes the new interrupt feature of + KazooRetry which lets the sleep be broken down into chunks and an + interrupt function called to determine if the retry should fail early. + +- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a + max deadline, transition properly when connection fails to LOST, and + setup separate connection retry behavior from client command retry + behavior. Patches by Mike Lundy. + +- Issue #100: Make it easier to see exception context in threading and + connection modules. + +- Issue #85: Increase information density of logs and don't prevent + dynamic reconfiguration of log levels at runtime. + +- Data-watchers for the same node are no longer 'stacked'. That is, if + a get and an exists call occur for the same node with the same watch + function, then it will be registered only once. This change results in + Kazoo behaving per Zookeeper client spec regarding repeat watch use. + +Bug Handling +************ + +- Issue #53: Throw a warning upon starting if the chroot path doesn't exist + so that it's more obvious when the chroot should be created before + performing more operations. + +- Kazoo previously would let the same function be registered as a data-watch + or child-watch multiple times, and then call it multiple times upon being + triggered. This was non-compliant Zookeeper client behavior, the same + watch can now only be registered once for the same znode path per Zookeeper + client documentation. + +- Issue #105: Avoid rare import lock problems by moving module imports in + client.py to the module scope. + +- Issue #103: Allow prefix-less sequential znodes. + +- Issue #98: Extend testing ZK harness to work with different file locations + on some versions of Debian/Ubuntu. + +- Issue #97: Update some docstrings to reflect current state of handlers. + +- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a + max deadline, transition properly when connection fails to LOST, and + setup separate connection retry behavior from client command retry + behavior. Patches by Mike Lundy. + +API Changes +*********** + +- The `kazoo.testing.harness.KazooTestHarness` class directly inherits from + `unittest.TestCase` and you need to ensure to call its `__init__` method. + +- DataWatch no longer takes any parameters besides for the optional function + during instantiation. The additional options are now implicitly True, with + the user being left to ignore events as they choose. See the DataWatch + API docs for more information. + +- Issue #99: Better exception raised when the writer fails to close. A + WriterNotClosedException that inherits from KazooException is now raised + when the writer fails to close in time. + +1.1 (2013-06-08) +---------------- + +Features +******** + +- Issue #93: Add timeout option to lock/semaphore acquire methods. + +- Issue #79 / #90: Add ability to pass the WatchedEvent to DataWatch and + ChildWatch functions. + +- Respect large client timeout values when closing the connection. + +- Add a `max_leases` consistency check to the semaphore recipe. + +- Issue #76: Extend testing helpers to allow customization of the Java + classpath by specifying the new `ZOOKEEPER_CLASSPATH` environment variable. + +- Issue #65: Allow non-blocking semaphore acquisition. + +Bug Handling +************ + +- Issue #96: Provide Windows compatibility in testing harness. + +- Issue #95: Handle errors deserializing connection response. + +- Issue #94: Clean up stray bytes in connection pipe. + +- Issue #87 / #88: Allow re-acquiring lock after cancel. + +- Issue #77: Use timeout in initial socket connection. + +- Issue #69: Only ensure path once in lock and semaphore recipes. + +- Issue #68: Closing the connection causes exceptions to be raised by watchers + which assume the connection won't be closed when running commands. + +- Issue #66: Require ping reply before sending another ping, otherwise the + connection will be considered dead and a ConnectionDropped will be raised + to trigger a reconnect. + +- Issue #63: Watchers weren't reset on lost connection. + +- Issue #58: DataWatcher failed to re-register for changes after non-existent + node was created then deleted. + +API Changes +*********** + +- KazooClient.create_async now supports the makepath argument. + +- KazooClient.ensure_path now has an async version, ensure_path_async. + +1.0 (2013-03-26) +---------------- + +Features +******** + +- Added a LockingQueue recipe. The queue first locks an item and removes it + from the queue only after the consume() method is called. This enables other + nodes to retake the item if an error occurs on the first node. + +Bug Handling +************ + +- Issue #50: Avoid problems with sleep function in mixed gevent/threading + setup. + +- Issue #56: Avoid issues with watch callbacks evaluating to false. + +1.0b1 (2013-02-24) +------------------ + +Features +******** + +- Refactored the internal connection handler to use a single thread. It now + uses a deque and pipe to signal the ZK thread that there's a new command to + send, so that the ZK thread can send it, or retrieve a response. + Processing ZK requests and responses serially in a single thread eliminates + the need for a bunch of the locking, the peekable queue and two threads + working on the same underlying socket. + +- Issue #48: Added documentation for the `retry` helper module. + +- Issue #55: Fix `os.pipe` file descriptor leak and introduce a + `KazooClient.close` method. The method is particular useful in tests, where + multiple KazooClients are created and closed in the same process. + +Bug Handling +************ + +- Issue #46: Avoid TypeError in GeneratorContextManager on process shutdown. + +- Issue #43: Let DataWatch return node data if allow_missing_node is used. + +0.9 (2013-01-07) +---------------- + +API Changes +*********** + +- When a retry operation ultimately fails, it now raises a + `kazoo.retry.RetryFailedError` exception, instead of a general `Exception` + instance. `RetryFailedError` also inherits from the base `KazooException`. + +Features +******** + +- Improvements to Debian packaging rules. + +Bug Handling +************ + +- Issue #39 / #41: Handle connection dropped errors during session writes. + Ensure client connection is re-established to a new ZK node if available. + +- Issue #38: Set `CLOEXEC` flag on all sockets when available. + +- Issue #37 / #40: Handle timeout errors during `select` calls on sockets. + +- Issue #36: Correctly set `ConnectionHandler.writer_stopped` even if an + exception is raised inside the writer, like a retry operation failing. + +0.8 (2012-10-26) +---------------- + +API Changes +*********** + +- The `KazooClient.__init__` took as `watcher` argument as its second keyword + argument. The argument had no effect anymore since version 0.5 and was + removed. + +Bug Handling +************ + +- Issue #35: `KazooClient.__init__` didn't pass on `retry_max_delay` to the + retry helper. + +- Issue #34: Be more careful while handling socket connection errors. + +0.7 (2012-10-15) +---------------- + +Features +******** + +- DataWatch now has a `allow_missing_node` setting that allows a watch to be + set on a node that doesn't exist when the DataWatch is created. +- Add new Queue recipe, with optional priority support. +- Add new Counter recipe. +- Added debian packaging rules. + +Bug Handling +************ + +- Issue #31 fixed: Only catch KazooExceptions in catch-all calls. +- Issue #15 fixed again: Force sleep delay to be a float to appease gevent. +- Issue #29 fixed: DataWatch and ChildrenWatch properly re-register their + watches on server disconnect. + +0.6 (2012-09-27) +---------------- + +API Changes +*********** + +- Node paths are assumed to be Unicode objects. Under Python 2 pure-ascii + strings will also be accepted. Node values are considered bytes. The byte + type is an alias for `str` under Python 2. +- New KeeperState.CONNECTED_RO state for Zookeeper servers connected in + read-only mode. +- New NotReadOnlyCallError exception when issuing a write change against a + server thats currently read-only. + +Features +******** + +- Add support for Python 3.2, 3.3 and PyPy (only for the threading handler). +- Handles connecting to Zookeeper 3.4+ read-only servers. +- Automatic background scanning for a Read/Write server when connected to a + server in read-only mode. +- Add new Semaphore recipe. +- Add a new `retry_max_delay` argument to the client and by default limit the + retry delay to at most an hour regardless of exponential backoff settings. +- Add new `randomize_hosts` argument to `KazooClient`, allowing one to disable + host randomization. + +Bug Handling +************ + +- Fix bug with locks not handling intermediary lock contenders disappearing. +- Fix bug with set_data type check failing to catch unicode values. +- Fix bug with gevent 0.13.x backport of peekable queue. +- Fix PatientChildrenWatch to use handler specific sleep function. + +0.5 (2012-09-06) +---------------- + +Skipping a version to reflect the magnitude of the change. Kazoo is now a pure +Python client with no C bindings. This release should run without a problem +on alternate Python implementations such as PyPy and Jython. Porting to Python +3 in the future should also be much easier. + +Documentation +************* + +- Docs have been restructured to handle the new classes and locations of the + methods from the pure Python refactor. + +Bug Handling +************ + +This change may introduce new bugs, however there is no longer the possibility +of a complete Python segfault due to errors in the C library and/or the C +binding. + +- Possible segfaults from the C lib are gone. +- Password mangling due to the C lib is gone. +- The party recipes didn't set their participating flag to False after + leaving. + +Features +******** + +- New `client.command` and `client.server_version` API, exposing Zookeeper's + four letter commands and giving access to structured version information. +- Added 'include_data' option for get_children to include the node's Stat + object. +- Substantial increase in logging data with debug mode. All correspondence with + the Zookeeper server can now be seen to help in debugging. + +API Changes +*********** + +- The testing helpers have been moved from `testing.__init__` into a + `testing.harness` module. The official API's of `KazooTestCase` and + `KazooTestHarness` can still be directly imported from `testing`. +- The kazoo.handlers.util module was removed. +- Backwards compatible exception class aliases are provided for now in kazoo + exceptions for the prior C exception names. +- Unicode strings now work fine for node names and are properly converted to + and from unicode objects. +- The data value argument for the create and create_async methods of the + client was made optional and defaults to an empty byte string. The data + value must be a byte string. Unicode values are no longer allowed and + will raise a TypeError. + + +0.3 (2012-08-23) +---------------- + +API Changes +*********** + +- Handler interface now has an rlock_object for use by recipes. + +Bug Handling +************ + +- Fixed password bug with updated zc-zookeeper-static release, which retains + null bytes in the password properly. +- Fixed reconnect hammering, so that the reconnection follows retry jitter and + retry backoff's. +- Fixed possible bug with using a threading.Condition in the set partitioner. + Set partitioner uses new rlock_object handler API to get an appropriate RLock + for gevent. +- Issue #17 fixed: Wrap timeout exceptions with staticmethod so they can be + used directly as intended. Patch by Bob Van Zant. +- Fixed bug with client reconnection looping indefinitely using an expired + session id. + +0.2 (2012-08-12) +---------------- + +Documentation +************* + +- Fixed doc references to start_async using an AsyncResult object, it uses + an Event object. + +Bug Handling +************ + +- Issue #16 fixed: gevent zookeeper logging failed to handle a monkey patched + logging setup. Logging is now setup such that a greenlet is used for logging + messages under gevent, and the thread one is used otherwise. +- Fixed bug similar to #14 for ChildrenWatch on the session listener. +- Issue #14 fixed: DataWatch had inconsistent handling of the node it was + watching not existing. DataWatch also properly spawns its _get_data function + to avoid blocking session events. +- Issue #15 fixed: sleep_func for SequentialGeventHandler was not set on the + class appropriately leading to additional arguments being passed to + gevent.sleep. +- Issue #9 fixed: Threads/greenlets didn't gracefully shut down. Handler now + has a start/stop that is used by the client when calling start and stop that + shuts down the handler workers. This addresses errors and warnings that could + be emitted upon process shutdown regarding a clean exit of the workers. +- Issue #12 fixed: gevent 0.13 doesn't use the same start_new_thread as gevent + 1.0 which resulted in a fully monkey-patched environment halting due to the + wrong thread. Updated to use the older kazoo method of getting the real thread + module object. + +API Changes +*********** + +- The KazooClient handler is now officially exposed as KazooClient.handler + so that the appropriate sync objects can be used by end-users. +- Refactored ChildrenWatcher used by SetPartitioner into a publicly exposed + PatientChildrenWatch under recipe.watchers. + +Deprecations +************ + +- connect/connect_async has been renamed to start/start_async to better match + the stop to indicate connection handling. The prior names are aliased for + the time being. + +Recipes +******* + +- Added Barrier and DoubleBarrier implementation. + +0.2b1 (2012-07-27) +------------------ + +Bug Handling +************ + +- ZOOKEEPER-1318: SystemError is caught and rethrown as the proper invalid + state exception in older zookeeper python bindings where this issue is still + valid. +- ZOOKEEPER-1431: Install the latest zc-zookeeper-static library or use the + packaged ubuntu one for ubuntu 12.04 or later. +- ZOOKEEPER-553: State handling isn't checked via this method, we track it in + a simpler manner with the watcher to ensure we know the right state. + +Features +******** + +- Exponential backoff with jitter for retrying commands. +- Gevent 0.13 and 1.0b support. +- Lock, Party, SetPartitioner, and Election recipe implementations. +- Data and Children watching API's. +- State transition handling with listener registering to handle session state + changes (choose to fatal the app on session expiration, etc.) +- Zookeeper logging stream redirected into Python logging channel under the + name 'Zookeeper'. +- Base client library with handler support for threading and gevent async + environments. + +%prep +%autosetup -n kazoo-2.2.1 + +%build +%py2_build + +%install +%py2_install +install -d -m755 %{buildroot}/%{_pkgdocdir} +if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi +if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi +if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi +if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi +pushd %{buildroot} +if [ -d usr/lib ]; then + find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/lib64 ]; then + find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/bin ]; then + find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst +fi +if [ -d usr/sbin ]; then + find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst +fi +touch doclist.lst +if [ -d usr/share/man ]; then + find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst +fi +popd +mv %{buildroot}/filelist.lst . +mv %{buildroot}/doclist.lst . + +%files -n python2-kazoo -f filelist.lst +%{python2_sitelib}/* + +%files help -f doclist.lst +%{_docdir}/* + +%changelog +* Wed May 12 2021 openstack-sig +- Package Spec generated -- Gitee From 760dcdc51598c3c2e9d9fe214dfa1fa4a11137ed Mon Sep 17 00:00:00 2001 From: Fan Zhang Date: Tue, 25 May 2021 15:39:20 +0800 Subject: [PATCH 2/2] Fix provides Signed-off-by: Fan Zhang --- python-kazoo.spec | 2059 +-------------------------------------------- 1 file changed, 9 insertions(+), 2050 deletions(-) diff --git a/python-kazoo.spec b/python-kazoo.spec index 83625e1..9978ea5 100644 --- a/python-kazoo.spec +++ b/python-kazoo.spec @@ -1,703 +1,22 @@ %global _empty_manifest_terminate_build 0 Name: python-kazoo Version: 2.2.1 -Release: 1 +Release: 2 Summary: Higher Level Zookeeper Client License: Apache-2.0 URL: https://kazoo.readthedocs.org Source0: https://files.pythonhosted.org/packages/60/5c/210aa291f9b5be2d0424d512a04dea2f06db816f27289ad1080e267129ec/kazoo-2.2.1.tar.gz BuildArch: noarch %description -===== Kazoo -===== - -.. image:: https://travis-ci.org/python-zk/kazoo.svg?branch=master - :target: https://travis-ci.org/python-zk/kazoo - :alt: Travis Build - -.. image:: https://img.shields.io/pypi/v/kazoo.svg - :target: https://pypi.python.org/pypi/kazoo/ - :alt: Latest Version - -.. image:: https://img.shields.io/pypi/dm/kazoo.svg - :target: https://pypi.python.org/pypi/kazoo/ - :alt: Downloads ``kazoo`` implements a higher level API to `Apache Zookeeper`_ for Python clients. -See `the full docs`_ for more information. - -License -======= - -``kazoo`` is offered under the Apache License 2.0. - -Authors -======= - -``kazoo`` started under the `Nimbus Project`_ and through collaboration with -the open-source community has been merged with code from `Mozilla`_ and the -`Zope Corporation`_. It has since gathered an active community of over two -dozen contributors. - -.. _Apache Zookeeper: http://zookeeper.apache.org/ -.. _the full docs: http://kazoo.rtfd.org/ -.. _Nimbus Project: http://www.nimbusproject.org/ -.. _Zope Corporation: http://zope.com/ -.. _Mozilla: http://www.mozilla.org/ - - -Changelog -========= - -2.2.1 (2015-06-17) ------------------- - -Features -******** - -Bug Handling -************ -- handle NameError with basestring on py3k. - -Documentation -************* - -2.2 (2015-06-15) ----------------- - -Documentation -************* - -Features -******** - -- Issue #234: Add support for reconfig cluster membership operation - -Bug Handling -************ - -- #315: multiple acquires of a kazoo lock using the lock recipe would - block when using `acquire` even when non-blocking is specified (only - when the lock was/has been already acquired). -- #318: At exit register takes ``*args`` and ``**kwargs`` not args and kargs - -Documentation -************* - -2.1 (2015-05-11) ----------------- - -Features -******** - -- Start running tests against Zookeeper 3.5.0 alpha and explicitly configure - the `admin.serverPort` in tests to avoid port conflicts. The Zookeeper - alpha version is not yet officially supported. -- Integrate eventlet *handler* support into kazoo so that along with [gevent, - threading] handlers there can now be a dedicated eventlet handler for - projects that need to (or want to) use eventlet (such as those working - in the openstack community). The ``requirements_eventlet.txt`` file lists - the optional eventlet requirement(s) that needs to be satisfied when this - new handler is used. -- Use ``six`` to nicely handle the cross compatibility of kazoo with - python 2.x and 3.x (reducing/removing the need to have custom compatibility - code that replicates what six already provides). -- Add ``state_change_event`` to ``kazoo.recipe.partitioner.SetPartitioner`` - which is set on every state change. -- Add a NonBlockingLease recipe. The recipe allows e.g. cron jobs scheduled - on multiple machines to ensure that at most N instances will run a particular - job, with lease timeout for graceful handover in case of node failures. - - -Bug Handling -************ - -- #291: Kazoo lock recipe was only partially re-entrant in that multiple - calls to `acquire` would obtain the the lock but the first call to `release` - would remove the underlying lock. This would leave the X - 1 other `acquire` - statements unprotected (and no longer holding there expected lock). To fix - this the comment about that lock recipe being re-entrant has been removed - and multiple acquires will now block when attempted. - -- #78: Kazoo now uses socketpairs instead of pipes making it compatible with - Windows. - -- #144, #221: Let `client.command` work with IPv6 addresses. - -- #216: Fixed timeout for ConnectionHandler._invoke. - -- #261: Creating a sequential znode under / doesn't work. - -- #274: Add server_version() retries (by default 4 attempts will be made) to - better handle flakey responses. - -- #271: Fixed handling of KazooState.SUSPENDED in SetPartitioner. - -- #283: Fixed a race condition in SetPartitioner when party changes during - handling of lock acquisition. - -- #303: don't crash on random input as the hosts string. - -Documentation -************* - -- #222: Document that committed on the transaction is used to ensure only one - commit and is not an indicator of whether operations in the transaction - returned desired results. - -2.0 (2014-06-19) ----------------- - -Documentation -************* - -- Extend support to Python 3.4, deprecating Python 3.2. -- Issue #198: Mention Zake as a sophisticated kazoo mock testing library. -- Issue #181: Add documentation on basic logging setup. - - -2.0b1 (2014-04-24) ------------------- - -API Changes -*********** - -- Null or None data is no longer treated as "". Pull req #165, patch by - Raul Gutierrez S. This will affect how you should treat null data in a - znode vs. an empty string. -- Passing acl=[] to create() now works properly instead of an InvalidACLError - as it returned before. Patch by Raul Gutierrez S in PR #164. -- Removed the dependency on zope.interface. The classes in the interfaces - module are left for documentation purposes only (issue #131). - -Features -******** - -- Logging levels have been reduced. - - - Logging previously at the ``logging.DEBUG`` level is now logged at - the ``kazoo.loggingsupport.BLATHER`` level (5). - - - Some low-level logging previously at the ``logging.INFO`` level is - now logged at the ``logging.DEBUG`` level. - -- Issue #133: Introduce a new environment variable `ZOOKEEPER_PORT_OFFSET` - for the testing support, to run the testing cluster on a different range. - -Bug Handling -************ - -- When authenticating via add_auth() the auth data will be saved to ensure that - the authentication happens on reconnect (as is the case when feeding auth - data via KazooClient's constructor). PR #172, patch by Raul Gutierrez S. -- Change gevent import to remove deprecation warning when newer gevent is - used. PR #191, patch by Hiroaki Kawai. -- Lock recipe was failing to use the client's sleep_func causing issues with - gevent. Issue #150. -- Calling a DataWatch or ChildrenWatch instance twice (decorator) now throws - an exception as only a single function can be associated with a single - watcher. Issue #154. -- Another fix for atexit handling so that when disposing of connections the - atexit handler is removed. PR #190, patch by Devaev Maxim. -- Fix atexit handling for kazoo threading handler, PR #183. Patch by - Brian Wickman. -- Partitioner should handle a suspended connection properly and restore - an allocated state if it was allocated previously. Patch by Manish Tomar. -- Issue #167: Closing a client that was never started throws a type error. - Patch by Joshua Harlow. -- Passing dictionaries to KazooClient.__init__() wasn't actually working - properly. Patch by Ryan Uber. -- Issue #119: Handler timeout takes the max of the random interval or - the read timeout to ensure a negative number isn't used for the read - timeout. -- Fix ordering of exception catches in lock.acquire as it was capturing a - parent exception before the child. Patch by ReneSac. -- Fix issue with client.stop() not always setting the client state to - KeeperState.CLOSED. Patch by Jyrki Pulliainen in PR #174. -- Issue #169: Fixed pipes leaking into child processes. - -Documentation -************* - -- Add section on contributing recipes, add maintainer/status information for - existing recipes. -- Add note about alternate use of DataWatch. - -1.3.1 (2013-09-25) ------------------- - -Bug Handling -************ - -- #118, #125, #128: Fix unknown variable in KazooClient `command_retry` - argument handling. - -- #126: Fix `KazooRetry.copy` to correctly copy sleep function. - -- #118: Correct session/socket timeout conversion (int vs. float). - -Documentation -************* - -- #121: Add a note about `kazoo.recipe.queue.LockingQueue` requiring a - Zookeeper 3.4+ server. - - -1.3 (2013-09-05) ----------------- - -Features -******** - -- #115: Limit the backends we use for SLF4J during tests. - -- #112: Add IPv6 support. Patch by Dan Kruchinin. - -1.2.1 (2013-08-01) ------------------- - -Bug Handling -************ - -- Issue #108: Circular import fail when importing kazoo.recipe.watchers - directly has now been resolved. Watchers and partitioner properly import - the KazooState from kazoo.protocol.states rather than kazoo.client. -- Issue #109: Partials not usable properly as a datawatch call can now be - used. All funcs will be called with 3 args and fall back to 2 args if - there's an argument error. -- Issue #106, #107: `client.create_async` didn't strip change root from the - returned path. - -1.2 (2013-07-24) ----------------- - -Features -******** - -- KazooClient can now be stopped more reliably even if its in the middle - of a long retry sleep. This utilizes the new interrupt feature of - KazooRetry which lets the sleep be broken down into chunks and an - interrupt function called to determine if the retry should fail early. - -- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a - max deadline, transition properly when connection fails to LOST, and - setup separate connection retry behavior from client command retry - behavior. Patches by Mike Lundy. - -- Issue #100: Make it easier to see exception context in threading and - connection modules. - -- Issue #85: Increase information density of logs and don't prevent - dynamic reconfiguration of log levels at runtime. - -- Data-watchers for the same node are no longer 'stacked'. That is, if - a get and an exists call occur for the same node with the same watch - function, then it will be registered only once. This change results in - Kazoo behaving per Zookeeper client spec regarding repeat watch use. - -Bug Handling -************ - -- Issue #53: Throw a warning upon starting if the chroot path doesn't exist - so that it's more obvious when the chroot should be created before - performing more operations. - -- Kazoo previously would let the same function be registered as a data-watch - or child-watch multiple times, and then call it multiple times upon being - triggered. This was non-compliant Zookeeper client behavior, the same - watch can now only be registered once for the same znode path per Zookeeper - client documentation. - -- Issue #105: Avoid rare import lock problems by moving module imports in - client.py to the module scope. - -- Issue #103: Allow prefix-less sequential znodes. - -- Issue #98: Extend testing ZK harness to work with different file locations - on some versions of Debian/Ubuntu. - -- Issue #97: Update some docstrings to reflect current state of handlers. - -- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a - max deadline, transition properly when connection fails to LOST, and - setup separate connection retry behavior from client command retry - behavior. Patches by Mike Lundy. - -API Changes -*********** - -- The `kazoo.testing.harness.KazooTestHarness` class directly inherits from - `unittest.TestCase` and you need to ensure to call its `__init__` method. - -- DataWatch no longer takes any parameters besides for the optional function - during instantiation. The additional options are now implicitly True, with - the user being left to ignore events as they choose. See the DataWatch - API docs for more information. - -- Issue #99: Better exception raised when the writer fails to close. A - WriterNotClosedException that inherits from KazooException is now raised - when the writer fails to close in time. - -1.1 (2013-06-08) ----------------- - -Features -******** - -- Issue #93: Add timeout option to lock/semaphore acquire methods. - -- Issue #79 / #90: Add ability to pass the WatchedEvent to DataWatch and - ChildWatch functions. - -- Respect large client timeout values when closing the connection. - -- Add a `max_leases` consistency check to the semaphore recipe. - -- Issue #76: Extend testing helpers to allow customization of the Java - classpath by specifying the new `ZOOKEEPER_CLASSPATH` environment variable. - -- Issue #65: Allow non-blocking semaphore acquisition. - -Bug Handling -************ - -- Issue #96: Provide Windows compatibility in testing harness. - -- Issue #95: Handle errors deserializing connection response. - -- Issue #94: Clean up stray bytes in connection pipe. - -- Issue #87 / #88: Allow re-acquiring lock after cancel. - -- Issue #77: Use timeout in initial socket connection. - -- Issue #69: Only ensure path once in lock and semaphore recipes. - -- Issue #68: Closing the connection causes exceptions to be raised by watchers - which assume the connection won't be closed when running commands. - -- Issue #66: Require ping reply before sending another ping, otherwise the - connection will be considered dead and a ConnectionDropped will be raised - to trigger a reconnect. - -- Issue #63: Watchers weren't reset on lost connection. - -- Issue #58: DataWatcher failed to re-register for changes after non-existent - node was created then deleted. - -API Changes -*********** - -- KazooClient.create_async now supports the makepath argument. - -- KazooClient.ensure_path now has an async version, ensure_path_async. - -1.0 (2013-03-26) ----------------- - -Features -******** - -- Added a LockingQueue recipe. The queue first locks an item and removes it - from the queue only after the consume() method is called. This enables other - nodes to retake the item if an error occurs on the first node. - -Bug Handling -************ - -- Issue #50: Avoid problems with sleep function in mixed gevent/threading - setup. - -- Issue #56: Avoid issues with watch callbacks evaluating to false. - -1.0b1 (2013-02-24) ------------------- - -Features -******** - -- Refactored the internal connection handler to use a single thread. It now - uses a deque and pipe to signal the ZK thread that there's a new command to - send, so that the ZK thread can send it, or retrieve a response. - Processing ZK requests and responses serially in a single thread eliminates - the need for a bunch of the locking, the peekable queue and two threads - working on the same underlying socket. - -- Issue #48: Added documentation for the `retry` helper module. - -- Issue #55: Fix `os.pipe` file descriptor leak and introduce a - `KazooClient.close` method. The method is particular useful in tests, where - multiple KazooClients are created and closed in the same process. - -Bug Handling -************ - -- Issue #46: Avoid TypeError in GeneratorContextManager on process shutdown. - -- Issue #43: Let DataWatch return node data if allow_missing_node is used. - -0.9 (2013-01-07) ----------------- - -API Changes -*********** - -- When a retry operation ultimately fails, it now raises a - `kazoo.retry.RetryFailedError` exception, instead of a general `Exception` - instance. `RetryFailedError` also inherits from the base `KazooException`. - -Features -******** - -- Improvements to Debian packaging rules. - -Bug Handling -************ - -- Issue #39 / #41: Handle connection dropped errors during session writes. - Ensure client connection is re-established to a new ZK node if available. - -- Issue #38: Set `CLOEXEC` flag on all sockets when available. - -- Issue #37 / #40: Handle timeout errors during `select` calls on sockets. - -- Issue #36: Correctly set `ConnectionHandler.writer_stopped` even if an - exception is raised inside the writer, like a retry operation failing. - -0.8 (2012-10-26) ----------------- - -API Changes -*********** - -- The `KazooClient.__init__` took as `watcher` argument as its second keyword - argument. The argument had no effect anymore since version 0.5 and was - removed. - -Bug Handling -************ - -- Issue #35: `KazooClient.__init__` didn't pass on `retry_max_delay` to the - retry helper. - -- Issue #34: Be more careful while handling socket connection errors. - -0.7 (2012-10-15) ----------------- - -Features -******** - -- DataWatch now has a `allow_missing_node` setting that allows a watch to be - set on a node that doesn't exist when the DataWatch is created. -- Add new Queue recipe, with optional priority support. -- Add new Counter recipe. -- Added debian packaging rules. - -Bug Handling -************ - -- Issue #31 fixed: Only catch KazooExceptions in catch-all calls. -- Issue #15 fixed again: Force sleep delay to be a float to appease gevent. -- Issue #29 fixed: DataWatch and ChildrenWatch properly re-register their - watches on server disconnect. - -0.6 (2012-09-27) ----------------- - -API Changes -*********** - -- Node paths are assumed to be Unicode objects. Under Python 2 pure-ascii - strings will also be accepted. Node values are considered bytes. The byte - type is an alias for `str` under Python 2. -- New KeeperState.CONNECTED_RO state for Zookeeper servers connected in - read-only mode. -- New NotReadOnlyCallError exception when issuing a write change against a - server thats currently read-only. - -Features -******** - -- Add support for Python 3.2, 3.3 and PyPy (only for the threading handler). -- Handles connecting to Zookeeper 3.4+ read-only servers. -- Automatic background scanning for a Read/Write server when connected to a - server in read-only mode. -- Add new Semaphore recipe. -- Add a new `retry_max_delay` argument to the client and by default limit the - retry delay to at most an hour regardless of exponential backoff settings. -- Add new `randomize_hosts` argument to `KazooClient`, allowing one to disable - host randomization. - -Bug Handling -************ - -- Fix bug with locks not handling intermediary lock contenders disappearing. -- Fix bug with set_data type check failing to catch unicode values. -- Fix bug with gevent 0.13.x backport of peekable queue. -- Fix PatientChildrenWatch to use handler specific sleep function. - -0.5 (2012-09-06) ----------------- - -Skipping a version to reflect the magnitude of the change. Kazoo is now a pure -Python client with no C bindings. This release should run without a problem -on alternate Python implementations such as PyPy and Jython. Porting to Python -3 in the future should also be much easier. - -Documentation -************* - -- Docs have been restructured to handle the new classes and locations of the - methods from the pure Python refactor. - -Bug Handling -************ - -This change may introduce new bugs, however there is no longer the possibility -of a complete Python segfault due to errors in the C library and/or the C -binding. - -- Possible segfaults from the C lib are gone. -- Password mangling due to the C lib is gone. -- The party recipes didn't set their participating flag to False after - leaving. - -Features -******** - -- New `client.command` and `client.server_version` API, exposing Zookeeper's - four letter commands and giving access to structured version information. -- Added 'include_data' option for get_children to include the node's Stat - object. -- Substantial increase in logging data with debug mode. All correspondence with - the Zookeeper server can now be seen to help in debugging. - -API Changes -*********** - -- The testing helpers have been moved from `testing.__init__` into a - `testing.harness` module. The official API's of `KazooTestCase` and - `KazooTestHarness` can still be directly imported from `testing`. -- The kazoo.handlers.util module was removed. -- Backwards compatible exception class aliases are provided for now in kazoo - exceptions for the prior C exception names. -- Unicode strings now work fine for node names and are properly converted to - and from unicode objects. -- The data value argument for the create and create_async methods of the - client was made optional and defaults to an empty byte string. The data - value must be a byte string. Unicode values are no longer allowed and - will raise a TypeError. - - -0.3 (2012-08-23) ----------------- - -API Changes -*********** - -- Handler interface now has an rlock_object for use by recipes. - -Bug Handling -************ - -- Fixed password bug with updated zc-zookeeper-static release, which retains - null bytes in the password properly. -- Fixed reconnect hammering, so that the reconnection follows retry jitter and - retry backoff's. -- Fixed possible bug with using a threading.Condition in the set partitioner. - Set partitioner uses new rlock_object handler API to get an appropriate RLock - for gevent. -- Issue #17 fixed: Wrap timeout exceptions with staticmethod so they can be - used directly as intended. Patch by Bob Van Zant. -- Fixed bug with client reconnection looping indefinitely using an expired - session id. - -0.2 (2012-08-12) ----------------- - -Documentation -************* - -- Fixed doc references to start_async using an AsyncResult object, it uses - an Event object. - -Bug Handling -************ - -- Issue #16 fixed: gevent zookeeper logging failed to handle a monkey patched - logging setup. Logging is now setup such that a greenlet is used for logging - messages under gevent, and the thread one is used otherwise. -- Fixed bug similar to #14 for ChildrenWatch on the session listener. -- Issue #14 fixed: DataWatch had inconsistent handling of the node it was - watching not existing. DataWatch also properly spawns its _get_data function - to avoid blocking session events. -- Issue #15 fixed: sleep_func for SequentialGeventHandler was not set on the - class appropriately leading to additional arguments being passed to - gevent.sleep. -- Issue #9 fixed: Threads/greenlets didn't gracefully shut down. Handler now - has a start/stop that is used by the client when calling start and stop that - shuts down the handler workers. This addresses errors and warnings that could - be emitted upon process shutdown regarding a clean exit of the workers. -- Issue #12 fixed: gevent 0.13 doesn't use the same start_new_thread as gevent - 1.0 which resulted in a fully monkey-patched environment halting due to the - wrong thread. Updated to use the older kazoo method of getting the real thread - module object. - -API Changes -*********** - -- The KazooClient handler is now officially exposed as KazooClient.handler - so that the appropriate sync objects can be used by end-users. -- Refactored ChildrenWatcher used by SetPartitioner into a publicly exposed - PatientChildrenWatch under recipe.watchers. - -Deprecations -************ - -- connect/connect_async has been renamed to start/start_async to better match - the stop to indicate connection handling. The prior names are aliased for - the time being. - -Recipes -******* - -- Added Barrier and DoubleBarrier implementation. - -0.2b1 (2012-07-27) ------------------- - -Bug Handling -************ - -- ZOOKEEPER-1318: SystemError is caught and rethrown as the proper invalid - state exception in older zookeeper python bindings where this issue is still - valid. -- ZOOKEEPER-1431: Install the latest zc-zookeeper-static library or use the - packaged ubuntu one for ubuntu 12.04 or later. -- ZOOKEEPER-553: State handling isn't checked via this method, we track it in - a simpler manner with the watcher to ensure we know the right state. - -Features -******** - -- Exponential backoff with jitter for retrying commands. -- Gevent 0.13 and 1.0b support. -- Lock, Party, SetPartitioner, and Election recipe implementations. -- Data and Children watching API's. -- State transition handling with listener registering to handle session state - changes (choose to fatal the app on session expiration, etc.) -- Zookeeper logging stream redirected into Python logging channel under the - name 'Zookeeper'. -- Base client library with handler support for threading and gevent async - environments. %package -n python2-kazoo Summary: Higher Level Zookeeper Client -Provides: python-kazoo +Provides: python2-kazoo BuildRequires: python2-devel BuildRequires: python2-setuptools Requires: python2-six @@ -709,1383 +28,21 @@ Requires: python2-flake8 Requires: python2-gevent Requires: python2-eventlet %description -n python2-kazoo -===== Kazoo -===== - -.. image:: https://travis-ci.org/python-zk/kazoo.svg?branch=master - :target: https://travis-ci.org/python-zk/kazoo - :alt: Travis Build - -.. image:: https://img.shields.io/pypi/v/kazoo.svg - :target: https://pypi.python.org/pypi/kazoo/ - :alt: Latest Version - -.. image:: https://img.shields.io/pypi/dm/kazoo.svg - :target: https://pypi.python.org/pypi/kazoo/ - :alt: Downloads ``kazoo`` implements a higher level API to `Apache Zookeeper`_ for Python clients. -See `the full docs`_ for more information. - -License -======= - -``kazoo`` is offered under the Apache License 2.0. - -Authors -======= - -``kazoo`` started under the `Nimbus Project`_ and through collaboration with -the open-source community has been merged with code from `Mozilla`_ and the -`Zope Corporation`_. It has since gathered an active community of over two -dozen contributors. - -.. _Apache Zookeeper: http://zookeeper.apache.org/ -.. _the full docs: http://kazoo.rtfd.org/ -.. _Nimbus Project: http://www.nimbusproject.org/ -.. _Zope Corporation: http://zope.com/ -.. _Mozilla: http://www.mozilla.org/ - -Changelog -========= - -2.2.1 (2015-06-17) ------------------- - -Features -******** - -Bug Handling -************ -- handle NameError with basestring on py3k. - -Documentation -************* - -2.2 (2015-06-15) ----------------- - -Documentation -************* - -Features -******** - -- Issue #234: Add support for reconfig cluster membership operation - -Bug Handling -************ - -- #315: multiple acquires of a kazoo lock using the lock recipe would - block when using `acquire` even when non-blocking is specified (only - when the lock was/has been already acquired). -- #318: At exit register takes ``*args`` and ``**kwargs`` not args and kargs - -Documentation -************* - -2.1 (2015-05-11) ----------------- - -Features -******** - -- Start running tests against Zookeeper 3.5.0 alpha and explicitly configure - the `admin.serverPort` in tests to avoid port conflicts. The Zookeeper - alpha version is not yet officially supported. -- Integrate eventlet *handler* support into kazoo so that along with [gevent, - threading] handlers there can now be a dedicated eventlet handler for - projects that need to (or want to) use eventlet (such as those working - in the openstack community). The ``requirements_eventlet.txt`` file lists - the optional eventlet requirement(s) that needs to be satisfied when this - new handler is used. -- Use ``six`` to nicely handle the cross compatibility of kazoo with - python 2.x and 3.x (reducing/removing the need to have custom compatibility - code that replicates what six already provides). -- Add ``state_change_event`` to ``kazoo.recipe.partitioner.SetPartitioner`` - which is set on every state change. -- Add a NonBlockingLease recipe. The recipe allows e.g. cron jobs scheduled - on multiple machines to ensure that at most N instances will run a particular - job, with lease timeout for graceful handover in case of node failures. - - -Bug Handling -************ - -- #291: Kazoo lock recipe was only partially re-entrant in that multiple - calls to `acquire` would obtain the the lock but the first call to `release` - would remove the underlying lock. This would leave the X - 1 other `acquire` - statements unprotected (and no longer holding there expected lock). To fix - this the comment about that lock recipe being re-entrant has been removed - and multiple acquires will now block when attempted. - -- #78: Kazoo now uses socketpairs instead of pipes making it compatible with - Windows. - -- #144, #221: Let `client.command` work with IPv6 addresses. - -- #216: Fixed timeout for ConnectionHandler._invoke. - -- #261: Creating a sequential znode under / doesn't work. - -- #274: Add server_version() retries (by default 4 attempts will be made) to - better handle flakey responses. - -- #271: Fixed handling of KazooState.SUSPENDED in SetPartitioner. - -- #283: Fixed a race condition in SetPartitioner when party changes during - handling of lock acquisition. - -- #303: don't crash on random input as the hosts string. - -Documentation -************* - -- #222: Document that committed on the transaction is used to ensure only one - commit and is not an indicator of whether operations in the transaction - returned desired results. - -2.0 (2014-06-19) ----------------- - -Documentation -************* - -- Extend support to Python 3.4, deprecating Python 3.2. -- Issue #198: Mention Zake as a sophisticated kazoo mock testing library. -- Issue #181: Add documentation on basic logging setup. - - -2.0b1 (2014-04-24) ------------------- - -API Changes -*********** - -- Null or None data is no longer treated as "". Pull req #165, patch by - Raul Gutierrez S. This will affect how you should treat null data in a - znode vs. an empty string. -- Passing acl=[] to create() now works properly instead of an InvalidACLError - as it returned before. Patch by Raul Gutierrez S in PR #164. -- Removed the dependency on zope.interface. The classes in the interfaces - module are left for documentation purposes only (issue #131). - -Features -******** - -- Logging levels have been reduced. - - - Logging previously at the ``logging.DEBUG`` level is now logged at - the ``kazoo.loggingsupport.BLATHER`` level (5). - - - Some low-level logging previously at the ``logging.INFO`` level is - now logged at the ``logging.DEBUG`` level. - -- Issue #133: Introduce a new environment variable `ZOOKEEPER_PORT_OFFSET` - for the testing support, to run the testing cluster on a different range. - -Bug Handling -************ - -- When authenticating via add_auth() the auth data will be saved to ensure that - the authentication happens on reconnect (as is the case when feeding auth - data via KazooClient's constructor). PR #172, patch by Raul Gutierrez S. -- Change gevent import to remove deprecation warning when newer gevent is - used. PR #191, patch by Hiroaki Kawai. -- Lock recipe was failing to use the client's sleep_func causing issues with - gevent. Issue #150. -- Calling a DataWatch or ChildrenWatch instance twice (decorator) now throws - an exception as only a single function can be associated with a single - watcher. Issue #154. -- Another fix for atexit handling so that when disposing of connections the - atexit handler is removed. PR #190, patch by Devaev Maxim. -- Fix atexit handling for kazoo threading handler, PR #183. Patch by - Brian Wickman. -- Partitioner should handle a suspended connection properly and restore - an allocated state if it was allocated previously. Patch by Manish Tomar. -- Issue #167: Closing a client that was never started throws a type error. - Patch by Joshua Harlow. -- Passing dictionaries to KazooClient.__init__() wasn't actually working - properly. Patch by Ryan Uber. -- Issue #119: Handler timeout takes the max of the random interval or - the read timeout to ensure a negative number isn't used for the read - timeout. -- Fix ordering of exception catches in lock.acquire as it was capturing a - parent exception before the child. Patch by ReneSac. -- Fix issue with client.stop() not always setting the client state to - KeeperState.CLOSED. Patch by Jyrki Pulliainen in PR #174. -- Issue #169: Fixed pipes leaking into child processes. - -Documentation -************* - -- Add section on contributing recipes, add maintainer/status information for - existing recipes. -- Add note about alternate use of DataWatch. - -1.3.1 (2013-09-25) ------------------- - -Bug Handling -************ - -- #118, #125, #128: Fix unknown variable in KazooClient `command_retry` - argument handling. - -- #126: Fix `KazooRetry.copy` to correctly copy sleep function. - -- #118: Correct session/socket timeout conversion (int vs. float). - -Documentation -************* - -- #121: Add a note about `kazoo.recipe.queue.LockingQueue` requiring a - Zookeeper 3.4+ server. - - -1.3 (2013-09-05) ----------------- - -Features -******** - -- #115: Limit the backends we use for SLF4J during tests. - -- #112: Add IPv6 support. Patch by Dan Kruchinin. - -1.2.1 (2013-08-01) ------------------- - -Bug Handling -************ - -- Issue #108: Circular import fail when importing kazoo.recipe.watchers - directly has now been resolved. Watchers and partitioner properly import - the KazooState from kazoo.protocol.states rather than kazoo.client. -- Issue #109: Partials not usable properly as a datawatch call can now be - used. All funcs will be called with 3 args and fall back to 2 args if - there's an argument error. -- Issue #106, #107: `client.create_async` didn't strip change root from the - returned path. - -1.2 (2013-07-24) ----------------- - -Features -******** - -- KazooClient can now be stopped more reliably even if its in the middle - of a long retry sleep. This utilizes the new interrupt feature of - KazooRetry which lets the sleep be broken down into chunks and an - interrupt function called to determine if the retry should fail early. - -- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a - max deadline, transition properly when connection fails to LOST, and - setup separate connection retry behavior from client command retry - behavior. Patches by Mike Lundy. - -- Issue #100: Make it easier to see exception context in threading and - connection modules. - -- Issue #85: Increase information density of logs and don't prevent - dynamic reconfiguration of log levels at runtime. - -- Data-watchers for the same node are no longer 'stacked'. That is, if - a get and an exists call occur for the same node with the same watch - function, then it will be registered only once. This change results in - Kazoo behaving per Zookeeper client spec regarding repeat watch use. - -Bug Handling -************ - -- Issue #53: Throw a warning upon starting if the chroot path doesn't exist - so that it's more obvious when the chroot should be created before - performing more operations. - -- Kazoo previously would let the same function be registered as a data-watch - or child-watch multiple times, and then call it multiple times upon being - triggered. This was non-compliant Zookeeper client behavior, the same - watch can now only be registered once for the same znode path per Zookeeper - client documentation. - -- Issue #105: Avoid rare import lock problems by moving module imports in - client.py to the module scope. - -- Issue #103: Allow prefix-less sequential znodes. - -- Issue #98: Extend testing ZK harness to work with different file locations - on some versions of Debian/Ubuntu. - -- Issue #97: Update some docstrings to reflect current state of handlers. - -- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a - max deadline, transition properly when connection fails to LOST, and - setup separate connection retry behavior from client command retry - behavior. Patches by Mike Lundy. - -API Changes -*********** - -- The `kazoo.testing.harness.KazooTestHarness` class directly inherits from - `unittest.TestCase` and you need to ensure to call its `__init__` method. - -- DataWatch no longer takes any parameters besides for the optional function - during instantiation. The additional options are now implicitly True, with - the user being left to ignore events as they choose. See the DataWatch - API docs for more information. - -- Issue #99: Better exception raised when the writer fails to close. A - WriterNotClosedException that inherits from KazooException is now raised - when the writer fails to close in time. - -1.1 (2013-06-08) ----------------- - -Features -******** - -- Issue #93: Add timeout option to lock/semaphore acquire methods. - -- Issue #79 / #90: Add ability to pass the WatchedEvent to DataWatch and - ChildWatch functions. - -- Respect large client timeout values when closing the connection. - -- Add a `max_leases` consistency check to the semaphore recipe. - -- Issue #76: Extend testing helpers to allow customization of the Java - classpath by specifying the new `ZOOKEEPER_CLASSPATH` environment variable. - -- Issue #65: Allow non-blocking semaphore acquisition. - -Bug Handling -************ - -- Issue #96: Provide Windows compatibility in testing harness. - -- Issue #95: Handle errors deserializing connection response. - -- Issue #94: Clean up stray bytes in connection pipe. - -- Issue #87 / #88: Allow re-acquiring lock after cancel. - -- Issue #77: Use timeout in initial socket connection. - -- Issue #69: Only ensure path once in lock and semaphore recipes. - -- Issue #68: Closing the connection causes exceptions to be raised by watchers - which assume the connection won't be closed when running commands. - -- Issue #66: Require ping reply before sending another ping, otherwise the - connection will be considered dead and a ConnectionDropped will be raised - to trigger a reconnect. - -- Issue #63: Watchers weren't reset on lost connection. - -- Issue #58: DataWatcher failed to re-register for changes after non-existent - node was created then deleted. - -API Changes -*********** - -- KazooClient.create_async now supports the makepath argument. - -- KazooClient.ensure_path now has an async version, ensure_path_async. - -1.0 (2013-03-26) ----------------- - -Features -******** - -- Added a LockingQueue recipe. The queue first locks an item and removes it - from the queue only after the consume() method is called. This enables other - nodes to retake the item if an error occurs on the first node. - -Bug Handling -************ - -- Issue #50: Avoid problems with sleep function in mixed gevent/threading - setup. - -- Issue #56: Avoid issues with watch callbacks evaluating to false. - -1.0b1 (2013-02-24) ------------------- - -Features -******** - -- Refactored the internal connection handler to use a single thread. It now - uses a deque and pipe to signal the ZK thread that there's a new command to - send, so that the ZK thread can send it, or retrieve a response. - Processing ZK requests and responses serially in a single thread eliminates - the need for a bunch of the locking, the peekable queue and two threads - working on the same underlying socket. - -- Issue #48: Added documentation for the `retry` helper module. - -- Issue #55: Fix `os.pipe` file descriptor leak and introduce a - `KazooClient.close` method. The method is particular useful in tests, where - multiple KazooClients are created and closed in the same process. - -Bug Handling -************ - -- Issue #46: Avoid TypeError in GeneratorContextManager on process shutdown. - -- Issue #43: Let DataWatch return node data if allow_missing_node is used. - -0.9 (2013-01-07) ----------------- - -API Changes -*********** - -- When a retry operation ultimately fails, it now raises a - `kazoo.retry.RetryFailedError` exception, instead of a general `Exception` - instance. `RetryFailedError` also inherits from the base `KazooException`. - -Features -******** - -- Improvements to Debian packaging rules. - -Bug Handling -************ - -- Issue #39 / #41: Handle connection dropped errors during session writes. - Ensure client connection is re-established to a new ZK node if available. - -- Issue #38: Set `CLOEXEC` flag on all sockets when available. - -- Issue #37 / #40: Handle timeout errors during `select` calls on sockets. - -- Issue #36: Correctly set `ConnectionHandler.writer_stopped` even if an - exception is raised inside the writer, like a retry operation failing. - -0.8 (2012-10-26) ----------------- - -API Changes -*********** - -- The `KazooClient.__init__` took as `watcher` argument as its second keyword - argument. The argument had no effect anymore since version 0.5 and was - removed. - -Bug Handling -************ - -- Issue #35: `KazooClient.__init__` didn't pass on `retry_max_delay` to the - retry helper. - -- Issue #34: Be more careful while handling socket connection errors. - -0.7 (2012-10-15) ----------------- - -Features -******** - -- DataWatch now has a `allow_missing_node` setting that allows a watch to be - set on a node that doesn't exist when the DataWatch is created. -- Add new Queue recipe, with optional priority support. -- Add new Counter recipe. -- Added debian packaging rules. - -Bug Handling -************ - -- Issue #31 fixed: Only catch KazooExceptions in catch-all calls. -- Issue #15 fixed again: Force sleep delay to be a float to appease gevent. -- Issue #29 fixed: DataWatch and ChildrenWatch properly re-register their - watches on server disconnect. - -0.6 (2012-09-27) ----------------- - -API Changes -*********** - -- Node paths are assumed to be Unicode objects. Under Python 2 pure-ascii - strings will also be accepted. Node values are considered bytes. The byte - type is an alias for `str` under Python 2. -- New KeeperState.CONNECTED_RO state for Zookeeper servers connected in - read-only mode. -- New NotReadOnlyCallError exception when issuing a write change against a - server thats currently read-only. - -Features -******** - -- Add support for Python 3.2, 3.3 and PyPy (only for the threading handler). -- Handles connecting to Zookeeper 3.4+ read-only servers. -- Automatic background scanning for a Read/Write server when connected to a - server in read-only mode. -- Add new Semaphore recipe. -- Add a new `retry_max_delay` argument to the client and by default limit the - retry delay to at most an hour regardless of exponential backoff settings. -- Add new `randomize_hosts` argument to `KazooClient`, allowing one to disable - host randomization. - -Bug Handling -************ - -- Fix bug with locks not handling intermediary lock contenders disappearing. -- Fix bug with set_data type check failing to catch unicode values. -- Fix bug with gevent 0.13.x backport of peekable queue. -- Fix PatientChildrenWatch to use handler specific sleep function. - -0.5 (2012-09-06) ----------------- - -Skipping a version to reflect the magnitude of the change. Kazoo is now a pure -Python client with no C bindings. This release should run without a problem -on alternate Python implementations such as PyPy and Jython. Porting to Python -3 in the future should also be much easier. - -Documentation -************* - -- Docs have been restructured to handle the new classes and locations of the - methods from the pure Python refactor. - -Bug Handling -************ - -This change may introduce new bugs, however there is no longer the possibility -of a complete Python segfault due to errors in the C library and/or the C -binding. - -- Possible segfaults from the C lib are gone. -- Password mangling due to the C lib is gone. -- The party recipes didn't set their participating flag to False after - leaving. - -Features -******** - -- New `client.command` and `client.server_version` API, exposing Zookeeper's - four letter commands and giving access to structured version information. -- Added 'include_data' option for get_children to include the node's Stat - object. -- Substantial increase in logging data with debug mode. All correspondence with - the Zookeeper server can now be seen to help in debugging. - -API Changes -*********** - -- The testing helpers have been moved from `testing.__init__` into a - `testing.harness` module. The official API's of `KazooTestCase` and - `KazooTestHarness` can still be directly imported from `testing`. -- The kazoo.handlers.util module was removed. -- Backwards compatible exception class aliases are provided for now in kazoo - exceptions for the prior C exception names. -- Unicode strings now work fine for node names and are properly converted to - and from unicode objects. -- The data value argument for the create and create_async methods of the - client was made optional and defaults to an empty byte string. The data - value must be a byte string. Unicode values are no longer allowed and - will raise a TypeError. - - -0.3 (2012-08-23) ----------------- - -API Changes -*********** - -- Handler interface now has an rlock_object for use by recipes. - -Bug Handling -************ - -- Fixed password bug with updated zc-zookeeper-static release, which retains - null bytes in the password properly. -- Fixed reconnect hammering, so that the reconnection follows retry jitter and - retry backoff's. -- Fixed possible bug with using a threading.Condition in the set partitioner. - Set partitioner uses new rlock_object handler API to get an appropriate RLock - for gevent. -- Issue #17 fixed: Wrap timeout exceptions with staticmethod so they can be - used directly as intended. Patch by Bob Van Zant. -- Fixed bug with client reconnection looping indefinitely using an expired - session id. - -0.2 (2012-08-12) ----------------- - -Documentation -************* - -- Fixed doc references to start_async using an AsyncResult object, it uses - an Event object. - -Bug Handling -************ - -- Issue #16 fixed: gevent zookeeper logging failed to handle a monkey patched - logging setup. Logging is now setup such that a greenlet is used for logging - messages under gevent, and the thread one is used otherwise. -- Fixed bug similar to #14 for ChildrenWatch on the session listener. -- Issue #14 fixed: DataWatch had inconsistent handling of the node it was - watching not existing. DataWatch also properly spawns its _get_data function - to avoid blocking session events. -- Issue #15 fixed: sleep_func for SequentialGeventHandler was not set on the - class appropriately leading to additional arguments being passed to - gevent.sleep. -- Issue #9 fixed: Threads/greenlets didn't gracefully shut down. Handler now - has a start/stop that is used by the client when calling start and stop that - shuts down the handler workers. This addresses errors and warnings that could - be emitted upon process shutdown regarding a clean exit of the workers. -- Issue #12 fixed: gevent 0.13 doesn't use the same start_new_thread as gevent - 1.0 which resulted in a fully monkey-patched environment halting due to the - wrong thread. Updated to use the older kazoo method of getting the real thread - module object. - -API Changes -*********** - -- The KazooClient handler is now officially exposed as KazooClient.handler - so that the appropriate sync objects can be used by end-users. -- Refactored ChildrenWatcher used by SetPartitioner into a publicly exposed - PatientChildrenWatch under recipe.watchers. - -Deprecations -************ - -- connect/connect_async has been renamed to start/start_async to better match - the stop to indicate connection handling. The prior names are aliased for - the time being. - -Recipes -******* - -- Added Barrier and DoubleBarrier implementation. - -0.2b1 (2012-07-27) ------------------- - -Bug Handling -************ - -- ZOOKEEPER-1318: SystemError is caught and rethrown as the proper invalid - state exception in older zookeeper python bindings where this issue is still - valid. -- ZOOKEEPER-1431: Install the latest zc-zookeeper-static library or use the - packaged ubuntu one for ubuntu 12.04 or later. -- ZOOKEEPER-553: State handling isn't checked via this method, we track it in - a simpler manner with the watcher to ensure we know the right state. - -Features -******** - -- Exponential backoff with jitter for retrying commands. -- Gevent 0.13 and 1.0b support. -- Lock, Party, SetPartitioner, and Election recipe implementations. -- Data and Children watching API's. -- State transition handling with listener registering to handle session state - changes (choose to fatal the app on session expiration, etc.) -- Zookeeper logging stream redirected into Python logging channel under the - name 'Zookeeper'. -- Base client library with handler support for threading and gevent async - environments. - -%package help -Summary: Development documents and examples for kazoo -Provides: python2-kazoo-doc -%description help -===== -Kazoo -===== - -.. image:: https://travis-ci.org/python-zk/kazoo.svg?branch=master - :target: https://travis-ci.org/python-zk/kazoo - :alt: Travis Build - -.. image:: https://img.shields.io/pypi/v/kazoo.svg - :target: https://pypi.python.org/pypi/kazoo/ - :alt: Latest Version - -.. image:: https://img.shields.io/pypi/dm/kazoo.svg - :target: https://pypi.python.org/pypi/kazoo/ - :alt: Downloads +%package help +Summary: Development documents and examples for kazoo +Provides: python2-kazoo-doc +%description help +Kazoo ``kazoo`` implements a higher level API to `Apache Zookeeper`_ for Python clients. -See `the full docs`_ for more information. - -License -======= - -``kazoo`` is offered under the Apache License 2.0. - -Authors -======= - -``kazoo`` started under the `Nimbus Project`_ and through collaboration with -the open-source community has been merged with code from `Mozilla`_ and the -`Zope Corporation`_. It has since gathered an active community of over two -dozen contributors. - -.. _Apache Zookeeper: http://zookeeper.apache.org/ -.. _the full docs: http://kazoo.rtfd.org/ -.. _Nimbus Project: http://www.nimbusproject.org/ -.. _Zope Corporation: http://zope.com/ -.. _Mozilla: http://www.mozilla.org/ - - -Changelog -========= - -2.2.1 (2015-06-17) ------------------- - -Features -******** - -Bug Handling -************ -- handle NameError with basestring on py3k. - -Documentation -************* - -2.2 (2015-06-15) ----------------- - -Documentation -************* - -Features -******** - -- Issue #234: Add support for reconfig cluster membership operation - -Bug Handling -************ - -- #315: multiple acquires of a kazoo lock using the lock recipe would - block when using `acquire` even when non-blocking is specified (only - when the lock was/has been already acquired). -- #318: At exit register takes ``*args`` and ``**kwargs`` not args and kargs - -Documentation -************* - -2.1 (2015-05-11) ----------------- - -Features -******** - -- Start running tests against Zookeeper 3.5.0 alpha and explicitly configure - the `admin.serverPort` in tests to avoid port conflicts. The Zookeeper - alpha version is not yet officially supported. -- Integrate eventlet *handler* support into kazoo so that along with [gevent, - threading] handlers there can now be a dedicated eventlet handler for - projects that need to (or want to) use eventlet (such as those working - in the openstack community). The ``requirements_eventlet.txt`` file lists - the optional eventlet requirement(s) that needs to be satisfied when this - new handler is used. -- Use ``six`` to nicely handle the cross compatibility of kazoo with - python 2.x and 3.x (reducing/removing the need to have custom compatibility - code that replicates what six already provides). -- Add ``state_change_event`` to ``kazoo.recipe.partitioner.SetPartitioner`` - which is set on every state change. -- Add a NonBlockingLease recipe. The recipe allows e.g. cron jobs scheduled - on multiple machines to ensure that at most N instances will run a particular - job, with lease timeout for graceful handover in case of node failures. - - -Bug Handling -************ - -- #291: Kazoo lock recipe was only partially re-entrant in that multiple - calls to `acquire` would obtain the the lock but the first call to `release` - would remove the underlying lock. This would leave the X - 1 other `acquire` - statements unprotected (and no longer holding there expected lock). To fix - this the comment about that lock recipe being re-entrant has been removed - and multiple acquires will now block when attempted. - -- #78: Kazoo now uses socketpairs instead of pipes making it compatible with - Windows. - -- #144, #221: Let `client.command` work with IPv6 addresses. - -- #216: Fixed timeout for ConnectionHandler._invoke. - -- #261: Creating a sequential znode under / doesn't work. - -- #274: Add server_version() retries (by default 4 attempts will be made) to - better handle flakey responses. - -- #271: Fixed handling of KazooState.SUSPENDED in SetPartitioner. - -- #283: Fixed a race condition in SetPartitioner when party changes during - handling of lock acquisition. - -- #303: don't crash on random input as the hosts string. - -Documentation -************* - -- #222: Document that committed on the transaction is used to ensure only one - commit and is not an indicator of whether operations in the transaction - returned desired results. - -2.0 (2014-06-19) ----------------- - -Documentation -************* - -- Extend support to Python 3.4, deprecating Python 3.2. -- Issue #198: Mention Zake as a sophisticated kazoo mock testing library. -- Issue #181: Add documentation on basic logging setup. - - -2.0b1 (2014-04-24) ------------------- - -API Changes -*********** - -- Null or None data is no longer treated as "". Pull req #165, patch by - Raul Gutierrez S. This will affect how you should treat null data in a - znode vs. an empty string. -- Passing acl=[] to create() now works properly instead of an InvalidACLError - as it returned before. Patch by Raul Gutierrez S in PR #164. -- Removed the dependency on zope.interface. The classes in the interfaces - module are left for documentation purposes only (issue #131). - -Features -******** - -- Logging levels have been reduced. - - - Logging previously at the ``logging.DEBUG`` level is now logged at - the ``kazoo.loggingsupport.BLATHER`` level (5). - - - Some low-level logging previously at the ``logging.INFO`` level is - now logged at the ``logging.DEBUG`` level. - -- Issue #133: Introduce a new environment variable `ZOOKEEPER_PORT_OFFSET` - for the testing support, to run the testing cluster on a different range. - -Bug Handling -************ - -- When authenticating via add_auth() the auth data will be saved to ensure that - the authentication happens on reconnect (as is the case when feeding auth - data via KazooClient's constructor). PR #172, patch by Raul Gutierrez S. -- Change gevent import to remove deprecation warning when newer gevent is - used. PR #191, patch by Hiroaki Kawai. -- Lock recipe was failing to use the client's sleep_func causing issues with - gevent. Issue #150. -- Calling a DataWatch or ChildrenWatch instance twice (decorator) now throws - an exception as only a single function can be associated with a single - watcher. Issue #154. -- Another fix for atexit handling so that when disposing of connections the - atexit handler is removed. PR #190, patch by Devaev Maxim. -- Fix atexit handling for kazoo threading handler, PR #183. Patch by - Brian Wickman. -- Partitioner should handle a suspended connection properly and restore - an allocated state if it was allocated previously. Patch by Manish Tomar. -- Issue #167: Closing a client that was never started throws a type error. - Patch by Joshua Harlow. -- Passing dictionaries to KazooClient.__init__() wasn't actually working - properly. Patch by Ryan Uber. -- Issue #119: Handler timeout takes the max of the random interval or - the read timeout to ensure a negative number isn't used for the read - timeout. -- Fix ordering of exception catches in lock.acquire as it was capturing a - parent exception before the child. Patch by ReneSac. -- Fix issue with client.stop() not always setting the client state to - KeeperState.CLOSED. Patch by Jyrki Pulliainen in PR #174. -- Issue #169: Fixed pipes leaking into child processes. - -Documentation -************* - -- Add section on contributing recipes, add maintainer/status information for - existing recipes. -- Add note about alternate use of DataWatch. - -1.3.1 (2013-09-25) ------------------- - -Bug Handling -************ - -- #118, #125, #128: Fix unknown variable in KazooClient `command_retry` - argument handling. - -- #126: Fix `KazooRetry.copy` to correctly copy sleep function. - -- #118: Correct session/socket timeout conversion (int vs. float). - -Documentation -************* - -- #121: Add a note about `kazoo.recipe.queue.LockingQueue` requiring a - Zookeeper 3.4+ server. - - -1.3 (2013-09-05) ----------------- - -Features -******** - -- #115: Limit the backends we use for SLF4J during tests. - -- #112: Add IPv6 support. Patch by Dan Kruchinin. - -1.2.1 (2013-08-01) ------------------- - -Bug Handling -************ - -- Issue #108: Circular import fail when importing kazoo.recipe.watchers - directly has now been resolved. Watchers and partitioner properly import - the KazooState from kazoo.protocol.states rather than kazoo.client. -- Issue #109: Partials not usable properly as a datawatch call can now be - used. All funcs will be called with 3 args and fall back to 2 args if - there's an argument error. -- Issue #106, #107: `client.create_async` didn't strip change root from the - returned path. - -1.2 (2013-07-24) ----------------- - -Features -******** - -- KazooClient can now be stopped more reliably even if its in the middle - of a long retry sleep. This utilizes the new interrupt feature of - KazooRetry which lets the sleep be broken down into chunks and an - interrupt function called to determine if the retry should fail early. - -- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a - max deadline, transition properly when connection fails to LOST, and - setup separate connection retry behavior from client command retry - behavior. Patches by Mike Lundy. - -- Issue #100: Make it easier to see exception context in threading and - connection modules. - -- Issue #85: Increase information density of logs and don't prevent - dynamic reconfiguration of log levels at runtime. - -- Data-watchers for the same node are no longer 'stacked'. That is, if - a get and an exists call occur for the same node with the same watch - function, then it will be registered only once. This change results in - Kazoo behaving per Zookeeper client spec regarding repeat watch use. - -Bug Handling -************ - -- Issue #53: Throw a warning upon starting if the chroot path doesn't exist - so that it's more obvious when the chroot should be created before - performing more operations. - -- Kazoo previously would let the same function be registered as a data-watch - or child-watch multiple times, and then call it multiple times upon being - triggered. This was non-compliant Zookeeper client behavior, the same - watch can now only be registered once for the same znode path per Zookeeper - client documentation. - -- Issue #105: Avoid rare import lock problems by moving module imports in - client.py to the module scope. - -- Issue #103: Allow prefix-less sequential znodes. - -- Issue #98: Extend testing ZK harness to work with different file locations - on some versions of Debian/Ubuntu. - -- Issue #97: Update some docstrings to reflect current state of handlers. - -- Issue #62, #92, #89, #101, #102: Allow KazooRetry to have a - max deadline, transition properly when connection fails to LOST, and - setup separate connection retry behavior from client command retry - behavior. Patches by Mike Lundy. - -API Changes -*********** - -- The `kazoo.testing.harness.KazooTestHarness` class directly inherits from - `unittest.TestCase` and you need to ensure to call its `__init__` method. - -- DataWatch no longer takes any parameters besides for the optional function - during instantiation. The additional options are now implicitly True, with - the user being left to ignore events as they choose. See the DataWatch - API docs for more information. - -- Issue #99: Better exception raised when the writer fails to close. A - WriterNotClosedException that inherits from KazooException is now raised - when the writer fails to close in time. - -1.1 (2013-06-08) ----------------- - -Features -******** - -- Issue #93: Add timeout option to lock/semaphore acquire methods. - -- Issue #79 / #90: Add ability to pass the WatchedEvent to DataWatch and - ChildWatch functions. - -- Respect large client timeout values when closing the connection. - -- Add a `max_leases` consistency check to the semaphore recipe. - -- Issue #76: Extend testing helpers to allow customization of the Java - classpath by specifying the new `ZOOKEEPER_CLASSPATH` environment variable. - -- Issue #65: Allow non-blocking semaphore acquisition. - -Bug Handling -************ - -- Issue #96: Provide Windows compatibility in testing harness. - -- Issue #95: Handle errors deserializing connection response. - -- Issue #94: Clean up stray bytes in connection pipe. - -- Issue #87 / #88: Allow re-acquiring lock after cancel. - -- Issue #77: Use timeout in initial socket connection. - -- Issue #69: Only ensure path once in lock and semaphore recipes. - -- Issue #68: Closing the connection causes exceptions to be raised by watchers - which assume the connection won't be closed when running commands. - -- Issue #66: Require ping reply before sending another ping, otherwise the - connection will be considered dead and a ConnectionDropped will be raised - to trigger a reconnect. - -- Issue #63: Watchers weren't reset on lost connection. - -- Issue #58: DataWatcher failed to re-register for changes after non-existent - node was created then deleted. - -API Changes -*********** - -- KazooClient.create_async now supports the makepath argument. - -- KazooClient.ensure_path now has an async version, ensure_path_async. - -1.0 (2013-03-26) ----------------- - -Features -******** - -- Added a LockingQueue recipe. The queue first locks an item and removes it - from the queue only after the consume() method is called. This enables other - nodes to retake the item if an error occurs on the first node. - -Bug Handling -************ - -- Issue #50: Avoid problems with sleep function in mixed gevent/threading - setup. - -- Issue #56: Avoid issues with watch callbacks evaluating to false. - -1.0b1 (2013-02-24) ------------------- - -Features -******** - -- Refactored the internal connection handler to use a single thread. It now - uses a deque and pipe to signal the ZK thread that there's a new command to - send, so that the ZK thread can send it, or retrieve a response. - Processing ZK requests and responses serially in a single thread eliminates - the need for a bunch of the locking, the peekable queue and two threads - working on the same underlying socket. - -- Issue #48: Added documentation for the `retry` helper module. - -- Issue #55: Fix `os.pipe` file descriptor leak and introduce a - `KazooClient.close` method. The method is particular useful in tests, where - multiple KazooClients are created and closed in the same process. - -Bug Handling -************ - -- Issue #46: Avoid TypeError in GeneratorContextManager on process shutdown. - -- Issue #43: Let DataWatch return node data if allow_missing_node is used. - -0.9 (2013-01-07) ----------------- - -API Changes -*********** - -- When a retry operation ultimately fails, it now raises a - `kazoo.retry.RetryFailedError` exception, instead of a general `Exception` - instance. `RetryFailedError` also inherits from the base `KazooException`. - -Features -******** - -- Improvements to Debian packaging rules. - -Bug Handling -************ - -- Issue #39 / #41: Handle connection dropped errors during session writes. - Ensure client connection is re-established to a new ZK node if available. - -- Issue #38: Set `CLOEXEC` flag on all sockets when available. - -- Issue #37 / #40: Handle timeout errors during `select` calls on sockets. - -- Issue #36: Correctly set `ConnectionHandler.writer_stopped` even if an - exception is raised inside the writer, like a retry operation failing. - -0.8 (2012-10-26) ----------------- - -API Changes -*********** - -- The `KazooClient.__init__` took as `watcher` argument as its second keyword - argument. The argument had no effect anymore since version 0.5 and was - removed. - -Bug Handling -************ - -- Issue #35: `KazooClient.__init__` didn't pass on `retry_max_delay` to the - retry helper. - -- Issue #34: Be more careful while handling socket connection errors. - -0.7 (2012-10-15) ----------------- - -Features -******** - -- DataWatch now has a `allow_missing_node` setting that allows a watch to be - set on a node that doesn't exist when the DataWatch is created. -- Add new Queue recipe, with optional priority support. -- Add new Counter recipe. -- Added debian packaging rules. - -Bug Handling -************ - -- Issue #31 fixed: Only catch KazooExceptions in catch-all calls. -- Issue #15 fixed again: Force sleep delay to be a float to appease gevent. -- Issue #29 fixed: DataWatch and ChildrenWatch properly re-register their - watches on server disconnect. - -0.6 (2012-09-27) ----------------- - -API Changes -*********** - -- Node paths are assumed to be Unicode objects. Under Python 2 pure-ascii - strings will also be accepted. Node values are considered bytes. The byte - type is an alias for `str` under Python 2. -- New KeeperState.CONNECTED_RO state for Zookeeper servers connected in - read-only mode. -- New NotReadOnlyCallError exception when issuing a write change against a - server thats currently read-only. - -Features -******** - -- Add support for Python 3.2, 3.3 and PyPy (only for the threading handler). -- Handles connecting to Zookeeper 3.4+ read-only servers. -- Automatic background scanning for a Read/Write server when connected to a - server in read-only mode. -- Add new Semaphore recipe. -- Add a new `retry_max_delay` argument to the client and by default limit the - retry delay to at most an hour regardless of exponential backoff settings. -- Add new `randomize_hosts` argument to `KazooClient`, allowing one to disable - host randomization. - -Bug Handling -************ - -- Fix bug with locks not handling intermediary lock contenders disappearing. -- Fix bug with set_data type check failing to catch unicode values. -- Fix bug with gevent 0.13.x backport of peekable queue. -- Fix PatientChildrenWatch to use handler specific sleep function. - -0.5 (2012-09-06) ----------------- - -Skipping a version to reflect the magnitude of the change. Kazoo is now a pure -Python client with no C bindings. This release should run without a problem -on alternate Python implementations such as PyPy and Jython. Porting to Python -3 in the future should also be much easier. - -Documentation -************* - -- Docs have been restructured to handle the new classes and locations of the - methods from the pure Python refactor. - -Bug Handling -************ - -This change may introduce new bugs, however there is no longer the possibility -of a complete Python segfault due to errors in the C library and/or the C -binding. - -- Possible segfaults from the C lib are gone. -- Password mangling due to the C lib is gone. -- The party recipes didn't set their participating flag to False after - leaving. - -Features -******** - -- New `client.command` and `client.server_version` API, exposing Zookeeper's - four letter commands and giving access to structured version information. -- Added 'include_data' option for get_children to include the node's Stat - object. -- Substantial increase in logging data with debug mode. All correspondence with - the Zookeeper server can now be seen to help in debugging. - -API Changes -*********** - -- The testing helpers have been moved from `testing.__init__` into a - `testing.harness` module. The official API's of `KazooTestCase` and - `KazooTestHarness` can still be directly imported from `testing`. -- The kazoo.handlers.util module was removed. -- Backwards compatible exception class aliases are provided for now in kazoo - exceptions for the prior C exception names. -- Unicode strings now work fine for node names and are properly converted to - and from unicode objects. -- The data value argument for the create and create_async methods of the - client was made optional and defaults to an empty byte string. The data - value must be a byte string. Unicode values are no longer allowed and - will raise a TypeError. - - -0.3 (2012-08-23) ----------------- - -API Changes -*********** - -- Handler interface now has an rlock_object for use by recipes. - -Bug Handling -************ - -- Fixed password bug with updated zc-zookeeper-static release, which retains - null bytes in the password properly. -- Fixed reconnect hammering, so that the reconnection follows retry jitter and - retry backoff's. -- Fixed possible bug with using a threading.Condition in the set partitioner. - Set partitioner uses new rlock_object handler API to get an appropriate RLock - for gevent. -- Issue #17 fixed: Wrap timeout exceptions with staticmethod so they can be - used directly as intended. Patch by Bob Van Zant. -- Fixed bug with client reconnection looping indefinitely using an expired - session id. - -0.2 (2012-08-12) ----------------- - -Documentation -************* - -- Fixed doc references to start_async using an AsyncResult object, it uses - an Event object. - -Bug Handling -************ - -- Issue #16 fixed: gevent zookeeper logging failed to handle a monkey patched - logging setup. Logging is now setup such that a greenlet is used for logging - messages under gevent, and the thread one is used otherwise. -- Fixed bug similar to #14 for ChildrenWatch on the session listener. -- Issue #14 fixed: DataWatch had inconsistent handling of the node it was - watching not existing. DataWatch also properly spawns its _get_data function - to avoid blocking session events. -- Issue #15 fixed: sleep_func for SequentialGeventHandler was not set on the - class appropriately leading to additional arguments being passed to - gevent.sleep. -- Issue #9 fixed: Threads/greenlets didn't gracefully shut down. Handler now - has a start/stop that is used by the client when calling start and stop that - shuts down the handler workers. This addresses errors and warnings that could - be emitted upon process shutdown regarding a clean exit of the workers. -- Issue #12 fixed: gevent 0.13 doesn't use the same start_new_thread as gevent - 1.0 which resulted in a fully monkey-patched environment halting due to the - wrong thread. Updated to use the older kazoo method of getting the real thread - module object. - -API Changes -*********** - -- The KazooClient handler is now officially exposed as KazooClient.handler - so that the appropriate sync objects can be used by end-users. -- Refactored ChildrenWatcher used by SetPartitioner into a publicly exposed - PatientChildrenWatch under recipe.watchers. - -Deprecations -************ - -- connect/connect_async has been renamed to start/start_async to better match - the stop to indicate connection handling. The prior names are aliased for - the time being. - -Recipes -******* - -- Added Barrier and DoubleBarrier implementation. - -0.2b1 (2012-07-27) ------------------- - -Bug Handling -************ - -- ZOOKEEPER-1318: SystemError is caught and rethrown as the proper invalid - state exception in older zookeeper python bindings where this issue is still - valid. -- ZOOKEEPER-1431: Install the latest zc-zookeeper-static library or use the - packaged ubuntu one for ubuntu 12.04 or later. -- ZOOKEEPER-553: State handling isn't checked via this method, we track it in - a simpler manner with the watcher to ensure we know the right state. - -Features -******** - -- Exponential backoff with jitter for retrying commands. -- Gevent 0.13 and 1.0b support. -- Lock, Party, SetPartitioner, and Election recipe implementations. -- Data and Children watching API's. -- State transition handling with listener registering to handle session state - changes (choose to fatal the app on session expiration, etc.) -- Zookeeper logging stream redirected into Python logging channel under the - name 'Zookeeper'. -- Base client library with handler support for threading and gevent async - environments. %prep %autosetup -n kazoo-2.2.1 @@ -2128,5 +85,7 @@ mv %{buildroot}/doclist.lst . %{_docdir}/* %changelog +* Tue May 25 2021 openstack-sig +- Fix Provides * Wed May 12 2021 openstack-sig - Package Spec generated -- Gitee