瀏覽代碼

Don't take down HTTP(S) server on connection errors (fixes #700)

Jakob Borg 11 年之前
父節點
當前提交
45af549897
共有 3 個文件被更改,包括 22 次插入5 次删除
  1. 3 2
      cmd/syncthing/tls.go
  2. 1 0
      integration/common_test.go
  3. 18 3
      integration/httpstress_test.go

+ 3 - 2
cmd/syncthing/tls.go

@@ -96,8 +96,9 @@ func (l *DowngradingListener) Accept() (net.Conn, error) {
 	br := bufio.NewReader(conn)
 	br := bufio.NewReader(conn)
 	bs, err := br.Peek(1)
 	bs, err := br.Peek(1)
 	if err != nil {
 	if err != nil {
-		conn.Close()
-		return nil, err
+		// We hit a read error here, but the Accept() call succeeded so we must not return an error.
+		// We return the connection as is and let whoever tries to use it deal with the error.
+		return conn, nil
 	}
 	}
 
 
 	wrapper := &WrappedConnection{br, conn}
 	wrapper := &WrappedConnection{br, conn}

+ 1 - 0
integration/common_test.go

@@ -33,6 +33,7 @@ var env = []string{
 	"HOME=.",
 	"HOME=.",
 	"STTRACE=model",
 	"STTRACE=model",
 	"STGUIAPIKEY=" + apiKey,
 	"STGUIAPIKEY=" + apiKey,
+	"STNORESTART=1",
 }
 }
 
 
 type syncthingProcess struct {
 type syncthingProcess struct {

+ 18 - 3
integration/httpstress_test.go

@@ -12,8 +12,8 @@ import (
 	"errors"
 	"errors"
 	"io/ioutil"
 	"io/ioutil"
 	"log"
 	"log"
+	"net"
 	"net/http"
 	"net/http"
-	"os"
 	"sync"
 	"sync"
 	"testing"
 	"testing"
 	"time"
 	"time"
@@ -26,8 +26,6 @@ func TestStressHTTP(t *testing.T) {
 		t.Fatal(err)
 		t.Fatal(err)
 	}
 	}
 
 
-	os.Setenv("STNORESTART", "1")
-
 	log.Println("Starting up...")
 	log.Println("Starting up...")
 	sender := syncthingProcess{ // id1
 	sender := syncthingProcess{ // id1
 		log:    "2.out",
 		log:    "2.out",
@@ -56,6 +54,23 @@ func TestStressHTTP(t *testing.T) {
 	var lock sync.Mutex
 	var lock sync.Mutex
 
 
 	errChan := make(chan error, 2)
 	errChan := make(chan error, 2)
+
+	// One thread with immediately closed connections
+	wg.Add(1)
+	go func() {
+		for time.Since(t0).Seconds() < 30 {
+			conn, err := net.Dial("tcp", "localhost:8082")
+			if err != nil {
+				log.Println(err)
+				errChan <- err
+				return
+			}
+			conn.Close()
+		}
+		wg.Done()
+	}()
+
+	// 50 threads doing HTTP and HTTPS requests
 	for i := 0; i < 50; i++ {
 	for i := 0; i < 50; i++ {
 		i := i
 		i := i
 		wg.Add(1)
 		wg.Add(1)