Closed zzqCh closed 1 year ago
@zzqCh 你完整的测试代码能够方便建立一个repo出来吗?比如你这里的 muxConn 是啥
@zzqCh 你完整的测试代码能够方便建立一个repo出来吗?比如你这里的 muxConn 是啥
代码是copy的benchmark的库,可以参考这块https://github.com/cloudwego/netpoll-benchmark/blob/main/netpoll/mux_server.go#L112
@zzqCh 所以你除了 process 函数,其他地方都没改过吗?尤其是 encode decode 函数
你这个问题极大的可能性来自:decode 函数中,拿到 netpoll 的一个内存对象,比如 conn.Next(4) 后,然后直接调用了 release 函数。这个时候,netpoll 会认为你已经不使用 next 函数返回的内存了。就会重用这段内存。
正确的时序应该是:
如果你不能确保这个时序,还有一个解法是不用使用nocopy API,如 Next。
https://github.com/cloudwego/netpoll/blob/e69450be63da0d3cc6e14f3f62b3e16757676e08/nocopy.go#L35 这里注释有详细描述
如果你不能确保这个时序,还有一个解法是不用使用nocopy API,如 Next。
https://github.com/cloudwego/netpoll/blob/e69450be63da0d3cc6e14f3f62b3e16757676e08/nocopy.go#L35
这里注释有详细描述
我看了遍代码,确实如您所说,是因为slice转string的时候用的指针替换,然后提前release了。 那不使用nocopy API,我们应该使用哪个api的呢?有示例么?
@zzqCh 你直接使用:https://github.com/cloudwego/netpoll/blob/e69450be63da0d3cc6e14f3f62b3e16757676e08/nocopy.go#L73
这个方法是可以帮你 copy 好的。
此外,另外一个方法是,你只在最终确定读取的数据不再被使用后,调用release,这样也能继续使用现有的方法
@zzqCh 你直接使用:
https://github.com/cloudwego/netpoll/blob/e69450be63da0d3cc6e14f3f62b3e16757676e08/nocopy.go#L73
这个方法是可以帮你 copy 好的。
此外,另外一个方法是,你只在最终确定读取的数据不再被使用后,调用release,这样也能继续使用现有的方法
好的,谢谢您,我这边按照您说的改下代码。
Describe the bug 采用多路复用模式,出现了数据乱码的情况:
To Reproduce 请求链路: client---->mosn----->netpoll,其中mosn方显示发出的数据是对的,但是接收到的是乱码,mosn也开启了多路复用。 netpoll的示例代码:
Expected behavior 两个loginfo打印的内容一致。
Screenshots
测试过程中发现,如果sleep 3s或者更长,那么两个loginfo打印的内容就不一样了,而且会参杂其他client的请求内容,但是如果不sleep,那么就不会出现问题。