Skip to content

Bug: Write multiple packages at once #42

Description

@jococi

`// Write multiple packages at once. so we invoke write sys.call just one time.
func (s *session) WriteBytesArray(pkgs ...[]byte) error {
if s.IsClosed() {
return ErrSessionClosed
}
// s.conn.SetWriteTimeout(time.Now().Add(s.wTimeout))
if len(pkgs) == 1 {
// return s.Connection.Write(pkgs[0])
return s.WriteBytes(pkgs[0])
}

// reduce syscall and memcopy for multiple packages
if _, ok := s.Connection.(*gettyTCPConn); ok {
       // 第一次发送
	if _, err := s.Connection.send(pkgs); err != nil {
		return jerrors.Annotatef(err, "s.Connection.Write(pkgs num:%d)", len(pkgs))
	}
}

// get len
var (
	l      int
	err    error
	length int
	arrp   *[]byte
	arr    []byte
)
length = 0
for i := 0; i < len(pkgs); i++ {
	length += len(pkgs[i])
}

// merge the pkgs
//arr = make([]byte, length)
arrp = gxbytes.GetBytes(length)
defer gxbytes.PutBytes(arrp)
arr = *arrp

l = 0
for i := 0; i < len(pkgs); i++ {
	copy(arr[l:], pkgs[i])
	l += len(pkgs[i])
}
 // 第二次发送
if err = s.WriteBytes(arr); err != nil {
	return jerrors.Trace(err)
}

num := len(pkgs) - 1
for i := 0; i < num; i++ {
	s.incWritePkgNum()
}

return nil

}
`

TCP模式下,pkgs数量超过1,那么数据包会被发送两次

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions