From 03ff49fdebf0640e6991936e9b78dabc34aac6b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E6=97=AD?= <120582243@qq.com> Date: Mon, 15 Mar 2021 22:40:10 +0800 Subject: [PATCH] optimize performance & update benchmarks (#69) --- benchmarks/bench-echo.sh | 44 -------------- benchmarks/bench-pingpong.sh | 38 ++++++------ benchmarks/{echo => gev-echo-server}/echo.go | 9 +++ benchmarks/gnet-echo-server/main.go | 63 ++++++++++++-------- benchmarks/test.sh | 35 ----------- connection/connection.go | 43 +++++++++---- connection/protocol.go | 21 ++++++- eventloop/eventloop.go | 9 ++- go.mod | 4 +- go.sum | 28 +++++++-- 10 files changed, 142 insertions(+), 152 deletions(-) delete mode 100755 benchmarks/bench-echo.sh rename benchmarks/{echo => gev-echo-server}/echo.go (84%) delete mode 100755 benchmarks/test.sh diff --git a/benchmarks/bench-echo.sh b/benchmarks/bench-echo.sh deleted file mode 100755 index 64e75bd..0000000 --- a/benchmarks/bench-echo.sh +++ /dev/null @@ -1,44 +0,0 @@ -#!/bin/bash - -set -e - -echo "" -echo "--- BENCH ECHO START ---" -echo "" - -cd $(dirname "${BASH_SOURCE[0]}") -function cleanup { - echo "--- BENCH ECHO DONE ---" - kill -9 $(jobs -rp) - wait $(jobs -rp) 2>/dev/null -} -trap cleanup EXIT - -mkdir -p bin -$(pkill -9 net-echo-server || printf "") -$(pkill -9 evio-echo-server || printf "") -$(pkill -9 eviop-echo-server || printf "") -$(pkill -9 gev-echo-server || printf "") -$(pkill -9 gnet-echo-server || printf "") - -function gobench { - echo "--- $1 ---" - if [ "$3" != "" ]; then - go build -o $2 $3 - fi - GOMAXPROCS=1 $2 --port $4 --loops 1 & - - sleep 1 - echo "*** 50 connections, 10 seconds, 6 byte packets" - nl=$'\r\n' - tcpkali --workers 1 -c 50 -T 10s -m "PING{$nl}" 127.0.0.1:$4 - echo "--- DONE ---" - echo "" -} - -gobench "GEV" bin/gev-echo-server echo/echo.go 5000 -gobench "GNET" bin/gnet-echo-server gnet-echo-server/main.go 5001 -gobench "EVIOP" bin/eviop-echo-server eviop-echo-server/main.go 5002 -gobench "EVIO" bin/evio-echo-server evio-echo-server/main.go 5003 -gobench "GO STDLIB" bin/net-echo-server net-echo-server/main.go 5004 - diff --git a/benchmarks/bench-pingpong.sh b/benchmarks/bench-pingpong.sh index 5bce5ca..d310734 100755 --- a/benchmarks/bench-pingpong.sh +++ b/benchmarks/bench-pingpong.sh @@ -7,10 +7,10 @@ echo "--- BENCH PING PONG START ---" echo "" cd $(dirname "${BASH_SOURCE[0]}") -function cleanup { - echo "--- BENCH PING PONG DONE ---" - kill -9 $(jobs -rp) - wait $(jobs -rp) 2>/dev/null +function cleanup() { + echo "--- BENCH PING PONG DONE ---" + # kill -9 $(jobs -rp) + # wait $(jobs -rp) 2>/dev/null } trap cleanup EXIT @@ -21,23 +21,21 @@ $(pkill -9 eviop-echo-server || printf "") $(pkill -9 gev-echo-server || printf "") $(pkill -9 gnet-echo-server || printf "") -function gobench { - echo "--- $1 ---" - if [ "$3" != "" ]; then - go build -o $2 $3 - fi - GOMAXPROCS=4 $2 --port $4 --loops 4 & - - sleep 1 - echo "*** 1000 connections, 10 seconds, 4096 byte packets" - GOMAXPROCS=4 go run client/main.go -c 1000 -t 10 -m 4096 -a 127.0.0.1:$4 - echo "--- DONE ---" - echo "" +function gobench() { + echo "--- $1 ---" + if [ "$3" != "" ]; then + go build -o $2 $3 + fi + GOMAXPROCS=4 $2 --port $4 --loops 8 & + + sleep 1 + echo "*** 1000 connections, 60 seconds, 4096 byte packets" + GOMAXPROCS=4 go run client/main.go -c 1000 -t 60 -m 4096 -a 127.0.0.1:$4 + echo "--- DONE ---" + echo "" } -gobench "GEV" bin/gev-echo-server echo/echo.go 5000 -gobench "GNET" bin/gnet-echo-server gnet-echo-server/main.go 5001 -gobench "GO STDLIB" bin/net-echo-server net-echo-server/main.go 5004 +gobench "GEV" bin/gev-echo-server gev-echo-server/echo.go 5000 -exit 0 +gobench "GNET" bin/gnet-echo-server gnet-echo-server/main.go 5010 diff --git a/benchmarks/echo/echo.go b/benchmarks/gev-echo-server/echo.go similarity index 84% rename from benchmarks/echo/echo.go rename to benchmarks/gev-echo-server/echo.go index f835ed3..0e9ac63 100644 --- a/benchmarks/echo/echo.go +++ b/benchmarks/gev-echo-server/echo.go @@ -2,8 +2,11 @@ package main import ( "flag" + "net/http" "strconv" + _ "net/http/pprof" + "github.com/Allenxuxu/gev" "github.com/Allenxuxu/gev/connection" ) @@ -20,6 +23,12 @@ func (s *example) OnMessage(c *connection.Connection, ctx interface{}, data []by func (s *example) OnClose(c *connection.Connection) {} func main() { + go func() { + if err := http.ListenAndServe(":6061", nil); err != nil { + panic(err) + } + }() + handler := new(example) var port int var loops int diff --git a/benchmarks/gnet-echo-server/main.go b/benchmarks/gnet-echo-server/main.go index da59c1f..8cf6c32 100644 --- a/benchmarks/gnet-echo-server/main.go +++ b/benchmarks/gnet-echo-server/main.go @@ -4,13 +4,46 @@ import ( "flag" "fmt" "log" - "strings" + "net/http" + + _ "net/http/pprof" "github.com/panjf2000/gnet" - "github.com/panjf2000/gnet/ringbuffer" ) +type echoServer struct { + *gnet.EventServer +} + +func (es *echoServer) OnInitComplete(srv gnet.Server) (action gnet.Action) { + log.Printf("Echo server is listening on %s (multi-cores: %t, loops: %d)\n", + srv.Addr.String(), srv.Multicore, srv.NumEventLoop) + return +} + +func (es *echoServer) React(frame []byte, c gnet.Conn) (out []byte, action gnet.Action) { + // Echo synchronously. + out = frame + return + + /* + // Echo asynchronously. + data := append([]byte{}, frame...) + go func() { + time.Sleep(time.Second) + c.AsyncWrite(data) + }() + return + */ +} + func main() { + go func() { + if err := http.ListenAndServe(":6062", nil); err != nil { + panic(err) + } + }() + var port int var loops int var udp bool @@ -24,28 +57,6 @@ func main() { flag.IntVar(&loops, "loops", -1, "num loops") flag.Parse() - var events gnet.Events - events.NumLoops = loops - events.OnInitComplete = func(srv gnet.Server) (action gnet.Action) { - log.Printf("echo server started on port %d (loops: %d)", port, srv.NumLoops) - if reuseport { - log.Printf("reuseport") - } - return - } - events.React = func(c gnet.Conn, inBuf *ringbuffer.RingBuffer) (out []byte, action gnet.Action) { - top, tail := inBuf.PreReadAll() - out = append(top, tail...) - inBuf.Reset() - - if trace { - log.Printf("%s", strings.TrimSpace(string(top)+string(tail))) - } - return - } - scheme := "tcp" - if udp { - scheme = "udp" - } - log.Fatal(gnet.Serve(events, fmt.Sprintf("%s://:%d", scheme, port))) + echo := new(echoServer) + log.Fatal(gnet.Serve(echo, fmt.Sprintf("tcp://:%d", port), gnet.WithNumEventLoop(loops), gnet.WithReusePort(reuseport))) } diff --git a/benchmarks/test.sh b/benchmarks/test.sh deleted file mode 100755 index 8ab478f..0000000 --- a/benchmarks/test.sh +++ /dev/null @@ -1,35 +0,0 @@ -#!/bin/bash - -set -e - -echo "" -echo "--- BENCH PING PONG START ---" -echo "" - -cd $(dirname "${BASH_SOURCE[0]}") -function cleanup { - echo "--- BENCH PING PONG DONE ---" - kill -9 $(jobs -rp) - wait $(jobs -rp) 2>/dev/null -} -trap cleanup EXIT - -mkdir -p bin -$(pkill -9 gev-echo-server || printf "") - -function gobench { - echo "--- $1 ---" - if [ "$3" != "" ]; then - go build -o $2 $3 - fi - GOMAXPROCS=4 $2 --port $4 --loops 4 & - - sleep 1 - echo "*** 1000 connections, 10 seconds, 4096 byte packets" - GOMAXPROCS=4 go run client/main.go -c 1000 -t 100 -m 4096 -a 127.0.0.1:$4 - echo "--- DONE ---" - echo "" -} - -gobench "GEV" bin/gev-echo-server ../example/echo/echo.go 5000 - diff --git a/connection/connection.go b/connection/connection.go index 1b75008..bf39972 100644 --- a/connection/connection.go +++ b/connection/connection.go @@ -25,9 +25,10 @@ type CallBack interface { type Connection struct { fd int connected atomic.Bool + buffer *ringbuffer.RingBuffer outBuffer *ringbuffer.RingBuffer // write buffer - outBufferLen atomic.Int64 inBuffer *ringbuffer.RingBuffer // read buffer + outBufferLen atomic.Int64 inBufferLen atomic.Int64 callBack CallBack loop *eventloop.EventLoop @@ -45,7 +46,13 @@ type Connection struct { var ErrConnectionClosed = errors.New("connection closed") // New 创建 Connection -func New(fd int, loop *eventloop.EventLoop, sa unix.Sockaddr, protocol Protocol, tw *timingwheel.TimingWheel, idleTime time.Duration, callBack CallBack) *Connection { +func New(fd int, + loop *eventloop.EventLoop, + sa unix.Sockaddr, + protocol Protocol, + tw *timingwheel.TimingWheel, + idleTime time.Duration, + callBack CallBack) *Connection { conn := &Connection{ fd: fd, peerAddr: sockAddrToString(sa), @@ -56,6 +63,7 @@ func New(fd int, loop *eventloop.EventLoop, sa unix.Sockaddr, protocol Protocol, idleTime: idleTime, timingWheel: tw, protocol: protocol, + buffer: ringbuffer.New(0), } conn.connected.Set(true) @@ -67,6 +75,10 @@ func New(fd int, loop *eventloop.EventLoop, sa unix.Sockaddr, protocol Protocol, return conn } +func (c *Connection) UserBuffer() *[]byte { + return c.loop.UserBuffer +} + func (c *Connection) closeTimeoutConn() func() { return func() { now := time.Now() @@ -143,9 +155,8 @@ func (c *Connection) WriteBufferLength() int64 { // HandleEvent 内部使用,event loop 回调 func (c *Connection) HandleEvent(fd int, events poller.Event) { - now := time.Now() if c.idleTime > 0 { - _ = c.activeTime.Swap(now.Unix()) + _ = c.activeTime.Swap(time.Now().Unix()) } if events&poller.EventErr != 0 { @@ -153,12 +164,18 @@ func (c *Connection) HandleEvent(fd int, events poller.Event) { return } - if c.outBuffer.Length() != 0 { + if !c.outBuffer.IsEmpty() { if events&poller.EventWrite != 0 { c.handleWrite(fd) + if c.outBuffer.IsEmpty() { + c.outBuffer.Reset() + } } } else if events&poller.EventRead != 0 { c.handleRead(fd) + if c.inBuffer.IsEmpty() { + c.inBuffer.Reset() + } } c.inBufferLen.Swap(int64(c.inBuffer.Length())) @@ -188,13 +205,13 @@ func (c *Connection) handleRead(fd int) { return } - if c.inBuffer.Length() == 0 { - buffer := ringbuffer.NewWithData(buf[:n]) + if c.inBuffer.IsEmpty() { + c.buffer.WithData(buf[:n]) buf = buf[n:n] - c.handlerProtocol(&buf, buffer) + c.handlerProtocol(&buf, c.buffer) - if buffer.Length() > 0 { - first, _ := buffer.PeekAll() + if !c.buffer.IsEmpty() { + first, _ := c.buffer.PeekAll() _, _ = c.inBuffer.Write(first) } } else { @@ -232,7 +249,7 @@ func (c *Connection) handleWrite(fd int) { c.outBuffer.Retrieve(n) } - if c.outBuffer.Length() == 0 { + if c.outBuffer.IsEmpty() { if err := c.loop.EnableRead(fd); err != nil { log.Error("[EnableRead]", err) } @@ -255,7 +272,7 @@ func (c *Connection) handleClose(fd int) { } func (c *Connection) sendInLoop(data []byte) { - if c.outBuffer.Length() > 0 { + if !c.outBuffer.IsEmpty() { _, _ = c.outBuffer.Write(data) } else { n, err := unix.Write(c.fd, data) @@ -270,7 +287,7 @@ func (c *Connection) sendInLoop(data []byte) { _, _ = c.outBuffer.Write(data[n:]) } - if c.outBuffer.Length() > 0 { + if !c.outBuffer.IsEmpty() { _ = c.loop.EnableReadWrite(c.fd) } } diff --git a/connection/protocol.go b/connection/protocol.go index 9444bd2..cf31c1e 100644 --- a/connection/protocol.go +++ b/connection/protocol.go @@ -17,9 +17,24 @@ type DefaultProtocol struct{} // UnPacket 拆包 func (d *DefaultProtocol) UnPacket(c *Connection, buffer *ringbuffer.RingBuffer) (interface{}, []byte) { - ret := buffer.Bytes() - buffer.RetrieveAll() - return nil, ret + s, e := buffer.PeekAll() + if len(e) > 0 { + size := len(s) + len(e) + userBuffer := *c.UserBuffer() + if size > cap(userBuffer) { + userBuffer = make([]byte, size) + *c.UserBuffer() = userBuffer + } + + copy(userBuffer, s) + copy(userBuffer[len(s):], e) + + return nil, userBuffer + } else { + buffer.RetrieveAll() + + return nil, s + } } // Packet 封包 diff --git a/eventloop/eventloop.go b/eventloop/eventloop.go index dfafd72..f642020 100644 --- a/eventloop/eventloop.go +++ b/eventloop/eventloop.go @@ -32,6 +32,7 @@ type eventLoopLocal struct { sockets map[int]Socket packet []byte pendingFunc []func() + UserBuffer *[]byte } // New 创建一个 EventLoop @@ -41,11 +42,13 @@ func New() (*EventLoop, error) { return nil, err } + userBuffer := make([]byte, 1024) return &EventLoop{ eventLoopLocal: eventLoopLocal{ - poll: p, - packet: make([]byte, 0xFFFF), - sockets: make(map[int]Socket), + poll: p, + packet: make([]byte, 0xFFFF), + sockets: make(map[int]Socket), + UserBuffer: &userBuffer, }, }, nil } diff --git a/go.mod b/go.mod index 616d16a..0a7b095 100644 --- a/go.mod +++ b/go.mod @@ -4,14 +4,14 @@ go 1.14 require ( github.com/Allenxuxu/eviop v0.0.0-20190901123806-035c218f739a - github.com/Allenxuxu/ringbuffer v0.0.7 + github.com/Allenxuxu/ringbuffer v0.0.9 github.com/Allenxuxu/toolkit v0.0.0-20200827004847-cb9a6f0d072f github.com/RussellLuo/timingwheel v0.0.0-20201029015908-64de9d088c74 github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee github.com/gobwas/pool v0.2.0 github.com/golang/protobuf v1.4.3 github.com/libp2p/go-reuseport v0.0.1 - github.com/panjf2000/gnet v0.0.1-rc.4 + github.com/panjf2000/gnet v1.4.0 github.com/prometheus/client_golang v1.9.0 github.com/tidwall/evio v1.0.2 golang.org/x/net v0.0.0-20200625001655-4c5254603344 diff --git a/go.sum b/go.sum index 22c7b1a..07c976e 100644 --- a/go.sum +++ b/go.sum @@ -3,10 +3,11 @@ cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT github.com/Allenxuxu/eviop v0.0.0-20190901123806-035c218f739a h1:TSzycgSvz9M0Ced2hMR+c1S3O1+mm9pZmBIoWgGhvdg= github.com/Allenxuxu/eviop v0.0.0-20190901123806-035c218f739a/go.mod h1:I5+IvzRy5ddv0t9uiuUf4LsfJOXczEb9rxSuPWFfE0w= github.com/Allenxuxu/ringbuffer v0.0.0-20190803184500-fa400f2fe92b/go.mod h1:9Rg4D7ixiHGlU50BJWJEg6vwDFcGiOYKQFcHK6Vx9m4= -github.com/Allenxuxu/ringbuffer v0.0.7 h1:qW1hI5AtNFxWPX0WxaVbU5SvyjLNcdTQAz3G61e+b20= -github.com/Allenxuxu/ringbuffer v0.0.7/go.mod h1:F2Ela+/miJmKYwnXr3X0+spOmSEwL/iFAEzeUJ4SFMI= +github.com/Allenxuxu/ringbuffer v0.0.9 h1:KxG2kqM1iCL0VqTTuQS6XqugoffP8IM7YhVnzEPf8cc= +github.com/Allenxuxu/ringbuffer v0.0.9/go.mod h1:F2Ela+/miJmKYwnXr3X0+spOmSEwL/iFAEzeUJ4SFMI= github.com/Allenxuxu/toolkit v0.0.0-20200827004847-cb9a6f0d072f h1:DqHu2M6MxT+R6KN2UdsWjcZ6Yhw4ENSKYlXTKZ24P+c= github.com/Allenxuxu/toolkit v0.0.0-20200827004847-cb9a6f0d072f/go.mod h1:kamv5tj0iNT29zmKIYaxoIcYgDnzerxnOZiHBKbVp/o= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= @@ -214,8 +215,10 @@ github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJ github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/panjf2000/gnet v0.0.1-rc.4 h1:IQI+DwUQyCfjCjSt1nvD0BHdDVZo2ik31giLRw+GZys= -github.com/panjf2000/gnet v0.0.1-rc.4/go.mod h1:N251s4H0wuPrB0ssD/D4ZQYOFJKZOwYxqIejzAodQqc= +github.com/panjf2000/ants/v2 v2.4.3 h1:wHghL17YKFanB62QjPQ9o+DuM4q7WrQ7zAhoX8+eBXU= +github.com/panjf2000/ants/v2 v2.4.3/go.mod h1:f6F0NZVFsGCp5A7QW/Zj/m92atWwOkY0OIhFxRNFr4A= +github.com/panjf2000/gnet v1.4.0 h1:L/yzySz4UWH94QX5pw0JzAke8qebtIHy+UgtPlBQ/po= +github.com/panjf2000/gnet v1.4.0/go.mod h1:Wpb/yLODhgxE26mOXwnhkO7XnnjNY5lg+KhPPX/THw4= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= @@ -268,8 +271,6 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeV github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/smartystreets-prototypes/go-disruptor v0.0.0-20180723194425-e0f8f9247cc2 h1:nQE8laUyz4HmJDejtrfORw6+a68+9Inpq1+uiIxrb+E= -github.com/smartystreets-prototypes/go-disruptor v0.0.0-20180723194425-e0f8f9247cc2/go.mod h1:ACngBnuB+3ZLly6w2l5kkiUKwrH9kZRo+KKl7+jwhlA= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= @@ -290,6 +291,8 @@ github.com/tidwall/evio v1.0.2/go.mod h1:cYtY49LddNrlpsOmW7qJnqM8B2gOjrFrzT8+Fnb github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= @@ -298,11 +301,19 @@ go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= +go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -321,6 +332,7 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= @@ -372,6 +384,7 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201116194326-cc9327a14d48/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e h1:AyodaIpKjppX+cBfTASF2E1US3H2JFBj920Ot3rtDjs= golang.org/x/sys v0.0.0-20201214210602-f9fddec55a1e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -393,6 +406,7 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200103221440-774c71fcf114 h1:DnSr2mCsxyCE6ZgIkmcWUQY2R5cH/6wL7eIxEmQOMSE= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -445,11 +459,13 @@ gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/golex v1.0.0/go.mod h1:b/QX9oBD/LhixY6NDh+IdGv17hgB+51fET1i2kPSmvk=