From a8375891a889a6cb8b01a4eca49bec71965bc001 Mon Sep 17 00:00:00 2001 From: iamqizhao Date: Sun, 12 Apr 2015 14:45:59 -0700 Subject: [PATCH 1/3] inbound flow control fix --- transport/.control.go.swp | Bin 0 -> 16384 bytes transport/.http2_server.go.swp | Bin 0 -> 40960 bytes transport/.transport.go.swp | Bin 0 -> 24576 bytes transport/control.go | 28 ++++++++++++---------------- transport/http2_client.go | 6 +++--- transport/http2_server.go | 6 +++--- transport/transport.go | 1 - transport/transport_test.go | 19 ++++++++----------- 8 files changed, 26 insertions(+), 34 deletions(-) create mode 100644 transport/.control.go.swp create mode 100644 transport/.http2_server.go.swp create mode 100644 transport/.transport.go.swp diff --git a/transport/.control.go.swp b/transport/.control.go.swp new file mode 100644 index 0000000000000000000000000000000000000000..1d0a4f36e9c0811fd83c70e3f2ff71e6e6325d64 GIT binary patch literal 16384 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 literal 0 HcmV?d00001 diff --git a/transport/.transport.go.swp b/transport/.transport.go.swp new file mode 100644 index 0000000000000000000000000000000000000000..785feb9181030316431a1c43e4dc43947655dd56 GIT binary patch literal 24576 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 AZvX%Q literal 0 HcmV?d00001 diff --git a/transport/control.go b/transport/control.go index fc7806a8..c00ee4b3 100644 --- a/transport/control.go +++ b/transport/control.go @@ -164,12 +164,10 @@ type inFlow struct { mu sync.Mutex // pendingData is the overall data which have been received but not been - // fully consumed (either pending for application to read or pending for - // window update). + // consumed by applications. pendingData uint32 // The amount of data the application has consumed but grpc has not sent - // window update for them. Used to reduce window update frequency. It is - // always part of pendingData. + // window update for them. Used to reduce window update frequency. pendingUpdate uint32 } @@ -181,8 +179,8 @@ func (f *inFlow) onData(n uint32) error { } f.mu.Lock() defer f.mu.Unlock() - if f.pendingData+n > f.limit { - return fmt.Errorf("recieved %d-bytes data exceeding the limit %d bytes", f.pendingData+n, f.limit) + if f.pendingData+f.pendingUpdate+n > f.limit { + return fmt.Errorf("recieved %d-bytes data exceeding the limit %d bytes", f.pendingData+f.pendingUpdate+n, f.limit) } if f.conn != nil { if err := f.conn.onData(n); err != nil { @@ -196,14 +194,18 @@ func (f *inFlow) onData(n uint32) error { // onRead is invoked when the application reads the data. func (f *inFlow) onRead(n uint32) uint32 { if n == 0 { - return 0 + return 0 } f.mu.Lock() defer f.mu.Unlock() + if f.pendingData == 0 { + // pendingData has been adjusted by restoreConn. + return 0 + } + f.pendingData -= n f.pendingUpdate += n if f.pendingUpdate >= f.limit/4 { ret := f.pendingUpdate - f.pendingData -= ret f.pendingUpdate = 0 return ret } @@ -218,14 +220,8 @@ func (f *inFlow) restoreConn() uint32 { } f.mu.Lock() defer f.mu.Unlock() - ret := f.pendingData - f.conn.mu.Lock() - f.conn.pendingData -= ret - if f.conn.pendingUpdate > f.conn.pendingData { - f.conn.pendingUpdate = f.conn.pendingData - } - f.conn.mu.Unlock() + n := f.pendingData f.pendingData = 0 f.pendingUpdate = 0 - return ret + return f.conn.onRead(n) } diff --git a/transport/http2_client.go b/transport/http2_client.go index b9cef877..4803390d 100644 --- a/transport/http2_client.go +++ b/transport/http2_client.go @@ -479,12 +479,12 @@ func (t *http2Client) getStream(f http2.Frame) (*Stream, bool) { // Window updates will deliver to the controller for sending when // the cumulative quota exceeds the corresponding threshold. func (t *http2Client) updateWindow(s *Stream, n uint32) { - if q := t.fc.onRead(n); q > 0 { - t.controlBuf.put(&windowUpdate{0, q}) - } if q := s.fc.onRead(n); q > 0 { t.controlBuf.put(&windowUpdate{s.id, q}) } + if q := t.fc.onRead(n); q > 0 { + t.controlBuf.put(&windowUpdate{0, q}) + } } func (t *http2Client) handleData(f *http2.DataFrame) { diff --git a/transport/http2_server.go b/transport/http2_server.go index a6576584..21e487a0 100644 --- a/transport/http2_server.go +++ b/transport/http2_server.go @@ -305,12 +305,12 @@ func (t *http2Server) getStream(f http2.Frame) (*Stream, bool) { // Window updates will deliver to the controller for sending when // the cumulative quota exceeds the corresponding threshold. func (t *http2Server) updateWindow(s *Stream, n uint32) { - if q := t.fc.onRead(n); q > 0 { - t.controlBuf.put(&windowUpdate{0, q}) - } if q := s.fc.onRead(n); q > 0 { t.controlBuf.put(&windowUpdate{s.id, q}) } + if q := t.fc.onRead(n); q > 0 { + t.controlBuf.put(&windowUpdate{0, q}) + } } func (t *http2Server) handleData(f *http2.DataFrame) { diff --git a/transport/transport.go b/transport/transport.go index 35d31b71..f6b80738 100644 --- a/transport/transport.go +++ b/transport/transport.go @@ -199,7 +199,6 @@ type Stream struct { // the status received from the server. statusCode codes.Code statusDesc string - pendingData uint32 } // Header acquires the key-value pairs of header metadata once it diff --git a/transport/transport_test.go b/transport/transport_test.go index 70343396..7559cf8f 100644 --- a/transport/transport_test.go +++ b/transport/transport_test.go @@ -489,11 +489,11 @@ func TestServerWithMisbehavedClient(t *testing.T) { // Keep sending until the server inbound window is drained for that stream. for sent <= initialWindowSize { <-cc.writableChan - if err = cc.framer.writeData(true, s.id, false, make([]byte, http2MaxFrameLen)); err != nil { + if err = cc.framer.writeData(true, s.id, false, make([]byte, 1)); err != nil { t.Fatalf("Failed to write data: ", err) } cc.writableChan <- 0 - sent += http2MaxFrameLen + sent += 1 } // Server sent a resetStream for s already. code := http2RSTErrConvTab[http2.ErrCodeFlowControl] @@ -501,8 +501,8 @@ func TestServerWithMisbehavedClient(t *testing.T) { t.Fatalf("%v got err %v with statusCode %d, want err with statusCode %d", s, err, s.statusCode, code) } - if ss.fc.pendingData != 0 || ss.fc.pendingUpdate != 0 || sc.fc.pendingData != 0 || sc.fc.pendingUpdate != 0 { - t.Fatalf("Server mistakenly resets inbound flow control params: got %d, %d, %d, %d; want 0, 0, 0, 0", ss.fc.pendingData, ss.fc.pendingUpdate, sc.fc.pendingData, sc.fc.pendingUpdate) + if ss.fc.pendingData != 0 || ss.fc.pendingUpdate != 0 || sc.fc.pendingData != 0 || sc.fc.pendingUpdate != initialWindowSize { + t.Fatalf("Server mistakenly resets inbound flow control params: got %d, %d, %d, %d; want 0, 0, 0, %d", ss.fc.pendingData, ss.fc.pendingUpdate, sc.fc.pendingData, sc.fc.pendingUpdate, initialWindowSize) } ct.CloseStream(s, nil) // Test server behavior for violation of connection flow control window size restriction. @@ -512,14 +512,11 @@ func TestServerWithMisbehavedClient(t *testing.T) { for { s, err := ct.NewStream(context.Background(), callHdr) if err != nil { - t.Fatalf("Failed to open stream: %v", err) - } - <-cc.writableChan - // Write will fail when connection flow control window runs out. - if err := cc.framer.writeData(true, s.id, true, make([]byte, http2MaxFrameLen)); err != nil { // The server tears down the connection. break } + <-cc.writableChan + cc.framer.writeData(true, s.id, true, make([]byte, http2MaxFrameLen)) cc.writableChan <- 0 } ct.Close() @@ -558,8 +555,8 @@ func TestClientWithMisbehavedServer(t *testing.T) { t.Fatalf("Got err %v and the status code %d, want and the code %d", err, s.statusCode, codes.Internal) } conn.CloseStream(s, err) - if s.fc.pendingData != 0 || s.fc.pendingUpdate != 0 || conn.fc.pendingData != 0 || conn.fc.pendingUpdate != 0 { - t.Fatalf("Client mistakenly resets inbound flow control params: got %d, %d, %d, %d; want 0, 0, 0, 0", s.fc.pendingData, s.fc.pendingUpdate, conn.fc.pendingData, conn.fc.pendingUpdate) + if s.fc.pendingData != 0 || s.fc.pendingUpdate != 0 || conn.fc.pendingData != 0 || conn.fc.pendingUpdate != initialWindowSize { + t.Fatalf("Client mistakenly resets inbound flow control params: got %d, %d, %d, %d; want 0, 0, 0, %d", s.fc.pendingData, s.fc.pendingUpdate, conn.fc.pendingData, conn.fc.pendingUpdate, initialWindowSize) } // Test the logic for the violation of the connection flow control window size restriction. // From 43ba5d8e47b55885ec3286f3fb79c2e2c015e3cf Mon Sep 17 00:00:00 2001 From: iamqizhao Date: Sun, 12 Apr 2015 14:50:16 -0700 Subject: [PATCH 2/3] gofmt --- transport/.control.go.swp | Bin 16384 -> 0 bytes transport/.http2_server.go.swp | Bin 40960 -> 0 bytes transport/.transport.go.swp | Bin 24576 -> 0 bytes transport/control.go | 2 +- transport/transport.go | 4 ++-- 5 files changed, 3 insertions(+), 3 deletions(-) delete mode 100644 transport/.control.go.swp delete mode 100644 transport/.http2_server.go.swp delete mode 100644 transport/.transport.go.swp diff --git a/transport/.control.go.swp b/transport/.control.go.swp deleted file mode 100644 index 1d0a4f36e9c0811fd83c70e3f2ff71e6e6325d64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 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 diff --git a/transport/.transport.go.swp b/transport/.transport.go.swp deleted file mode 100644 index 785feb9181030316431a1c43e4dc43947655dd56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 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 AZvX%Q diff --git a/transport/control.go b/transport/control.go index c00ee4b3..5860458e 100644 --- a/transport/control.go +++ b/transport/control.go @@ -194,7 +194,7 @@ func (f *inFlow) onData(n uint32) error { // onRead is invoked when the application reads the data. func (f *inFlow) onRead(n uint32) uint32 { if n == 0 { - return 0 + return 0 } f.mu.Lock() defer f.mu.Unlock() diff --git a/transport/transport.go b/transport/transport.go index f6b80738..0824f279 100644 --- a/transport/transport.go +++ b/transport/transport.go @@ -197,8 +197,8 @@ type Stream struct { // multiple times. headerDone bool // the status received from the server. - statusCode codes.Code - statusDesc string + statusCode codes.Code + statusDesc string } // Header acquires the key-value pairs of header metadata once it From b5774fd760d0ecea631fabc49eb3b94b3324df92 Mon Sep 17 00:00:00 2001 From: iamqizhao Date: Sun, 12 Apr 2015 15:50:48 -0700 Subject: [PATCH 3/3] some additonal fix --- transport/control.go | 40 ++++++++++++++++++++++++++++----------- transport/http2_client.go | 13 +++++++------ transport/http2_server.go | 9 +++++---- 3 files changed, 41 insertions(+), 21 deletions(-) diff --git a/transport/control.go b/transport/control.go index 5860458e..4319ecaf 100644 --- a/transport/control.go +++ b/transport/control.go @@ -191,17 +191,13 @@ func (f *inFlow) onData(n uint32) error { return nil } -// onRead is invoked when the application reads the data. -func (f *inFlow) onRead(n uint32) uint32 { - if n == 0 { - return 0 - } +// connOnRead updates the connection level states when the application consumes data. +func (f *inFlow) connOnRead(n uint32) uint32 { + if n == 0 || f.conn != nil { + return 0 + } f.mu.Lock() - defer f.mu.Unlock() - if f.pendingData == 0 { - // pendingData has been adjusted by restoreConn. - return 0 - } + f.mu.Unlock() f.pendingData -= n f.pendingUpdate += n if f.pendingUpdate >= f.limit/4 { @@ -212,6 +208,28 @@ func (f *inFlow) onRead(n uint32) uint32 { return 0 } +// onRead is invoked when the application reads the data. It returns the window updates +// for both stream and connection level. +func (f *inFlow) onRead(n uint32) (swu, cwu uint32) { + if n == 0 { + return + } + f.mu.Lock() + defer f.mu.Unlock() + if f.pendingData == 0 { + // pendingData has been adjusted by restoreConn. + return + } + f.pendingData -= n + f.pendingUpdate += n + if f.pendingUpdate >= f.limit/4 { + swu = f.pendingUpdate + f.pendingUpdate = 0 + } + cwu = f.conn.connOnRead(n) + return +} + // restoreConn is invoked when a stream is terminated. It removes its stake in // the connection-level flow and resets its own state. func (f *inFlow) restoreConn() uint32 { @@ -223,5 +241,5 @@ func (f *inFlow) restoreConn() uint32 { n := f.pendingData f.pendingData = 0 f.pendingUpdate = 0 - return f.conn.onRead(n) + return f.conn.connOnRead(n) } diff --git a/transport/http2_client.go b/transport/http2_client.go index 4803390d..d16f8dd8 100644 --- a/transport/http2_client.go +++ b/transport/http2_client.go @@ -479,12 +479,13 @@ func (t *http2Client) getStream(f http2.Frame) (*Stream, bool) { // Window updates will deliver to the controller for sending when // the cumulative quota exceeds the corresponding threshold. func (t *http2Client) updateWindow(s *Stream, n uint32) { - if q := s.fc.onRead(n); q > 0 { - t.controlBuf.put(&windowUpdate{s.id, q}) - } - if q := t.fc.onRead(n); q > 0 { - t.controlBuf.put(&windowUpdate{0, q}) - } + swu, cwu := s.fc.onRead(n) + if swu > 0 { + t.controlBuf.put(&windowUpdate{s.id, swu}) + } + if cwu > 0 { + t.controlBuf.put(&windowUpdate{0, cwu}) + } } func (t *http2Client) handleData(f *http2.DataFrame) { diff --git a/transport/http2_server.go b/transport/http2_server.go index 21e487a0..a1d606f7 100644 --- a/transport/http2_server.go +++ b/transport/http2_server.go @@ -305,11 +305,12 @@ func (t *http2Server) getStream(f http2.Frame) (*Stream, bool) { // Window updates will deliver to the controller for sending when // the cumulative quota exceeds the corresponding threshold. func (t *http2Server) updateWindow(s *Stream, n uint32) { - if q := s.fc.onRead(n); q > 0 { - t.controlBuf.put(&windowUpdate{s.id, q}) + swu, cwu := s.fc.onRead(n) + if swu > 0 { + t.controlBuf.put(&windowUpdate{s.id, swu}) } - if q := t.fc.onRead(n); q > 0 { - t.controlBuf.put(&windowUpdate{0, q}) + if cwu > 0 { + t.controlBuf.put(&windowUpdate{0, cwu}) } }