[GH-ISSUE #227] [Bug] controlWorker函数的defer有问题!!! #158

Closed
opened 2026-05-05 11:53:23 -06:00 by gitea-mirror · 8 comments
Owner

Originally created by @jcao-ai on GitHub (Jan 12, 2017).
Original GitHub issue: https://github.com/fatedier/frp/issues/227

先启动一个frpc客户端,再用相同的配置启动frpc,后者会启动失败(这是符合预期的)。但是,你这个defer代码块会去调用s.Close(),而这个方法内部仅仅是依靠p.Name从map中删除。

defer func() {
		if closeFlag {
			c.Close()
			if s != nil {
				s.Close()
			}
		}
	}()
if p.PrivilegeMode && oldStatus != consts.Closed {
		// NOTE: this will take the global ProxyServerMap's lock
		// if we only want to release resources, use Release() instead
		DeleteProxy(p.Name)
	}

没错,我的frpc是使用特权模式连接的。因为配置相同,所以导致我前一个客户端被close了!!!!逻辑上这种情况不应该关闭前一个ProxyServer的

Originally created by @jcao-ai on GitHub (Jan 12, 2017). Original GitHub issue: https://github.com/fatedier/frp/issues/227 先启动一个frpc客户端,再用相同的配置启动frpc,后者会启动失败(这是符合预期的)。但是,你这个defer代码块会去调用[s.Close()](https://github.com/fatedier/frp/blob/edb97abf50c78dd514116e236a68eb954b6d6aa6/src/cmd/frps/control.go#L49),而这个方法内部仅仅是依靠p.Name从map中删除。 ``` defer func() { if closeFlag { c.Close() if s != nil { s.Close() } } }() ``` ``` if p.PrivilegeMode && oldStatus != consts.Closed { // NOTE: this will take the global ProxyServerMap's lock // if we only want to release resources, use Release() instead DeleteProxy(p.Name) } ``` 没错,我的frpc是使用特权模式连接的。因为配置相同,所以导致我前一个客户端被close了!!!!逻辑上这种情况不应该关闭前一个ProxyServer的
gitea-mirror 2026-05-05 11:53:23 -06:00
  • closed this issue
  • added the
    bug
    label
Author
Owner

@jcao-ai commented on GitHub (Jan 12, 2017):

https://github.com/fatedier/frp/pull/228

<!-- gh-comment-id:272120758 --> @jcao-ai commented on GitHub (Jan 12, 2017): https://github.com/fatedier/frp/pull/228
Author
Owner

@fatedier commented on GitHub (Jan 12, 2017):

if p.PrivilegeMode && oldStatus != consts.Closed

这里改为 oldStatus == consts.Working 吧。

<!-- gh-comment-id:272123346 --> @fatedier commented on GitHub (Jan 12, 2017): `if p.PrivilegeMode && oldStatus != consts.Closed` 这里改为 `oldStatus == consts.Working` 吧。
Author
Owner

@jcao-ai commented on GitHub (Jan 12, 2017):

@fatedier 改成oldStatus == consts.Working也无用的吧? 因为前一个连接确实状态是Working

<!-- gh-comment-id:272123788 --> @jcao-ai commented on GitHub (Jan 12, 2017): @fatedier 改成oldStatus == consts.Working也无用的吧? 因为前一个连接确实状态是Working
Author
Owner

@jcao-ai commented on GitHub (Jan 12, 2017):

所以我判断如果是doLogin中新来的CtrlConnection创建proxy失败的话,不让defer内的代码执行了

<!-- gh-comment-id:272123986 --> @jcao-ai commented on GitHub (Jan 12, 2017): 所以我判断如果是doLogin中新来的CtrlConnection创建proxy失败的话,不让defer内的代码执行了
Author
Owner

@fatedier commented on GitHub (Jan 12, 2017):

close 时判断的应该并不是 map 中的 proxy 的状态,而是创建的这个临时 proxy 的,这个 proxy 的状态初始时是 consts.Idle。

我大概看了下的,你可以改下代码测试看看。

<!-- gh-comment-id:272125696 --> @fatedier commented on GitHub (Jan 12, 2017): close 时判断的应该并不是 map 中的 proxy 的状态,而是创建的这个临时 proxy 的,这个 proxy 的状态初始时是 consts.Idle。 我大概看了下的,你可以改下代码测试看看。
Author
Owner

@jcao-ai commented on GitHub (Jan 12, 2017):

server.close

DeleteProxy

func DeleteProxy(proxyName string) {
	ProxyServersMutex.Lock()
	defer ProxyServersMutex.Unlock()
	delete(ProxyServers, proxyName)
}

确实是按照名字从map删除的,我测试过提交了一个PR,但是因为对项目不了解,用了Magic Number

<!-- gh-comment-id:272127112 --> @jcao-ai commented on GitHub (Jan 12, 2017): [server.close](https://github.com/fatedier/frp/blob/edb97abf50c78dd514116e236a68eb954b6d6aa6/src/models/server/server.go#L291) [DeleteProxy](https://github.com/fatedier/frp/blob/edb97abf50c78dd514116e236a68eb954b6d6aa6/src/models/server/config.go#L421) ``` func DeleteProxy(proxyName string) { ProxyServersMutex.Lock() defer ProxyServersMutex.Unlock() delete(ProxyServers, proxyName) } ``` 确实是按照名字从map删除的,我测试过提交了一个PR,但是因为对项目不了解,用了Magic Number
Author
Owner

@fatedier commented on GitHub (Jan 12, 2017):

建议你可以试着按照我之前说的将
if p.PrivilegeMode && oldStatus != consts.Closed 改为
if p.PrivilegeMode && oldStatus == consts.Working
测试看是否正常。

这样的改动使 Close 函数符合预期,也尽量避免了特殊处理。

之后可以重新提交一个 PR,注意规范,另外请合并到 dev 分支。

<!-- gh-comment-id:272191123 --> @fatedier commented on GitHub (Jan 12, 2017): 建议你可以试着按照我之前说的将 `if p.PrivilegeMode && oldStatus != consts.Closed` 改为 `if p.PrivilegeMode && oldStatus == consts.Working` 测试看是否正常。 这样的改动使 Close 函数符合预期,也尽量避免了特殊处理。 之后可以重新提交一个 PR,注意规范,另外请合并到 dev 分支。
Author
Owner

@jcao-ai commented on GitHub (Jan 13, 2017):

好的多谢,稍后处理

<!-- gh-comment-id:272328114 --> @jcao-ai commented on GitHub (Jan 13, 2017): 好的多谢,稍后处理
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: github-starred/frp#158
No description provided.