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

mvcc: fix panic by allowing future revision watcher from restore operation #9775

Merged
merged 2 commits into from
May 31, 2018

Commits on May 25, 2018

  1. integration: enable TestV3WatchRestoreSnapshotUnsync for gRPC proxy

    Signed-off-by: Gyuho Lee <gyuhox@gmail.com>
    gyuho committed May 25, 2018
    Configuration menu
    Copy the full SHA
    86d1d3e View commit details
    Browse the repository at this point in the history
  2. mvcc: fix panic by allowing future revision watcher from restore oper…

    …ation
    
    This also happens without gRPC proxy.
    
    Fix panic when gRPC proxy leader watcher is restored:
    
    ```
    go test -v -tags cluster_proxy -cpu 4 -race -run TestV3WatchRestoreSnapshotUnsync
    
    === RUN   TestV3WatchRestoreSnapshotUnsync
    panic: watcher minimum revision 9223372036854775805 should not exceed current revision 16
    
    goroutine 156 [running]:
    github.com/coreos/etcd/mvcc.(*watcherGroup).chooseAll(0xc4202b8720, 0x10, 0xffffffffffffffff, 0x1)
    	/home/gyuho/go/src/github.com/coreos/etcd/mvcc/watcher_group.go:242 +0x3b5
    github.com/coreos/etcd/mvcc.(*watcherGroup).choose(0xc4202b8720, 0x200, 0x10, 0xffffffffffffffff, 0xc420253378, 0xc420253378)
    	/home/gyuho/go/src/github.com/coreos/etcd/mvcc/watcher_group.go:225 +0x289
    github.com/coreos/etcd/mvcc.(*watchableStore).syncWatchers(0xc4202b86e0, 0x0)
    	/home/gyuho/go/src/github.com/coreos/etcd/mvcc/watchable_store.go:340 +0x237
    github.com/coreos/etcd/mvcc.(*watchableStore).syncWatchersLoop(0xc4202b86e0)
    	/home/gyuho/go/src/github.com/coreos/etcd/mvcc/watchable_store.go:214 +0x280
    created by github.com/coreos/etcd/mvcc.newWatchableStore
    	/home/gyuho/go/src/github.com/coreos/etcd/mvcc/watchable_store.go:90 +0x477
    exit status 2
    FAIL	github.com/coreos/etcd/integration	2.551s
    ```
    
    gRPC proxy spawns a watcher with a key "proxy-namespace__lostleader"
    and watch revision "int64(math.MaxInt64 - 2)" to detect leader loss.
    But, when the partitioned node restores, this watcher triggers
    panic with "watcher minimum revision ... should not exceed current ...".
    
    This check was added a long time ago, by my PR, when there was no gRPC proxy:
    
    etcd-io#4043 (comment)
    
    > we can remove this checking actually. it is impossible for a unsynced watching to have a future rev. or we should just panic here.
    
    However, now it's possible that a unsynced watcher has a future
    revision, when it was moved from a synced watcher group through
    restore operation.
    
    This PR adds "restore" flag to indicate that a watcher was moved
    from the synced watcher group with restore operation. Otherwise,
    the watcher with future revision in an unsynced watcher group
    would still panic.
    
    Example logs with future revision watcher from restore operation:
    
    ```
    {"level":"info","ts":1527196358.9057755,"caller":"mvcc/watcher_group.go:261","msg":"choosing future revision watcher from restore operation","watch-key":"proxy-namespace__lostleader","watch-revision":9223372036854775805,"current-revision":16}
    {"level":"info","ts":1527196358.910349,"caller":"mvcc/watcher_group.go:261","msg":"choosing future revision watcher from restore operation","watch-key":"proxy-namespace__lostleader","watch-revision":9223372036854775805,"current-revision":16}
    ```
    
    Signed-off-by: Gyuho Lee <gyuhox@gmail.com>
    gyuho committed May 25, 2018
    Configuration menu
    Copy the full SHA
    0398ec7 View commit details
    Browse the repository at this point in the history