📦 mhrv-rs v1.9.9 منتشر شد
• Fix v1.9.8 Android: کرش جدید ~۲ ثانیه بعد از Disconnect (#700 از @ilok67 با root cause + fix کامل): علیرغم fix v1.9.8 برای race lifecycle (#666)، crash جداگانه در
• Fix tunnel-node batch drain correctness + lock contention (PR #695 از @dazzling-no-more): چهار باگ، دو correctness، دو latency.
- Cleanup race tail-bytes drop میکرد: session با buffer > ۱۶ MiB + EOF —
- Sessions-map lock روی upstream await نگه میداشت: phase-1
- TCP+UDP batch deadline UDP رو میپرداخت:
…
(see full notes on GitHub)
برای دانلود فایلها (Android، Windows، macOS، Linux و ...) به کانال فایلها مراجعه کنید:
👉 v1.9.9 — همه فایلها + SHA-256
لینک کانال:
https://t.me/mhrv_rs
و یا: https://t.me/+R1OyoHX2boA1ZDgx
#v199
• Fix v1.9.8 Android: کرش جدید ~۲ ثانیه بعد از Disconnect (#700 از @ilok67 با root cause + fix کامل): علیرغم fix v1.9.8 برای race lifecycle (#666)، crash جداگانه در
MhrvVpnService.teardown() باقی مانده بود. ترتیب قبلی: tun2proxy.stop → tun.close → join → Native.stopProxy. مشکل: tun2proxy worker thread در native code blocked روی socket read از SOCKS5 proxy است. وقتی Tun2proxy.stop کالد میشه + 2s timeout میگذره + 4s join timeout میگذره (worker هنوز alive)، Native.stopProxy runtime Rust رو shutdown میکنه شامل listener socket — worker thread که در native blocking read از همان socket است → use-after-free → SIGSEGV. comment کد قدیمی ادعا میکرد "runtime shutdown will knock the rest of the world over" که اشتباه بود — Native.stopProxy نمیتونه force-terminate یک thread native دیگه. ترتیب جدید: Native.stopProxy اول (socket رو میبنده → blocking read worker با error برمیگرده → worker پاک exit میکنه از error path)، بعد Tun2proxy.stop (cooperative، redundant ولی ارزان) → tun.close → join (تقریباً همیشه فوری چون worker از قبل تموم شده). تشکر بیشتر از @ilok67 برای triage دقیق دومین crash.• Fix tunnel-node batch drain correctness + lock contention (PR #695 از @dazzling-no-more): چهار باگ، دو correctness، دو latency.
- Cleanup race tail-bytes drop میکرد: session با buffer > ۱۶ MiB + EOF —
drain_now صحیح eof=false برمیگردوند تا tail tail رو در poll بعدی drain کنه، ولی cleanup loop همان atomic رو میخوند، true میدید + session رو حذف میکرد + reader_task رو abort + tail هدر میرفت. حالا cleanup از مقدار return drain_now پیروی میکنه — session فقط بعد از shipped شدن drain که eof=true میفرسته، حذف میشه. data loss silent در 1Gbps+ VPS که buffer بین pollها پر میشد، fix شد.- Sessions-map lock روی upstream await نگه میداشت: phase-1
data op global sessions map رو نگه میداشت روی last_active.lock، writer.lock، write_all، و flush — head-of-line-block برای هر batch + connect/close op دیگه. حالا (مثل udp_data که قبلاً درست بود) Arc از under map clone میشه، lock drop، بعد write/flush.- TCP+UDP batch deadline UDP رو میپرداخت:
tokio::join!(wait_tcp, wait_udp) conjunctive هست — TCP-ready burst هنوز LONGPOLL_DEADLINE 15 ثانیهای UDP رو میپرداخت قبل از پاسخ. comment میگفت "either side"، code "both sides" انجام میداد. تغییر به select!. test جدید batch_tcp_ready_does_not_pay_udp_longpoll_deadline این رد رو حفظ میکنه.…
(see full notes on GitHub)
برای دانلود فایلها (Android، Windows، macOS، Linux و ...) به کانال فایلها مراجعه کنید:
👉 v1.9.9 — همه فایلها + SHA-256
لینک کانال:
https://t.me/mhrv_rs
و یا: https://t.me/+R1OyoHX2boA1ZDgx
#v199
GitHub
App crashes ~2 seconds after Disconnect due to teardown ordering — worker thread still in native code when Rust runtime is killed…
After the stopService() fix in 1c9c2e0, the app still crashes approximately 2 seconds after tapping Disconnect. This is a separate bug in the teardown sequence inside MhrvVpnService.teardown(). Roo...
❤7