vendor: Update everything

GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/4620
This commit is contained in:
Jakob Borg
2017-12-29 11:38:00 +00:00
parent 1296a22069
commit c24bf7ea55
1070 changed files with 294926 additions and 488191 deletions

View File

@@ -17,6 +17,7 @@ const (
const (
errBrokenPipe = "broken pipe"
errInvalidProtocol = "invalid protocol version"
errGoAway = "stream id overflows, should start a new connection"
)
type writeRequest struct {
@@ -33,8 +34,9 @@ type writeResult struct {
type Session struct {
conn io.ReadWriteCloser
config *Config
nextStreamID uint32 // next stream identifier
config *Config
nextStreamID uint32 // next stream identifier
nextStreamIDLock sync.Mutex
bucket int32 // token bucket
bucketNotify chan struct{} // used for waiting for tokens
@@ -48,6 +50,8 @@ type Session struct {
dataReady int32 // flag data has arrived
goAway int32 // flag id exhausted
deadline atomic.Value
writes chan writeRequest
@@ -67,7 +71,7 @@ func newSession(config *Config, conn io.ReadWriteCloser, client bool) *Session {
if client {
s.nextStreamID = 1
} else {
s.nextStreamID = 2
s.nextStreamID = 0
}
go s.recvLoop()
go s.sendLoop()
@@ -81,7 +85,22 @@ func (s *Session) OpenStream() (*Stream, error) {
return nil, errors.New(errBrokenPipe)
}
sid := atomic.AddUint32(&s.nextStreamID, 2)
// generate stream id
s.nextStreamIDLock.Lock()
if s.goAway > 0 {
s.nextStreamIDLock.Unlock()
return nil, errors.New(errGoAway)
}
s.nextStreamID += 2
sid := s.nextStreamID
if sid == sid%2 { // stream-id overflows
s.goAway = 1
s.nextStreamIDLock.Unlock()
return nil, errors.New(errGoAway)
}
s.nextStreamIDLock.Unlock()
stream := newStream(sid, s.config.MaxFrameSize, s)
if _, err := s.writeFrame(newFrame(cmdSYN, sid)); err != nil {
@@ -99,7 +118,7 @@ func (s *Session) OpenStream() (*Stream, error) {
func (s *Session) AcceptStream() (*Stream, error) {
var deadline <-chan time.Time
if d, ok := s.deadline.Load().(time.Time); ok && !d.IsZero() {
timer := time.NewTimer(d.Sub(time.Now()))
timer := time.NewTimer(time.Until(d))
defer timer.Stop()
deadline = timer.C
}
@@ -289,10 +308,7 @@ func (s *Session) sendLoop() {
select {
case <-s.die:
return
case request, ok := <-s.writes:
if !ok {
continue
}
case request := <-s.writes:
buf[0] = request.frame.ver
buf[1] = request.frame.cmd
binary.LittleEndian.PutUint16(buf[2:], uint16(len(request.frame.data)))

View File

@@ -46,20 +46,12 @@ func (s *Stream) ID() uint32 {
func (s *Stream) Read(b []byte) (n int, err error) {
var deadline <-chan time.Time
if d, ok := s.readDeadline.Load().(time.Time); ok && !d.IsZero() {
timer := time.NewTimer(d.Sub(time.Now()))
timer := time.NewTimer(time.Until(d))
defer timer.Stop()
deadline = timer.C
}
READ:
select {
case <-s.die:
return 0, errors.New(errBrokenPipe)
case <-deadline:
return n, errTimeout
default:
}
s.bufferLock.Lock()
n, err = s.buffer.Read(b)
s.bufferLock.Unlock()
@@ -86,7 +78,7 @@ READ:
func (s *Stream) Write(b []byte) (n int, err error) {
var deadline <-chan time.Time
if d, ok := s.writeDeadline.Load().(time.Time); ok && !d.IsZero() {
timer := time.NewTimer(d.Sub(time.Now()))
timer := time.NewTimer(time.Until(d))
defer timer.Stop()
deadline = timer.C
}