Skip to content

Commit 336d758

Browse files
committed
optimize: use multi channel to avoid bloc
1 parent 473756c commit 336d758

File tree

1 file changed

+53
-2
lines changed

1 file changed

+53
-2
lines changed

edge/cframe.go

Lines changed: 53 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,17 @@ type Server struct {
3131
// tun device wrap
3232
iface *Interface
3333

34+
// snd buffer
35+
sndq []chan *sendReq
36+
3437
vpcInstance vpc.IVPC
3538
}
3639

40+
type sendReq struct {
41+
buf []byte
42+
conn net.Conn
43+
}
44+
3745
type peerConn struct {
3846
addr string
3947
// conn *net.UDPConn
@@ -44,12 +52,19 @@ type peerConn struct {
4452
}
4553

4654
func NewServer(laddr, key string, iface *Interface) *Server {
47-
return &Server{
55+
s := &Server{
4856
laddr: laddr,
4957
key: key,
5058
peerConns: make(map[string]*peerConn),
5159
iface: iface,
60+
sndq: make([]chan *sendReq, 1000),
61+
}
62+
63+
for i := 0; i < 1000; i++ {
64+
s.sndq[i] = make(chan *sendReq, 10000)
65+
go s.writePeer(s.sndq[i])
5266
}
67+
return s
5368
}
5469

5570
func (s *Server) SetRegistry(r *Registry) {
@@ -166,9 +181,35 @@ func (s *Server) readLocal() {
166181
buf = append(buf, plen...)
167182
buf = append(buf, pkt...)
168183

184+
idx := time33(dst) % uint64(len(s.sndq))
185+
select {
186+
case s.sndq[idx] <- &sendReq{buf, peer}:
187+
default:
188+
peer.SetWriteDeadline(time.Now().Add(time.Second * 3))
189+
nw, err := peer.Write(buf)
190+
peer.SetWriteDeadline(time.Time{})
191+
if err != nil {
192+
log.Error("write to peer %s fail %v", dst, err)
193+
continue
194+
}
195+
196+
if nw != len(buf) {
197+
log.Error("stream write not full")
198+
continue
199+
}
200+
}
201+
}
202+
}
203+
204+
func (s *Server) writePeer(sndq chan *sendReq) {
205+
for req := range sndq {
206+
peer := req.conn
207+
buf := req.buf
208+
peer.SetWriteDeadline(time.Now().Add(time.Second * 3))
169209
nw, err := peer.Write(buf)
210+
peer.SetWriteDeadline(time.Time{})
170211
if err != nil {
171-
log.Error("write to peer %s fail %v", dst, err)
212+
log.Error("write to peer fail %v", err)
172213
continue
173214
}
174215

@@ -403,3 +444,13 @@ func (s *Server) DelRoute(msg *codec.DelRouteMsg) {
403444
ListenAddr: msg.Nexthop,
404445
})
405446
}
447+
448+
func time33(s string) uint64 {
449+
var hash uint64 = 5381
450+
451+
for _, c := range s {
452+
hash = ((hash << 5) + hash) + uint64(c)
453+
}
454+
455+
return hash
456+
}

0 commit comments

Comments
 (0)