default mem buffers

This commit is contained in:
Josh Baker 2016-09-07 06:19:55 -07:00
parent 9b05e8accd
commit e1ee7d9f1e
2 changed files with 25 additions and 24 deletions

View File

@ -75,7 +75,6 @@ type Server struct {
conns map[*conn]bool conns map[*conn]bool
rdpool [][]byte rdpool [][]byte
wrpool [][]byte wrpool [][]byte
initbuf []byte
} }
// NewServer returns a new server // NewServer returns a new server
@ -83,14 +82,19 @@ func NewServer(
addr string, handler func(conn Conn, cmds [][]string), addr string, handler func(conn Conn, cmds [][]string),
accept func(conn Conn) bool, closed func(conn Conn, err error), accept func(conn Conn) bool, closed func(conn Conn, err error),
) *Server { ) *Server {
return &Server{ s := &Server{
addr: addr, addr: addr,
shandler: handler, shandler: handler,
accept: accept, accept: accept,
closed: closed, closed: closed,
conns: make(map[*conn]bool), conns: make(map[*conn]bool),
initbuf: make([]byte, defaultPoolSize*defaultBufLen),
} }
initbuf := make([]byte, defaultPoolSize*defaultBufLen)
s.rdpool = make([][]byte, defaultPoolSize)
for i := 0; i < defaultPoolSize; i++ {
s.rdpool[i] = initbuf[i*defaultBufLen : i*defaultBufLen+defaultBufLen]
}
return s
} }
// NewServerBytes returns a new server // NewServerBytes returns a new server
@ -168,7 +172,7 @@ func (s *Server) ListenServeAndSignal(signal chan error) error {
c := &conn{ c := &conn{
tcpc, tcpc,
newWriter(tcpc), newWriter(tcpc),
newReader(tcpc), newReader(tcpc, nil),
tcpc.RemoteAddr().String(), tcpc.RemoteAddr().String(),
nil, nil,
} }
@ -176,11 +180,14 @@ func (s *Server) ListenServeAndSignal(signal chan error) error {
if len(s.rdpool) > 0 { if len(s.rdpool) > 0 {
c.rd.buf = s.rdpool[len(s.rdpool)-1] c.rd.buf = s.rdpool[len(s.rdpool)-1]
s.rdpool = s.rdpool[:len(s.rdpool)-1] s.rdpool = s.rdpool[:len(s.rdpool)-1]
} else {
c.rd.buf = make([]byte, defaultBufLen)
} }
if len(s.wrpool) > 0 { if len(s.wrpool) > 0 {
c.wr.b = s.wrpool[len(s.wrpool)-1] c.wr.b = s.wrpool[len(s.wrpool)-1]
s.wrpool = s.wrpool[:len(s.wrpool)-1] s.wrpool = s.wrpool[:len(s.wrpool)-1]
c.wr.b = c.wr.b[:0] } else {
c.wr.b = make([]byte, 0, 64)
} }
s.conns[c] = true s.conns[c] = true
s.mu.Unlock() s.mu.Unlock()
@ -240,8 +247,8 @@ func handle(
if len(s.rdpool) < defaultPoolSize && len(c.rd.buf) < defaultBufLen { if len(s.rdpool) < defaultPoolSize && len(c.rd.buf) < defaultBufLen {
s.rdpool = append(s.rdpool, c.rd.buf) s.rdpool = append(s.rdpool, c.rd.buf)
} }
if len(s.wrpool) < defaultPoolSize && len(c.wr.b) < defaultBufLen { if len(s.wrpool) < defaultPoolSize && cap(c.wr.b) < defaultBufLen {
s.wrpool = append(s.wrpool, c.wr.b) s.wrpool = append(s.wrpool, c.wr.b[:0])
} }
}() }()
}() }()
@ -338,23 +345,21 @@ func (c *conn) RemoteAddr() string {
return c.addr return c.addr
} }
func (c *conn) SetReadBuffer(bytes int) { func (c *conn) SetReadBuffer(bytes int) {
c.rd.buflen = bytes
} }
// Reader represents a RESP command reader. // Reader represents a RESP command reader.
type reader struct { type reader struct {
r io.Reader // base reader r io.Reader // base reader
buf []byte buf []byte
start int start int
end int end int
buflen int
} }
// NewReader returns a RESP command reader. // NewReader returns a RESP command reader.
func newReader(r io.Reader) *reader { func newReader(r io.Reader, buf []byte) *reader {
return &reader{ return &reader{
r: r, r: r,
buflen: defaultBufLen, buf: buf,
} }
} }
@ -526,13 +531,9 @@ func (r *reader) ReadCommands() ([][][]byte, error) {
} }
} }
if r.end == len(r.buf) { if r.end == len(r.buf) {
if len(r.buf) == 0 { nbuf := make([]byte, len(r.buf)*2)
r.buf = make([]byte, r.buflen) copy(nbuf, r.buf)
} else { r.buf = nbuf
nbuf := make([]byte, len(r.buf)*2)
copy(nbuf, r.buf)
r.buf = nbuf
}
} }
n, err := r.r.Read(r.buf[r.end:]) n, err := r.r.Read(r.buf[r.end:])
if err != nil { if err != nil {

View File

@ -145,7 +145,7 @@ func TestRandomCommands(t *testing.T) {
cnt := 0 cnt := 0
idx := 0 idx := 0
start := time.Now() start := time.Now()
r := newReader(rd) r := newReader(rd, make([]byte, 256))
for { for {
cmds, err := r.ReadCommands() cmds, err := r.ReadCommands()
if err != nil { if err != nil {