Skip to content

dq 的 producerCluster 在使用中偶尔触发 runtime error: index out of range  #80

@marsmay

Description

@marsmay

生产环境有 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/go-zero@v1.7.2/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/go-zero@v1.7.2/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/go-zero@v1.7.2/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/go-queue@v1.2.2/dq/producer.go:123 +0xc5
github.com/zeromicro/go-queue/dq.(*producerCluster).insert.func1(0xc0016aefa8?)
 /var/lib/jenkins/go/pkg/mod/github.com/zeromicro/go-queue@v1.2.2/dq/producer.go:136 +0x1f
github.com/zeromicro/go-zero/core/fx.From.func1()
 /var/lib/jenkins/go/pkg/mod/github.com/zeromicro/go-zero@v1.7.2/core/fx/stream.go:63 +0x4d
github.com/zeromicro/go-zero/core/threading.RunSafe(0x0?)
 /var/lib/jenkins/go/pkg/mod/github.com/zeromicro/go-zero@v1.7.2/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/go-zero@v1.7.2/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

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions