Allenxuxu / gev

🚀Gev is a lightweight, fast non-blocking TCP network library / websocket server based on Reactor mode. Support custom protocols to quickly and easily build high-performance servers.
MIT License
1.72k stars 193 forks source link

关于sendInLoop中EAGAIN的处理 #60

Closed M6ZeroG closed 3 years ago

M6ZeroG commented 3 years ago

这里当err == unix.EAGAIN时直接return的话,不管n是多少,未Write()成功的那部分数据相当于直接丢弃了,为什么不把这部分未成功写入的数据存到c.outBuffer里再return呢?请教。 https://github.com/Allenxuxu/gev/blob/8e27f6e802c5b940e09d00114a07ff2d18b53324/connection/connection.go#L267-L273

Allenxuxu commented 3 years ago

非常感谢,这里确实有问题。 已经提了修复的 PR ,可以看下 https://github.com/Allenxuxu/gev/pull/61 @M6ZeroG

M6ZeroG commented 3 years ago

非常感谢,这里确实有问题。 已经提了修复的 PR ,可以看下 #61 @M6ZeroG

不客气,还以为我对EAGAIN的理解有问题呢,查了资料又看了好久:joy:

Allenxuxu commented 3 years ago

这里当err == unix.EAGAIN时直接return的话,不管n是多少,未Write()成功的那部分数据相当于直接丢弃了,为什么不把这部分未成功写入的数据存到c.outBuffer里再return呢?请教。 https://github.com/Allenxuxu/gev/blob/8e27f6e802c5b940e09d00114a07ff2d18b53324/connection/connection.go#L267-L273

我理解 linux 里返回 EAGAIN , n 会被置为 -1, golang 里n会返回啥,我没找到确切的资料。 按你这里所说,返回 EAGAIN ,会存在 n 大于 0 的情况?有相关资料吗?

M6ZeroG commented 3 years ago

这里当err == unix.EAGAIN时直接return的话,不管n是多少,未Write()成功的那部分数据相当于直接丢弃了,为什么不把这部分未成功写入的数据存到c.outBuffer里再return呢?请教。 https://github.com/Allenxuxu/gev/blob/8e27f6e802c5b940e09d00114a07ff2d18b53324/connection/connection.go#L267-L273

我理解 linux 里返回 EAGAIN , n 会被置为 -1, golang 里n会返回啥,我没找到确切的资料。 按你这里所说,返回 EAGAIN ,会存在 n 大于 0 的情况?有相关资料吗?

根据golang封装的Write()源码上看,这个n应该就是 linux系统调用返回值,暂时还没有实测过 https://github.com/golang/sys/blob/master/unix/zsyscall_linux.go#L1565-L1578

Allenxuxu commented 3 years ago

这里当err == unix.EAGAIN时直接return的话,不管n是多少,未Write()成功的那部分数据相当于直接丢弃了,为什么不把这部分未成功写入的数据存到c.outBuffer里再return呢?请教。 https://github.com/Allenxuxu/gev/blob/8e27f6e802c5b940e09d00114a07ff2d18b53324/connection/connection.go#L267-L273

我理解 linux 里返回 EAGAIN , n 会被置为 -1, golang 里n会返回啥,我没找到确切的资料。 按你这里所说,返回 EAGAIN ,会存在 n 大于 0 的情况?有相关资料吗?

根据golang封装的Write()源码上看,这个n应该就是 linux系统调用返回值,暂时还没有实测过 https://github.com/golang/sys/blob/master/unix/zsyscall_linux.go#L1565-L1578

这里我也看过,结合 linux man,似乎会返回 -1 ,但是返回 -1 的话又不符合 go 的“哲学”了,已经返回 err 了,n 应该是一个零值