Conversation
|
ok, this is #3718 but for client? |
For server, too |
|
既然知道了会有 race condition,加个锁就行了,还加 error log 是干嘛 |
因为它们本来就不应该尝试往一个map写入 这个修改等于不炸了 换成一个log警告 如果嫌多可以换到debug级别 |
|
看了下,所以加锁是治标不治本 直接治本吧,本来就不应该共享同一个 content
你改一下我看看 |
|
同样这个也打算先合了,治一下标,晚点再研究治本 |
Attributes temporarily
只有一种可能就是 content 在 mux 前就被创建了,比如说你看 worker.go 里那三个 callback() 的代码,如果有 sniffing: Xray-core/app/proxyman/inbound/worker.go Lines 99 to 107 in dde0a4f 所以 mux 那里同时对 content 深拷贝是可以解决问题的,并且我看了下此时 Attributes 不为 nil 的话直接 panic 就行,因为在 mux 之前只有 HTTP 代理入站会设置这个,而它不应配合 mux 使用 我发现 SniffingRequest 里有 ExcludeForDomain 和 OverrideDestinationForProtocol 这两个 slice,不过它们在后面是只读的 倒是 worker.go UDP 那里没给 ExcludeForDomain 赋值,需要补上 |
|
当时是看岔了 dispatcher里确实有一个附加content的行为 现在看来应该是供被核心内部dispatch出来的连接(eg. doh-nonlocal) |
你搬一下吧,不过我印象中隔壁开始嗅探多个 QUIC 包,是不是加了缓存? |
本来想现在就搬,彻底修好 #3914 ,但发现隔壁的新版 sniffer 也遇到了原因不明的问题,等他们稳定后再搬吧 |
见 #3904
mmm似乎在inbound上遇到了类似的问题 这里的问题是content
问题还是老问题 对于一条被mux的连接 多个子请求在内部共享一条ctx
mmm的做法是在mux阶段创建一个深拷贝避免它们相互影响
这里更麻烦一些 因为content是在mux后面的dispatcher才被创建的 没法在mux处理 我也拿不定怎么搞 或许WithCancel另起一个新的ctx? 不是很敢乱动
说回这个issue 本质是多个连接都在尝试往content写入数据 当同时写入的时候遇到竞争就炸了 临时解决办法是加锁 这样好歹不会崩溃 但是并没有解决多个连接共享content的问题 这可能导致预期外的路由或者其他非规定行为