forked from apache/cassandra-gocql-driver
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
policy: tokenAwareHostPolicy host selection bug fix (apache#1261)
* policy: tokenAwareHostPolicy host selection bug fix Bug: `tokenAwareHostPolicy` always selects a primary replica of a token. When using `tokenAwareHostPolicy` backed by `dcAwareRR`, for tokens with primary replica in a different DC, this results in selecting a RANDOM host in a given DC. This is caused by two issues in `tokenAwareHostPolicy::getReplicas` func. * `tokenAwareHostPolicy::meta` is always nil unless a keyspace changed event it received * even when metadata is available it uses the calculated token value of a partition key to find replicas, however, the replicas are stored in a map where the key is the primary replica token aka the `end_token` (nodetool describering) Solution: This commit extends `tokenRing::GetHostForPartitionKey` to return the endToken that is later used in the `Pick` function, and forces a call to `KeyspaceChanged` when session is initialised. Signed-off-by: Michał Matczuk <michal@scylladb.com> * policy: tokenAwareHostPolicy update keyspace metadata on host add or remove events Currently when host is added or removed tokenAwareHostPolicy uses old replica information. This is fixed by extracting the `KeyspaceChanged` function body as `updateKeyspaceMetadata` and calling after the token ring is updated. Signed-off-by: Michał Matczuk <michal@scylladb.com> * policy: tokenAwareHostPolicy type assertion bug fix Fixes inappropriate type assertion ``` --- FAIL: TestTokenAwareConnPool (0.64s) panic: interface conversion: interface {} is nil, not *gocql.tokenRing [recovered] panic: interface conversion: interface {} is nil, not *gocql.tokenRing goroutine 4058 [running]: testing.tRunner.func1(0xc42010c0f0) /home/travis/.gimme/versions/go1.10.linux.amd64/src/testing/testing.go:742 +0x567 panic(0x886740, 0xc420318cc0) /home/travis/.gimme/versions/go1.10.linux.amd64/src/runtime/panic.go:505 +0x24a github.com/gocql/gocql.(*tokenAwareHostPolicy).updateKeyspaceMetadata(0xc4210f1d80, 0x8dd7aa, 0xa) /home/travis/gopath/src/github.com/gocql/gocql/policies.go:445 +0x55c github.com/gocql/gocql.(*tokenAwareHostPolicy).AddHost(0xc4210f1d80, 0xc420668580) /home/travis/gopath/src/github.com/gocql/gocql/policies.go:478 +0xcc github.com/gocql/gocql.(*Session).addNewNode(0xc420f40380, 0xc420668580) /home/travis/gopath/src/github.com/gocql/gocql/events.go:188 +0xee github.com/gocql/gocql.(*Session).handleNodeUp(0xc420f40380, 0xc420f00630, 0x10, 0x10, 0x2352, 0x0) /home/travis/gopath/src/github.com/gocql/gocql/events.go:273 +0x2e9 github.com/gocql/gocql.(*controlConn).setupConn(0xc42113c080, 0xc420782400, 0x3, 0x4) /home/travis/gopath/src/github.com/gocql/gocql/control.go:289 +0x1fc github.com/gocql/gocql.(*controlConn).connect(0xc42113c080, 0xc42113e820, 0x3, 0x4, 0xc42113e820, 0x3) /home/travis/gopath/src/github.com/gocql/gocql/control.go:252 +0x218 github.com/gocql/gocql.(*Session).init(0xc420f40380, 0xc420c338f0, 0x0) /home/travis/gopath/src/github.com/gocql/gocql/session.go:197 +0x80e github.com/gocql/gocql.NewSession(0xc420094960, 0x3, 0x3, 0x8dc0cd, 0x5, 0x4, 0xdf8475800, 0x23c34600, 0x2352, 0x8dd7aa, ...) /home/travis/gopath/src/github.com/gocql/gocql/session.go:160 +0x1138 github.com/gocql/gocql.(*ClusterConfig).CreateSession(0xc421122000, 0xc420566de0, 0x0, 0xc420046800) /home/travis/gopath/src/github.com/gocql/gocql/cluster.go:185 +0x8d github.com/gocql/gocql.createSessionFromCluster(0xc421122000, 0x9421a0, 0xc42010c0f0, 0x0) /home/travis/gopath/src/github.com/gocql/gocql/common_test.go:136 +0x116 github.com/gocql/gocql.TestTokenAwareConnPool(0xc42010c0f0) /home/travis/gopath/src/github.com/gocql/gocql/cassandra_test.go:2520 +0x195 testing.tRunner(0xc42010c0f0, 0x8f98a0) /home/travis/.gimme/versions/go1.10.linux.amd64/src/testing/testing.go:777 +0x16e created by testing.(*T).Run /home/travis/.gimme/versions/go1.10.linux.amd64/src/testing/testing.go:824 +0x565 exit status 2 ``` Signed-off-by: Michał Matczuk <michal@scylladb.com>
- Loading branch information
Showing
5 changed files
with
68 additions
and
53 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters