Skip to content

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

Merged
shimmeris merged 1 commit intoshimmeris:mainfrom
LanXuage:fix-socks_global_var_and_local_var_conflict
Mar 10, 2023
Merged

Fix the conflict between global sessions & local sessions in socks/socks.go#42
shimmeris merged 1 commit intoshimmeris:mainfrom
LanXuage:fix-socks_global_var_and_local_var_conflict

Conversation

@LanXuage
Copy link
Copy Markdown
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
Copy Markdown
Owner

感谢

@shimmeris shimmeris merged commit ca7ce02 into shimmeris:main Mar 10, 2023
power12317 pushed a commit to power12317/SCFProxy that referenced this pull request Jan 15, 2026
…d_local_var_conflict

Fix the conflict between global sessions & local sessions  in socks/socks.go
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