Initial commit: Go 1.23 release state
This commit is contained in:
147
test/fixedbugs/issue33355.go
Normal file
147
test/fixedbugs/issue33355.go
Normal file
@@ -0,0 +1,147 @@
|
||||
// compile
|
||||
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// This code failed on arm64 in the register allocator.
|
||||
// See issue 33355.
|
||||
|
||||
package server
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"sync"
|
||||
)
|
||||
|
||||
type client struct {
|
||||
junk [4]int
|
||||
mu sync.Mutex
|
||||
srv *Server
|
||||
gw *gateway
|
||||
msgb [100]byte
|
||||
}
|
||||
|
||||
type gateway struct {
|
||||
cfg *gatewayCfg
|
||||
outsim *sync.Map
|
||||
}
|
||||
|
||||
type gatewayCfg struct {
|
||||
replyPfx []byte
|
||||
}
|
||||
|
||||
type Account struct {
|
||||
Name string
|
||||
}
|
||||
|
||||
type Server struct {
|
||||
gateway *srvGateway
|
||||
}
|
||||
|
||||
type srvGateway struct {
|
||||
outo []*client
|
||||
}
|
||||
|
||||
type subscription struct {
|
||||
queue []byte
|
||||
client *client
|
||||
}
|
||||
|
||||
type outsie struct {
|
||||
ni map[string]struct{}
|
||||
sl *Sublist
|
||||
qsubs int
|
||||
}
|
||||
|
||||
type Sublist struct {
|
||||
}
|
||||
|
||||
type SublistResult struct {
|
||||
psubs []*subscription
|
||||
qsubs [][]*subscription
|
||||
}
|
||||
|
||||
var subPool = &sync.Pool{}
|
||||
|
||||
func (c *client) sendMsgToGateways(acc *Account, msg, subject, reply []byte, qgroups [][]byte) {
|
||||
var gws []*client
|
||||
gw := c.srv.gateway
|
||||
for i := 0; i < len(gw.outo); i++ {
|
||||
gws = append(gws, gw.outo[i])
|
||||
}
|
||||
var (
|
||||
subj = string(subject)
|
||||
queuesa = [512]byte{}
|
||||
queues = queuesa[:0]
|
||||
mreply []byte
|
||||
dstPfx []byte
|
||||
checkReply = len(reply) > 0
|
||||
)
|
||||
|
||||
sub := subPool.Get().(*subscription)
|
||||
|
||||
if subjectStartsWithGatewayReplyPrefix(subject) {
|
||||
dstPfx = subject[:8]
|
||||
}
|
||||
for i := 0; i < len(gws); i++ {
|
||||
gwc := gws[i]
|
||||
if dstPfx != nil {
|
||||
gwc.mu.Lock()
|
||||
ok := bytes.Equal(dstPfx, gwc.gw.cfg.replyPfx)
|
||||
gwc.mu.Unlock()
|
||||
if !ok {
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
qr := gwc.gatewayInterest(acc.Name, subj)
|
||||
queues = queuesa[:0]
|
||||
for i := 0; i < len(qr.qsubs); i++ {
|
||||
qsubs := qr.qsubs[i]
|
||||
queue := qsubs[0].queue
|
||||
add := true
|
||||
for _, qn := range qgroups {
|
||||
if bytes.Equal(queue, qn) {
|
||||
add = false
|
||||
break
|
||||
}
|
||||
}
|
||||
if add {
|
||||
qgroups = append(qgroups, queue)
|
||||
}
|
||||
}
|
||||
if len(queues) == 0 {
|
||||
continue
|
||||
}
|
||||
}
|
||||
if checkReply {
|
||||
checkReply = false
|
||||
mreply = reply
|
||||
}
|
||||
mh := c.msgb[:10]
|
||||
mh = append(mh, subject...)
|
||||
if len(queues) > 0 {
|
||||
mh = append(mh, mreply...)
|
||||
mh = append(mh, queues...)
|
||||
}
|
||||
sub.client = gwc
|
||||
}
|
||||
subPool.Put(sub)
|
||||
}
|
||||
|
||||
func subjectStartsWithGatewayReplyPrefix(subj []byte) bool {
|
||||
return len(subj) > 8 && string(subj[:4]) == "foob"
|
||||
}
|
||||
|
||||
func (c *client) gatewayInterest(acc, subj string) *SublistResult {
|
||||
ei, _ := c.gw.outsim.Load(acc)
|
||||
var r *SublistResult
|
||||
e := ei.(*outsie)
|
||||
r = e.sl.Match(subj)
|
||||
return r
|
||||
}
|
||||
|
||||
func (s *Sublist) Match(subject string) *SublistResult {
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user