ソースを参照

remove the default mux connection timeout if options is not set

ffdfgdfg 5 年 前
コミット
04c0d59454
2 ファイル変更19 行追加5 行削除
  1. 10 2
      lib/mux/conn.go
  2. 9 3
      lib/mux/queue.go

+ 10 - 2
lib/mux/conn.go

@@ -499,8 +499,16 @@ start:
 
 func (Self *SendWindow) waitReceiveWindow() (err error) {
 	t := Self.timeout.Sub(time.Now())
-	if t < 0 {
-		t = time.Minute * 5
+	if t < 0 { // not set the timeout, wait for it as long as connection close
+		select {
+		case _, ok := <-Self.setSizeCh:
+			if !ok {
+				return errors.New("conn.writeWindow: window closed")
+			}
+			return nil
+		case <-Self.closeOpCh:
+			return errors.New("conn.writeWindow: window closed")
+		}
 	}
 	timer := time.NewTimer(t)
 	defer timer.Stop()

+ 9 - 3
lib/mux/queue.go

@@ -218,7 +218,7 @@ type ReceiveWindowQueue struct {
 	// On ARM, x86-32, and 32-bit MIPS, it is the caller's responsibility
 	// to arrange for 64-bit alignment of 64-bit words accessed atomically.
 	// The first word in a variable or in an allocated struct, array, or slice can be relied upon to be 64-bit aligned.
-	timeout    time.Time
+	timeout time.Time
 }
 
 func (Self *ReceiveWindowQueue) New() {
@@ -300,8 +300,14 @@ func (Self *ReceiveWindowQueue) waitPush() (err error) {
 	//logs.Warn("wait push")
 	//defer logs.Warn("wait push finish")
 	t := Self.timeout.Sub(time.Now())
-	if t <= 0 {
-		t = time.Minute * 5
+	if t <= 0 { // not set the timeout, so wait for it without timeout, just like a tcp connection
+		select {
+		case <-Self.readOp:
+			return nil
+		case <-Self.stopOp:
+			err = io.EOF
+			return
+		}
 	}
 	timer := time.NewTimer(t)
 	defer timer.Stop()