From b5a8d8b804aaa6e28b4b3b3483d23b3253b3907c Mon Sep 17 00:00:00 2001 From: 9seconds Date: Mon, 30 Mar 2020 16:18:30 +0300 Subject: [PATCH 1/3] Add possibility to scale middleproxy buffers --- cli/proxy.go | 2 +- config/config.go | 45 +++++++++++++++++++++++++++++++++++++++++++++ proxy/proxy.go | 4 ++-- telegram/base.go | 2 +- utils/init_tcp.go | 8 +++----- 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/cli/proxy.go b/cli/proxy.go index fe15e39..a42a780 100644 --- a/cli/proxy.go +++ b/cli/proxy.go @@ -50,7 +50,7 @@ func Proxy() error { // nolint: funlen zap.S().Debugw("Configuration", "config", config.Printable()) - if len(config.C.AdTag) > 0 { + if config.C.MiddleProxyMode() { zap.S().Infow("Use middle proxy connection to Telegram") diff, err := ntp.Fetch() diff --git a/config/config.go b/config/config.go index 874a50b..aa13937 100644 --- a/config/config.go +++ b/config/config.go @@ -6,6 +6,7 @@ import ( "encoding/json" "errors" "fmt" + "math" "net" "github.com/alecthomas/units" @@ -104,6 +105,50 @@ type Config struct { AdTag []byte `json:"adtag"` } +func (c *Config) ClientReadBuffer() int { + return c.ReadBuffer +} + +func (c *Config) ClientWriteBuffer() int { + return c.WriteBuffer +} + +func (c *Config) MiddleProxyMode() bool { + return len(c.AdTag) > 0 +} + +func (c *Config) ProxyReadBuffer() int { + value := c.ReadBuffer + + if c.MiddleProxyMode() { + value = c.adjustProxyValue(value) + } + + return value +} + +func (c *Config) ProxyWriteBuffer() int { + value := c.WriteBuffer + + if c.MiddleProxyMode() { + value = c.adjustProxyValue(value) + } + + return value +} + +func (c *Config) adjustProxyValue(value int) int { + if c.MultiplexPerConnection == 0 { + return value + } + + fvalue := float64(value) + newValue := fvalue * 1.5 * math.Log2(float64(c.MultiplexPerConnection)) + newValue = math.Max(fvalue, math.Ceil(newValue)) + + return int(newValue) +} + type Opt struct { Option OptionType Value interface{} diff --git a/proxy/proxy.go b/proxy/proxy.go index 8a8202e..7bc462d 100644 --- a/proxy/proxy.go +++ b/proxy/proxy.go @@ -51,7 +51,7 @@ func (p *Proxy) accept(conn net.Conn) { connID := conntypes.NewConnID() logger := p.Logger.With("connection_id", connID) - if err := utils.InitTCP(conn); err != nil { + if err := utils.InitTCP(conn, config.C.ClientReadBuffer(), config.C.ClientWriteBuffer()); err != nil { logger.Errorw("Cannot initialize client TCP connection", "error", err) return } @@ -90,7 +90,7 @@ func (p *Proxy) accept(conn net.Conn) { err = nil - if len(config.C.AdTag) > 0 { + if config.C.MiddleProxyMode() { middleConnection(req) } else { err = directConnection(req) diff --git a/telegram/base.go b/telegram/base.go index bb27ff0..d454983 100644 --- a/telegram/base.go +++ b/telegram/base.go @@ -37,7 +37,7 @@ func (b *baseTelegram) dial(dc conntypes.DC, continue } - if err := utils.InitTCP(conn); err != nil { + if err := utils.InitTCP(conn, config.C.ProxyReadBuffer(), config.C.ProxyWriteBuffer()); err != nil { b.logger.Infow("Cannot initialize TCP socket", "address", addr, "error", err) continue } diff --git a/utils/init_tcp.go b/utils/init_tcp.go index d9166c1..c8d8b65 100644 --- a/utils/init_tcp.go +++ b/utils/init_tcp.go @@ -4,24 +4,22 @@ import ( "fmt" "net" "time" - - "github.com/9seconds/mtg/config" ) const tcpKeepAlivePingPeriod = 2 * time.Second -func InitTCP(conn net.Conn) error { +func InitTCP(conn net.Conn, readBufferSize int, writeBufferSize int) error { tcpConn := conn.(*net.TCPConn) if err := tcpConn.SetNoDelay(true); err != nil { return fmt.Errorf("cannot set TCP_NO_DELAY: %w", err) } - if err := tcpConn.SetReadBuffer(config.C.ReadBuffer); err != nil { + if err := tcpConn.SetReadBuffer(readBufferSize); err != nil { return fmt.Errorf("cannot set read buffer size: %w", err) } - if err := tcpConn.SetWriteBuffer(config.C.WriteBuffer); err != nil { + if err := tcpConn.SetWriteBuffer(writeBufferSize); err != nil { return fmt.Errorf("cannot set write buffer size: %w", err) } From 25edb60f2c59334906eb061c0832132331d4d58c Mon Sep 17 00:00:00 2001 From: 9seconds Date: Tue, 31 Mar 2020 09:45:59 +0300 Subject: [PATCH 2/3] Use different formula for calculating proxy buffer --- config/config.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/config/config.go b/config/config.go index aa13937..68fc717 100644 --- a/config/config.go +++ b/config/config.go @@ -143,8 +143,10 @@ func (c *Config) adjustProxyValue(value int) int { } fvalue := float64(value) - newValue := fvalue * 1.5 * math.Log2(float64(c.MultiplexPerConnection)) - newValue = math.Max(fvalue, math.Ceil(newValue)) + + newValue := fvalue * 2 * math.Log(float64(c.MultiplexPerConnection)) + newValue = math.Ceil(newValue) + newValue = math.Max(fvalue, newValue) return int(newValue) } From ad7acee64d44d08e78eb975019a19ddd1e4c82e1 Mon Sep 17 00:00:00 2001 From: 9seconds Date: Tue, 31 Mar 2020 09:51:38 +0300 Subject: [PATCH 3/3] Update dependencies --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index a80997b..4e33047 100644 --- a/go.mod +++ b/go.mod @@ -14,7 +14,7 @@ require ( golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59 golang.org/x/lint v0.0.0-20200302205851-738671d3881b // indirect golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e // indirect - golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd + golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775 golang.org/x/tools v0.0.0-20200319210407-521f4a0cd458 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 honnef.co/go/tools v0.0.1-2020.1.3 // indirect diff --git a/go.sum b/go.sum index 2775b17..4b43775 100644 --- a/go.sum +++ b/go.sum @@ -156,6 +156,8 @@ golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd h1:xhmwyvizuTgC2qz7ZlMluP20uW+C3Rm0FD/WLDX8884= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775 h1:TC0v2RSO1u2kn1ZugjrFXkRZAEaqMN/RW+OTZkBzmLE= +golang.org/x/sys v0.0.0-20200327173247-9dae0f8f5775/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=