- Fix: add 1-buffer for error channels, prevents leaking goroutines. #140
- Feature: support forwarding headers. #141
- Feature: testpop takes an additional -stats-udp or -stats-file flag that can be used to emit statsd messages to a file or over the network. #144
- Fix: race condition when loading hostlist in discover provider. #145
- Testing: add suspect, faulty and tombstope period command-line flags to testpop. #148
- Fix: use oneself as a source when creating a change for reincarnation. #150
- Maintainability: move from godep to Glide. #151
- Maintainability: emit lookup and lookupn stats and add a lookupn-event. #152.
- Fix: do not reincarnate twice unnecessarily. #153
- Feature: Automatic healing of fully partitioned rings that could be cause by temporary network failure. #135 #128 #129
- Fix: Fullsyncs are now executed in both directions to prevent persistent asymmetrical partitions. #134
- Fix: Overcome protocol incompatibilities in the dissemination of tombstones for the reaping of faulty nodes. #133 #132
- Fix: Leaking goroutines on an error response after a timeout. #140
- Maintainability: Refactor of internal use of the Discovery Provider. #130
- Testing: Pin mockery to a specific version for testing stability. #136
- Testing: Add Go race detector on CI. #137
It is advised to complete the deployment of this version within 24 hours after
the first node is upgraded. Since the reaping of faulty nodes is added to this
release a node that upgraded to this version will mark all the faulty members of
the ringpop cluster as tombstones (the new state introduced for the reaping of
faulty nodes) 24 hours after the deploy. If older versions of ringpop run in a
cluster that starts declaring these tombstones
the cluster will jump in endless
fullsyncs mode. Ringpop operates normally under these conditions but extra load
on both network and CPU are in effect during this time. The fullsyncs will
automatically resolve as soon as all members are upgraded to this version. Same
might happen during a partial rollback that operates for a longer period of time.
- Reverting reaping faulty nodes feature temporarily while investigate backwards compatibility issues.
- Feature: Faulty nodes are now automatically reaped from nodes' membership lists after (24 hours by default). #123
- New options for controlling suspect and reaping times. #123
- Add new
Ready
andDestroyed
events to ringpop. #125 - Add additional logging to bring ringpop-go on par with ringpop-node log messages. #116
- Fix bug where Ringpop automatically added itself to the bootstrap hosts for host-based bootstrapping, but not other bootstrapping methods. #120
- Fix race condition where membership and hashring could be inconsistent with each other. #112
- Remove
File
andHost
options from bootstrap options in favor ofDiscoverProvider
interface. #120 - Add Go 1.6 to testing on CI
Since 0.4.0 introduces a new node/member state, 0.4.0 is not backwards-compatible with previous versions.
Note rolling upgrades with older versions do work, but undefined behaviour will occur if two versions run in parallel for longer than the FaultyPeriod
(default 24 hours).
This release contains a breaking change to the options provided to the
ringpop.Bootstrap
call.
BootstrapOptions.File
and BootstrapOptions.Hosts
have been replaced with
BootstrapOptions.DiscoverProvider
. DiscoverProvider
is an interface which
requires a single method:
type DiscoverProvider interface {
Hosts() ([]string, error)
}
Ringpop comes with DiscoverProviders for the previous File
and Hosts
options out of the box.
To upgrade if you were previously using File
:
+ "github.com/uber/ringpop-go/discovery/jsonfile"
...
- bootstrapOpts.File = *hostfile
+ bootstrapOpts.DiscoverProvider = jsonfile.New(*hostfile)
For static Hosts
:
+ "github.com/uber/ringpop-go/discovery/statichosts"
...
- bootstrapOpts.Hosts = []string{"127.0.0.1:3000", "127.0.0.1:3001"}
+ bootstrapOpts.DiscoverProvider = statichosts.New("127.0.0.1:3000", "127.0.0.1:3001")
- Fix "keys have diverged" forwarding error for retries #69
- Fix possible race in disseminator #86
- Fix possible issue with leave state not being applied correctly #94
- Fix issues where unnecessary full syncs could occur #95, #97
- Improvements to join:
- Join retries now have exponential backoff #68
- Improved resilience to possible partitions at startup #65
- Reduce network chatter on join #85
- Hashring performance improvements (see discussion on #58) #58
- Revamped logging; new logger options #83
- New stats to aid partition detection #92, #104
- Improved test coverage across the board
- Update and test with latest TChannel (v1.0.3) #103
- Various fixes and improvements to test infrastructure
- Fix retry mechanism for forwarded requests. When multiple keys are forwarded and a retry is attempted, the retry would fail with a "key destinations have diverged" error.
- Fix goroutine leakage on forwarded requests that time out
- Add Thrift forwarding support #31
- Add
Ringpop.Ready()
#32 - Add
Ringpop.GetReachableMembers()
andRingpop.CountReachableMembers()
#29 - Add
Ringpop.Forward()
#26 - Lazy initialization and identity autodetection #40
- Improve stats and bring them in-line with those emitted by ringpop-node #46
- Automatically add self to bootstrap list #41
- Improve HashRing API #38
- Improve tests #35
- Improve constructor options pattern for Ringpop #33
- Disable TChannel retries and zipkin tracing #28
- Fix headers sent with forwarded requests #22
There are a significant number of breaking changes in this release:
- Ringpop constructor has been renamed from
Ringpop.NewRingpop
toringpop.New(app string, opts ...Option)
and now accepts optional functional arguments. See the package documentation for a list of options. ringpop.Bootstrap
now acceptsswim.BootstrapOptions
.ringpop.BootstrapOptions
has been removed.- Many public methods now return an error if they are called before the ring is bootstrapped. Signatures for the changed methods are:
Bootstrap(opts *swim.BootstrapOptions) ([]string, error)
Checksum() (uint32, error)
Lookup(key string) (string, error)
LookupN(key string, n int) ([]string, error)
Uptime() (time.Duration, error)
WhoAmI() (string, error)
- Removed public method
ringpop.Destroyed()
. Use the newringpop.Ready()
to determine if the ring is ready or not. - Events moved to
ringpop.events
package. This includes:EventListener
RingChangedEvent
RingChecksumEvent
LookupEvent
- The behaviour of creating a single-node cluster has changed. Calling
Bootstrap()
with no bootstrap file or hosts will now cause Ringpop to create a single-node cluster.
- Initial public release