storage: provide a way to escape from SeekAsync goroutine
A routine blocked on channel send here can't really exit, so avoid goroutine leak: goroutine 2813725 [chan send, 6 minutes]: github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).SeekAsync.func1.1(0xc01a7118f7, 0x2, 0x25, 0xc01a7118f9, 0x23, 0x23, 0xc0366c7c01) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:120 +0x86 github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).seek.func2(0xc0079e7920, 0xa, 0x30, 0xc0079e792a, 0x26, 0x26, 0x1) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:183 +0x347 github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).seek(0xc000458480, 0x135c028, 0xc0000445d0, 0xc00f1721d0, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0, ...) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:224 +0x4f4 github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).Seek(0xc000458480, 0xc00f1721d0, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0, 0xc0357c6620) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:110 +0x8a github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).seek(0xc0331a4f00, 0x135bff0, 0xc00ae26ec0, 0xc00f1721d0, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0, ...) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:210 +0x379 github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).SeekAsync.func1(0xc0331a4f00, 0x135bff0, 0xc00ae26ec0, 0xc00f1721d0, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0, ...) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:119 +0xc5 created by github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).SeekAsync github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:118 +0xc8 goroutine 2822823 [chan send, 6 minutes]: github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).SeekAsync.func1.1(0xc011859b77, 0x3, 0x3, 0xc017bea8d0, 0x26, 0x26, 0xc00f1afc00) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:120 +0x86 github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).seek.func2(0xc011859b60, 0xa, 0xa, 0xc017bea8a0, 0x26, 0x26, 0xc00ad9fb00) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:200 +0x47e github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).seek.func2(0xc01d5d8c90, 0xa, 0x30, 0xc01d5d8c9a, 0x26, 0x26, 0x1) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:200 +0x47e github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).seek(0xc035e12900, 0x135c028, 0xc0000445d0, 0xc01773bf60, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0, ...) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:224 +0x4f4 github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).Seek(0xc035e12900, 0xc01773bf60, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0, 0xc030c9e0e0) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:110 +0x8a github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).seek(0xc000458480, 0x135c028, 0xc0000445d0, 0xc01773bf60, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0, ...) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:210 +0x379 github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).Seek(0xc000458480, 0xc01773bf60, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0, 0xc030c9e070) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:110 +0x8a github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).seek(0xc00b340c60, 0x135bff0, 0xc00f1afbc0, 0xc01773bf60, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0, ...) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:210 +0x379 github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).SeekAsync.func1(0xc00b340c60, 0x135bff0, 0xc00f1afbc0, 0xc01773bf60, 0x7, 0x7, 0x0, 0x0, 0x0, 0x0, ...) github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:119 +0xc5 created by github.com/nspcc-dev/neo-go/pkg/core/storage.(*MemCachedStore).SeekAsync github.com/nspcc-dev/neo-go/pkg/core/storage/memcached_store.go:118 +0xc8 ...
This commit is contained in:
parent
3307292597
commit
de99c3acdb
1 changed files with 5 additions and 4 deletions
|
@ -97,11 +97,12 @@ func (s *MemCachedStore) SeekAsync(ctx context.Context, rng SeekRange, cutPrefix
|
|||
res := make(chan KeyValue)
|
||||
go func() {
|
||||
s.seek(ctx, rng, cutPrefix, func(k, v []byte) bool {
|
||||
res <- KeyValue{
|
||||
Key: k,
|
||||
Value: v,
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return false
|
||||
case res <- KeyValue{Key: k, Value: v}:
|
||||
return true
|
||||
}
|
||||
return true // always continue, we have context for early stop.
|
||||
})
|
||||
close(res)
|
||||
}()
|
||||
|
|
Loading…
Reference in a new issue