Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update #4

Open
wants to merge 88 commits into
base: master
Choose a base branch
from
Open

Update #4

wants to merge 88 commits into from

Conversation

leibowitz
Copy link

But keep most of the changes that were made

samuel and others added 30 commits October 27, 2014 10:26
Sometimes zookeeper just drops connection on invalid session data,
we prefer to drop session and start from scratch when that event
occurs instead of dropping into loop of connect/disconnect attempts.

This can be emulated by stopping zookeeper, cleaning it's database and
starting it again. But we experience same bug in production without
cleaning zookeeper, but in case of network partition (not every partition
event).
Add timeouts around IO calls during authenticate
I have a need for polling the Zookeeper instance with some of the four-letter words. In this PR te following words are implemneted with tests:

* srvr
* cons
* ruok

`srvr` get some stats about the server (connections, latencies, leader/follower mode, etc.)
`cons` gets detailed information about the individual connections and their sessions
`ruok` is actually mostly useless, but specifies whether the server has returned `imok` when prompted with `ruok`

I'm not sold on the name of the public API functions, `FLWCons()`, and would happily change them to something better.
Without that patch Conn.Close cannot interrupt Conn.connect.
So it's impossible to dispose two goroutines related to a connection,
if the connection hasn't been established yet.

Signed-off-by: Anton Tiurin <[email protected]>
[Fix] Conn.Close stops all goroutines if we haven't connencted yet
add support for some of the FourLetter words
Fix continuous loop of connect attempts
By adding this Logger interface, and by fulfilling the interface with a function that has no body, you can silence the log messages from the *zk.Conn instance. The `Connect()` and `ConnectWithDialer()` functions both set the logger up by default to log to `Stderr`.

Fixes samuel#60.
* remove custom formatting in one of the `Printf()` statements to add a newline character at the end
* changed how the default logger is instantiated -- new defaultLogger type, and an exported variable that is an instance of it
add a Logger interface and setter for the logging Printf calls
ZooKeeper seemingly has a bug in which if it receives a Set request with
an empty path then it'll take down the server. This change returns a
client side error on empty paths as it's not a valid request regardless.
samuel and others added 30 commits May 18, 2016 13:53
Background:

The channel approach causes lost events during period of scheduling contention.
Of particular harm is the loss of HasSession since it's usually the state that
triggers actions.

The callback approch puts the responsiblity on the caller of the library to
decide on the tradeoff between losing events and blocking the main event loop.
This causes problems if Authentication is enabled.
Previously the code wasn't correctly unpacking error responses for Multi()
calls. If any operation within the Multi() call failed, we'd return
ErrAPIError.

This patch extracts the error code from each multiResponseOp, allowing
the caller to determine which specific operation failed. The error code from
the first op to fail is used as the return error for the Multi() call.
Add an option to supply a callback to be run for each Event.
Handle Multi() errors correctly.
In case when reconnection occurs, it is necessary to re-authenticate
with ZK because it "forgets" the authentication data.
Do not try to create intermitent nodes if they exist during Lock()
Re-submit authentication data on reconnect
Consider the case where there are two clients contending for a lock.
The first creates  '/lock/00000'
The second creates '/lock/00001'

Now, the first lists the children of '/lock' and sees that it has
created the lock and returns.

The second starts looping through the children in the aforementioned order.
Before the first child is processed we have
lowestSeq=1
prevSeq=0
prevSeqPath=""

Since the first child is '00000' we set lowestSeq=0.
However, prevSeq == s, so the second condition fails and
we don't update the prevSeqPath.

Then we process '00001' and again, since s == seq, so !(s<seq), we again
don't update prevSeqPath.

This leads to a scenario where lowerdown we call GetW("/lock/") instead of GetW("/lock/00000")
Conflicts:
	zk/conn.go
	zk/lock.go
	zk/structs.go
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.