Quellcode durchsuchen

Optimize for a fast flush

tags/v2.1.3^2
9seconds vor 4 Jahren
Ursprung
Commit
33e0509c5a
2 geänderte Dateien mit 14 neuen und 3 gelöschten Zeilen
  1. 2
    2
      mtglib/internal/relay/init.go
  2. 12
    1
      mtglib/internal/relay/sync_pair.go

+ 2
- 2
mtglib/internal/relay/init.go Datei anzeigen

@@ -3,8 +3,8 @@ package relay
3 3
 import "time"
4 4
 
5 5
 const (
6
-	copyBufferSize   = 32 * 1024
7
-	writerBufferSize = 2 * copyBufferSize
6
+	copyBufferSize   = 64 * 1024
7
+	writerBufferSize = 128 * 1024
8 8
 	readTimeout      = 10 * time.Millisecond
9 9
 )
10 10
 

+ 12
- 1
mtglib/internal/relay/sync_pair.go Datei anzeigen

@@ -26,6 +26,7 @@ func (s *syncPair) Sync() (int64, error) {
26 26
 func (s *syncPair) Read(p []byte) (int, error) {
27 27
 	n, err := s.readBlocking(p, false)
28 28
 
29
+	// nothing has been delivered for readTimeout time. Let's flush.
29 30
 	if errors.Is(err, os.ErrDeadlineExceeded) {
30 31
 		if err := s.Flush(); err != nil {
31 32
 			return 0, fmt.Errorf("cannot flush writer hand-side: %w", err)
@@ -41,7 +42,17 @@ func (s *syncPair) Write(p []byte) (int, error) {
41 42
 	s.mutex.Lock()
42 43
 	defer s.mutex.Unlock()
43 44
 
44
-	return s.writer.Write(p) // nolint: wrapcheck
45
+	n, err := s.writer.Write(p) // nolint: wrapcheck
46
+
47
+	// optimization for a case when we have a small package and want to avoid a
48
+	// delay in readTimeout. In that case, we assume that peer has finished to
49
+	// sent a data it wants to send so we can flush without waiting for anything
50
+	// else.
51
+	if err == nil && n < copyBufferSize {
52
+		err = s.writer.Flush()
53
+	}
54
+
55
+	return n, err
45 56
 }
46 57
 
47 58
 func (s *syncPair) Flush() error {

Laden…
Abbrechen
Speichern