Repository navigation
fix(cooperation): give tunnel streams collision-free ids - #807
Conversation
Reviewer's GuideThe PR eliminates reverse-tunnel stream ID collisions by assigning each locally initiated stream a random non-zero ID that is checked against active local streams, and adds an end-to-end test proving both peers can open concurrent streams without disrupting one another. Sequence diagram for collision-free concurrent tunnel streamssequenceDiagram
participant PeerA
participant PeerB
participant ManagerA as TunnelManagerA
participant ManagerB as TunnelManagerB
participant Barrier as BarrierStream
participant Transfer as ReverseFileTransfer
PeerA->>ManagerA: acceptLocalConnection(serviceId)
ManagerA->>ManagerA: nextStreamId()
ManagerA->>ManagerA: QRandomGenerator.generate()
ManagerA->>Barrier: createStream(non-zero unused id)
Barrier->>PeerB: OPEN(id)
PeerB->>ManagerB: acceptLocalConnection(serviceId)
ManagerB->>ManagerB: nextStreamId()
ManagerB->>ManagerB: QRandomGenerator.generate()
ManagerB->>Transfer: createStream(non-zero unused id)
Transfer->>PeerA: OPEN(id)
PeerB-->>ManagerB: Find barrier stream by id
PeerA-->>ManagerA: Find transfer stream by id
Note over ManagerA,ManagerB: Distinct ids allow both streams to establish concurrently
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
4e98d8f to
8e31bef
Compare
2ae6ff7 to
57490cf
Compare
Both peers allocate ids for the streams they initiate, but the ids share one namespace. Starting both counters at 1 made the barrier stream and a reverse file transfer collide: the peer rejected the second OPEN as a duplicate stream, so the transfer never established and stayed at 1%. Pick a random non-zero id and skip ids already in use locally. Log: give tunnel streams collision-free ids PMS: TASK-396845 Influence: concurrent barrier and file-transfer streams no longer collide.
8e31bef to
5e03963
Compare
deepin pr auto review🤖 AI 代码审查报告📊 总体评价
🔍 详细分析1. 语法逻辑 ✅评价: 语法正确,逻辑清晰 ✅ 通过 潜在问题: 建议: [] 2. 代码质量 ✅评价: 代码结构清晰,注释完整 ✅ 通过 潜在问题: 建议: ['建议将测试中的硬编码字节数替换为变量引用 .size(),例如: const QByteArray barrierData = QByteArrayLiteral("barrier"); ASSERT_TRUE(waitFor([&] { return barrierClient.bytesAvailable() >= barrierData.size(); }));'] 3. 代码性能 ✅评价: 性能良好,资源使用合理 ✅ 通过 潜在问题: 建议: [] 4. 代码安全 🔒评价: 存在0个安全漏洞 ✅ 通过
安全漏洞详情: 建议: [] 💡 改进建议代码示例// 建议优化测试中的硬编码字节数(OCR 指出的低优先级可维护性问题): TEST(TunnelManagerTest, BothSidesCanInitiateStreams) {
// ... 前置设置省略 ...
const QByteArray barrierPayload = QByteArrayLiteral("barrier");
barrierClient.write(barrierPayload);
ASSERT_TRUE(waitFor([&] { return barrierClient.bytesAvailable() >= barrierPayload.size(); }));
EXPECT_EQ(barrierClient.readAll(), barrierPayload);
const QByteArray transferPayload = QByteArrayLiteral("transfer");
transferClient.write(transferPayload);
ASSERT_TRUE(waitFor([&] { return transferClient.bytesAvailable() >= transferPayload.size(); }));
EXPECT_EQ(transferClient.readAll(), transferPayload);
const QByteArray alivePayload = QByteArrayLiteral("still-alive");
barrierClient.write(alivePayload);
ASSERT_TRUE(waitFor([&] { return barrierClient.bytesAvailable() >= alivePayload.size(); }));
EXPECT_EQ(barrierClient.readAll(), alivePayload);
}本报告由 AI 代码审查工具自动生成 |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: lzwind, re2zero The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
Part 4/8 of the reverse tunnel stack (recovery of #800).
This reapplies the reviewed commit on top of the corrected stack because #800 was accidentally merged into its stacked base branch instead of master.
Merge order: #805 → #806 → #807 → #808 → #809 → #810 → #811.
Retargeted to master after #806 merged.
Both peers allocate ids for the streams they initiate, but the ids share
one namespace. Starting both counters at 1 made the barrier stream and a
reverse file transfer collide: the peer rejected the second OPEN as a
duplicate stream, so the transfer never established and stayed at 1%.
Pick a random non-zero id and skip ids already in use locally.
Log: give tunnel streams collision-free ids
PMS: TASK-396845
Influence: concurrent barrier and file-transfer streams no longer collide.
Summary by Sourcery
Ensure concurrently initiated tunnel streams use collision-free IDs so reverse transfers and barrier connections can coexist.
Bug Fixes:
Enhancements:
Tests: