-
Notifications
You must be signed in to change notification settings - Fork 147
Open
Description
生产环境有 4 个 beanstalkd 节点,调用 dp.Producer 的 Delay 方法时偶尔触发 runtime error: index out of range。
go 版本:1.21.5
go-zero 版本:1.7.2
go-queue 版本:1.2.2
错误信息如下:
runtime error: index out of range [-1]
goroutine 69022297 [running]:
runtime/debug.Stack()
/usr/local/golang/go-v1.21.5/src/runtime/debug/stack.go:24 +0x5e
github.com/zeromicro/go-zero/core/logx.writeStack({0xc003040d80, 0x26})
/var/lib/jenkins/go/pkg/mod/github.com/zeromicro/[email protected]/core/logx/logs.go:572 +0x34
github.com/zeromicro/go-zero/core/logx.ErrorStack({0xc0016aeca0?, 0x0?, 0x0?})
/var/lib/jenkins/go/pkg/mod/github.com/zeromicro/[email protected]/core/logx/logs.go:146 +0x2a
github.com/zeromicro/go-zero/core/rescue.Recover({0x0, 0x0, 0xc003d422a0?})
/var/lib/jenkins/go/pkg/mod/github.com/zeromicro/[email protected]/core/rescue/recover.go:20 +0x76
panic({0x16ff360?, 0xc011fd2eb8?})
/usr/local/golang/go-v1.21.5/src/runtime/panic.go:914 +0x21f
math/rand.(*rngSource).Uint64(...)
/usr/local/golang/go-v1.21.5/src/math/rand/rng.go:249
math/rand.(*rngSource).Int63(0x154c240?)
/usr/local/golang/go-v1.21.5/src/math/rand/rng.go:234 +0x92
math/rand.(*Rand).Int63(...)
/usr/local/golang/go-v1.21.5/src/math/rand/rand.go:96
math/rand.(*Rand).Uint32(...)
/usr/local/golang/go-v1.21.5/src/math/rand/rand.go:99
math/rand.(*Rand).int31n(0xc0005d1320, 0x3)
/usr/local/golang/go-v1.21.5/src/math/rand/rand.go:168 +0x87
math/rand.(*Rand).Shuffle(0x0?, 0x43e44e?, 0xc0016aeef0)
/usr/local/golang/go-v1.21.5/src/math/rand/rand.go:264 +0x79
github.com/zeromicro/go-queue/dq.(*producerCluster).getWriteNodes(0xc00c77c1a0?)
/var/lib/jenkins/go/pkg/mod/github.com/zeromicro/[email protected]/dq/producer.go:123 +0xc5
github.com/zeromicro/go-queue/dq.(*producerCluster).insert.func1(0xc0016aefa8?)
/var/lib/jenkins/go/pkg/mod/github.com/zeromicro/[email protected]/dq/producer.go:136 +0x1f
github.com/zeromicro/go-zero/core/fx.From.func1()
/var/lib/jenkins/go/pkg/mod/github.com/zeromicro/[email protected]/core/fx/stream.go:63 +0x4d
github.com/zeromicro/go-zero/core/threading.RunSafe(0x0?)
/var/lib/jenkins/go/pkg/mod/github.com/zeromicro/[email protected]/core/threading/routines.go:38 +0x33
created by github.com/zeromicro/go-zero/core/threading.GoSafe in goroutine 246
/var/lib/jenkins/go/pkg/mod/github.com/zeromicro/[email protected]/core/threading/routines.go:14 +0x4f
查看报错的相关代码:
func (p *producerCluster) cloneNodes() []Producer {
return append([]Producer(nil), p.nodes...)
}
func (p *producerCluster) getWriteNodes() []Producer {
if len(p.nodes) <= replicaNodes {
return p.nodes
}
nodes := p.cloneNodes()
rng.Shuffle(len(nodes), func(i, j int) {
nodes[i], nodes[j] = nodes[j], nodes[i]
})
return nodes[:replicaNodes]
}
p.nodes 长度小于等于 replicaNodes(3) 不会调用 rng.Shuffle;
大于 replicaNodes 时不应触发此类错误,而且 p.nodes 在包外是无法修改的;
所以应该和使用调用方式无关,属于包内问题。
Metadata
Metadata
Assignees
Labels
No labels