Bladeren bron

Optimize for a fast flush

tags/v2.1.3^2
9seconds 4 jaren geleden
bovenliggende
commit
33e0509c5a
2 gewijzigde bestanden met toevoegingen van 14 en 3 verwijderingen
  1. 2
    2
      mtglib/internal/relay/init.go
  2. 12
    1
      mtglib/internal/relay/sync_pair.go

+ 2
- 2
mtglib/internal/relay/init.go Bestand weergeven

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

+ 12
- 1
mtglib/internal/relay/sync_pair.go Bestand weergeven

26
 func (s *syncPair) Read(p []byte) (int, error) {
26
 func (s *syncPair) Read(p []byte) (int, error) {
27
 	n, err := s.readBlocking(p, false)
27
 	n, err := s.readBlocking(p, false)
28
 
28
 
29
+	// nothing has been delivered for readTimeout time. Let's flush.
29
 	if errors.Is(err, os.ErrDeadlineExceeded) {
30
 	if errors.Is(err, os.ErrDeadlineExceeded) {
30
 		if err := s.Flush(); err != nil {
31
 		if err := s.Flush(); err != nil {
31
 			return 0, fmt.Errorf("cannot flush writer hand-side: %w", err)
32
 			return 0, fmt.Errorf("cannot flush writer hand-side: %w", err)
41
 	s.mutex.Lock()
42
 	s.mutex.Lock()
42
 	defer s.mutex.Unlock()
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
 func (s *syncPair) Flush() error {
58
 func (s *syncPair) Flush() error {

Laden…
Annuleren
Opslaan