Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix the conflict between global sessions & local sessions in socks/socks.go #42

Merged

Conversation

LanXuage
Copy link
Contributor

@LanXuage LanXuage commented Mar 9, 2023

Fix the conflict between global variable sessions in socks/socks.go and local variable sessions in pickConn function of socks/socks.go.

问题

运行时发现会有少数连接无响应问题。使用--debug进行跟踪调试发现问题发生在文件socks/socks.go里,其中函数pickConnsessions是通过传参得到的局部变量,不是真正的全局sessions池,所以当调用pickConn并传入全局sessions后,pickConn里的sessions就固定在传入时的样子,同时pickConn里的无效连接移除不会作用于全局变量sessions,只会生效于局部变量sessions。这将使sessions池中的失效连接并未被实际移除,同时pickConn中的局部sessions池不会有新增连接的加入(新增操作只作用于全局sessions池)导致pickConn有大概率发生死循环(传入sessions为空数组或者传入的sessions里的所有连接都失效时)。长时间运行可能导致更严重的内存泄露。

问题表现

--debug模式中,一直提示No scf server connections

复现例子

package main

import (
	"fmt"
	"sync"
	"time"

	"golang.org/x/exp/slices"
)

type Test struct {
	t string
}

var sessions []*Test
var ws sync.WaitGroup

func main() {
	ws.Add(1)
	go appendTest()
	ws.Add(1)
	go deleteTest(sessions)
	ws.Wait()
	fmt.Println("In main After deleteTest global sessions =", sessions)
}
func appendTest() {
	defer ws.Done()
	sessions = append(sessions, &Test{t: "a"})
	sessions = append(sessions, &Test{t: "b"})
	sessions = append(sessions, &Test{t: "c"})
	fmt.Println("Append done sessions =", sessions)
}

func deleteTest(sessions []*Test) {
	defer ws.Done()
	for {
		if len(sessions) == 0 {
			fmt.Println("continue")
			time.Sleep(5 * time.Second)
			continue
		}
		fmt.Println("In deleteTest Before delete sessions =", sessions)
		sessions = slices.Delete(sessions, 0, 1)
		fmt.Println("In deleteTest After delete sessions =", sessions)
	}
}

修复

有几种简单的修复方式,
1、pickConn传参时改传全局sessions池的地址
2、pickConn不传参,函数里直接使用全局sessions
3、其他

为了代码的简洁和易读性这里选择第二种方式。

…nd local variable session in pickConn function of socks/socks.go.

Signed-off-by: lanxuage <zx1456817554@gmail.com>
@shimmeris
Copy link
Owner

感谢

@shimmeris shimmeris merged commit ca7ce02 into shimmeris:main Mar 10, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants