Преглед изворни кода

Merge pull request #139 from 9seconds/memory-direct

Memory optimizations for direct mode
tags/v1.0.4^2
Sergey Arkhipov пре 6 година
родитељ
комит
2d9f2345dc
No account linked to committer's email address
2 измењених фајлова са 37 додато и 7 уклоњено
  1. 4
    3
      proxy/direct.go
  2. 33
    4
      wrappers/stream/obfuscated2.go

+ 4
- 3
proxy/direct.go Прегледај датотеку

@@ -11,7 +11,7 @@ import (
11 11
 	"github.com/9seconds/mtg/protocol"
12 12
 )
13 13
 
14
-const directPipeBufferSize = 1024 * 1024
14
+const directPipeBufferSize = 1024
15 15
 
16 16
 func directConnection(request *protocol.TelegramRequest) error {
17 17
 	telegramConnRaw, err := obfuscated2.TelegramProtocol(request)
@@ -42,8 +42,9 @@ func directPipe(dst io.WriteCloser, src io.ReadCloser, wg *sync.WaitGroup, logge
42 42
 		wg.Done()
43 43
 	}()
44 44
 
45
-	buf := make([]byte, directPipeBufferSize)
46
-	if _, err := io.CopyBuffer(dst, src, buf); err != nil {
45
+	buf := [directPipeBufferSize]byte{}
46
+
47
+	if _, err := io.CopyBuffer(dst, src, buf[:]); err != nil {
47 48
 		logger.Debugw("Cannot pump sockets", "error", err)
48 49
 	}
49 50
 }

+ 33
- 4
wrappers/stream/obfuscated2.go Прегледај датотеку

@@ -1,9 +1,11 @@
1 1
 package stream
2 2
 
3 3
 import (
4
+	"bytes"
4 5
 	"crypto/cipher"
5 6
 	"fmt"
6 7
 	"net"
8
+	"sync"
7 9
 	"time"
8 10
 
9 11
 	"go.uber.org/zap"
@@ -11,6 +13,23 @@ import (
11 13
 	"github.com/9seconds/mtg/conntypes"
12 14
 )
13 15
 
16
+var (
17
+	poolWrapperObfuscated2WritePool = sync.Pool{
18
+		New: func() interface{} {
19
+			return &bytes.Buffer{}
20
+		},
21
+	}
22
+)
23
+
24
+func poolWrapperObfuscated2WritePoolAcquire() *bytes.Buffer {
25
+	return poolWrapperObfuscated2WritePool.Get().(*bytes.Buffer)
26
+}
27
+
28
+func poolWrapperObfuscated2WritePoolRelease(buf *bytes.Buffer) {
29
+	buf.Reset()
30
+	poolWrapperObfuscated2WritePool.Put(buf)
31
+}
32
+
14 33
 type wrapperObfuscated2 struct {
15 34
 	encryptor cipher.Stream
16 35
 	decryptor cipher.Stream
@@ -40,16 +59,26 @@ func (w *wrapperObfuscated2) Read(p []byte) (int, error) {
40 59
 }
41 60
 
42 61
 func (w *wrapperObfuscated2) WriteTimeout(p []byte, timeout time.Duration) (int, error) {
43
-	buf := make([]byte, len(p))
44
-	copy(buf, p)
62
+	buffer := poolWrapperObfuscated2WritePoolAcquire()
63
+	defer poolWrapperObfuscated2WritePoolRelease(buffer)
64
+
65
+	buffer.Write(p)
66
+
67
+	buf := buffer.Bytes()
68
+
45 69
 	w.encryptor.XORKeyStream(buf, buf)
46 70
 
47 71
 	return w.parent.WriteTimeout(buf, timeout)
48 72
 }
49 73
 
50 74
 func (w *wrapperObfuscated2) Write(p []byte) (int, error) {
51
-	buf := make([]byte, len(p))
52
-	copy(buf, p)
75
+	buffer := poolWrapperObfuscated2WritePoolAcquire()
76
+	defer poolWrapperObfuscated2WritePoolRelease(buffer)
77
+
78
+	buffer.Write(p)
79
+
80
+	buf := buffer.Bytes()
81
+
53 82
 	w.encryptor.XORKeyStream(buf, buf)
54 83
 
55 84
 	return w.parent.Write(buf)

Loading…
Откажи
Сачувај