Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add async message dispatch to loopback #11461

Merged
merged 2 commits into from
Nov 5, 2021

Conversation

mrjerryjohns
Copy link
Contributor

This PR was triggered by some test failures in some of the end-to-end IM unit tests that utilized the loopback transport to send/receive payloads from client to server and back. Since the current loopback transport
processes 'transmitted' messages synchronously without completing the execution of the original context, it results in call flows that are not typical of actual devices interacting with each other. This resulted in a use-after-free error where the upon calling SendMessage() within the CommandSender, the synchronous execution resulted in the eventual destruction of the original CommandSender object immediately after SendMessage() was called.

This PR adds support for asynchronous dispatch and handling of transmitted messages that is more representative of real-world CHIP node interactions to the existing loopback interface. It utilizes SystemLayer::ScheduleWork to handle the processing of sent messages as bottom half handlers.

It also adds a DrainAndServiceIO() method on the AppContext that will automatically drain and service the IO till all messages have been handled, making it easy to drive the system to quiescence.

Tests:

  • Ensured the TestCommand failure doesn't happen again.

This PR was triggered by some test failures in some of the end-to-end IM
unit tests that utilized the loopback transport to send/receive payloads
from client to server and back. Since the current loopback transport
processes 'transmitted' messages synchronously without completing the
execution of the original context, it results in call flows that are not
typical of actual devices interacting with each other. This resulted in
a use-after-free error where the upon calling SendMessage() within the
CommandSender, the synchronous execution resulted in the eventual
destruction of the original CommandSender object immediately after
SendMessage() was called.

This PR adds support for asynchronous dispatch and handling of
transmitted messages that is more representative of real-world CHIP
node interactions to the existing loopback interface. It utilizes
SystemLayer::ScheduleWork to handle the processing of the sent message
as a bottom half handler.

It also adds a DrainAndServiceIO method on the AppContext that will
automatically drain and service the IO till all messages have been
handled.

Tests:
- Ensured the TestCommand failure doesn't happen again.
@github-actions
Copy link

github-actions bot commented Nov 5, 2021

PR #11461: Size comparison from 39ff9bf to 9de3aee

Full report (38 builds for efr32, esp32, k32w, linux, mbed, nrfconnect, p6, qpg, telink)
platform target config section 39ff9bf 9de3aee change % change
efr32 lighting-app BRD4161A (read only) 744756 744756 0 0.0
(read/write) 115704 115704 0 0.0
.bss 113932 113932 0 0.0
.data 1772 1772 0 0.0
.text 744748 744748 0 0.0
BRD4161A+rpc (read only) 732304 732304 0 0.0
(read/write) 132324 132324 0 0.0
.bss 130436 130436 0 0.0
.data 1888 1888 0 0.0
.text 732296 732296 0 0.0
lock-app BRD4161A (read only) 724056 724056 0 0.0
(read/write) 113524 113524 0 0.0
.bss 111788 111788 0 0.0
.data 1732 1732 0 0.0
.text 724048 724048 0 0.0
window-app BRD4161A (read only) 724952 724952 0 0.0
(read/write) 113844 113844 0 0.0
.bss 112108 112108 0 0.0
.data 1736 1736 0 0.0
.text 724944 724944 0 0.0
esp32 all-clusters-app c3devkit (read only) 882498 882498 0 0.0
(read/write) 1305960 1305960 0 0.0
.dram0.bss 57576 57576 0 0.0
.dram0.data 16472 16472 0 0.0
.flash.rodata 198664 198664 0 0.0
.flash.text 882498 882498 0 0.0
.iram0.text 57624 57624 0 0.0
m5stack (read only) 913375 913375 0 0.0
(read/write) 423268 423268 0 0.0
.dram0.bss 60088 60088 0 0.0
.dram0.data 32108 32108 0 0.0
.flash.rodata 204908 204908 0 0.0
.flash.text 913375 913375 0 0.0
.iram0.text 125115 125115 0 0.0
k32w lighting-app k32w061+se05x+release (read/write) 699136 699136 0 0.0
.bss 77784 77784 0 0.0
.data 1904 1904 0 0.0
.text 613648 613648 0 0.0
lock-app k32w061+debug (read/write) 591956 591956 0 0.0
.bss 68316 68316 0 0.0
.data 1872 1872 0 0.0
.text 515968 515968 0 0.0
shell k32w061+debug (read/write) 657448 657448 0 0.0
.bss 78952 78952 0 0.0
.data 1840 1840 0 0.0
.text 570856 570856 0 0.0
linux all-clusters-app debug (read only) 1702737 1702737 0 0.0
(read/write) 118656 118656 0 0.0
.bss 50000 50000 0 0.0
.data 1042 1042 0 0.0
.data.rel.ro 62336 62336 0 0.0
.dynamic 592 592 0 0.0
.got 4088 4088 0 0.0
.init 27 27 0 0.0
.init_array 552 552 0 0.0
.rodata 139157 139157 0 0.0
.text 1430114 1430114 0 0.0
bridge-app debug+rpc (read only) 1290757 1290757 0 0.0
(read/write) 69232 69232 0 0.0
.bss 34928 34928 0 0.0
.data 1568 1568 0 0.0
.data.rel.ro 27768 27768 0 0.0
.dynamic 592 592 0 0.0
.got 3952 3952 0 0.0
.init 27 27 0 0.0
.init_array 408 408 0 0.0
.rodata 110948 110948 0 0.0
.text 1083893 1083893 0 0.0
chip-tool debug (read only) 4508277 4508277 0 0.0
(read/write) 125864 125864 0 0.0
.bss 18128 18128 0 0.0
.data 2224 2224 0 0.0
.data.rel.ro 100096 100096 0 0.0
.dynamic 592 592 0 0.0
.got 4368 4368 0 0.0
.init 27 27 0 0.0
.init_array 432 432 0 0.0
.rodata 231824 231824 0 0.0
.text 4007989 4007989 0 0.0
lighting-app debug+rpc (read only) 1551753 1551753 0 0.0
(read/write) 102200 102200 0 0.0
.bss 40568 40568 0 0.0
.data 1170 1170 0 0.0
.data.rel.ro 55168 55168 0 0.0
.dynamic 608 608 0 0.0
.got 4112 4112 0 0.0
.init 27 27 0 0.0
.init_array 536 536 0 0.0
.rodata 129585 129585 0 0.0
.text 1288562 1288562 0 0.0
ota-provider-app debug (read only) 1249993 1249993 0 0.0
(read/write) 67400 67400 0 0.0
.bss 36992 36992 0 0.0
.data 752 752 0 0.0
.data.rel.ro 24568 24568 0 0.0
.dynamic 592 592 0 0.0
.got 4016 4016 0 0.0
.init 27 27 0 0.0
.init_array 448 448 0 0.0
.rodata 112168 112168 0 0.0
.text 1041698 1041698 0 0.0
ota-requestor-app debug (read only) 1328321 1328321 0 0.0
(read/write) 76656 76656 0 0.0
.bss 45120 45120 0 0.0
.data 816 816 0 0.0
.data.rel.ro 25576 25576 0 0.0
.dynamic 592 592 0 0.0
.got 3992 3992 0 0.0
.init 27 27 0 0.0
.init_array 520 520 0 0.0
.rodata 124176 124176 0 0.0
.text 1106066 1106066 0 0.0
shell debug (read only) 786921 786921 0 0.0
(read/write) 57608 57608 0 0.0
.bss 16040 16040 0 0.0
.data 242 242 0 0.0
.data.rel.ro 36816 36816 0 0.0
.dynamic 592 592 0 0.0
.got 3528 3528 0 0.0
.init 27 27 0 0.0
.init_array 344 344 0 0.0
.rodata 77903 77903 0 0.0
.text 607506 607506 0 0.0
tv-app debug (read only) 1815393 1815393 0 0.0
(read/write) 289824 289824 0 0.0
.bss 222640 222640 0 0.0
.data 2704 2704 0 0.0
.data.rel.ro 58824 58824 0 0.0
.dynamic 592 592 0 0.0
.got 4408 4408 0 0.0
.init 27 27 0 0.0
.init_array 616 616 0 0.0
.rodata 155208 155208 0 0.0
.text 1517874 1517874 0 0.0
mbed all-clusters-app CY8CPROTO_062_4343W+release (read only) 6224 6224 0 0.0
(read/write) 2291344 2291344 0 0.0
.bss 178892 178892 0 0.0
.data 5224 5224 0 0.0
.heap 852328 852328 0 0.0
.text 1253944 1253944 0 0.0
lighting-app CY8CPROTO_062_4343W+release (read only) 6224 6224 0 0.0
(read/write) 2271504 2271504 0 0.0
.bss 171948 171948 0 0.0
.data 5568 5568 0 0.0
.heap 858928 858928 0 0.0
.text 1234104 1234104 0 0.0
lock-app CY8CPROTO_062_4343W+release (read only) 6224 6224 0 0.0
(read/write) 2249160 2249160 0 0.0
.bss 170844 170844 0 0.0
.data 5560 5560 0 0.0
.heap 860040 860040 0 0.0
.text 1211760 1211760 0 0.0
pigweed-app CY8CPROTO_062_4343W+release (read only) 6224 6224 0 0.0
(read/write) 1139744 1139744 0 0.0
.bss 11752 11752 0 0.0
.data 4368 4368 0 0.0
.heap 1020328 1020328 0 0.0
.text 103128 103128 0 0.0
shell CY8CPROTO_062_4343W+release (read only) 6224 6224 0 0.0
(read/write) 2048400 2048400 0 0.0
.bss 156224 156224 0 0.0
.data 4960 4960 0 0.0
.heap 875264 875264 0 0.0
.text 1011000 1011000 0 0.0
nrfconnect lighting-app nrf52840dk_nrf52840 (read/write) 861223 861223 0 0.0
bss 111256 111256 0 0.0
rodata 96872 96872 0 0.0
text 577480 577480 0 0.0
nrf52840dk_nrf52840+rpc (read/write) 823567 823567 0 0.0
bss 107608 107608 0 0.0
rodata 88048 88048 0 0.0
text 551628 551628 0 0.0
nrf5340dk_nrf5340_cpuapp (read/write) 786246 786246 0 0.0
bss 112632 112632 0 0.0
rodata 92128 92128 0 0.0
text 506936 506936 0 0.0
lock-app nrf52840dk_nrf52840 (read/write) 837927 837927 0 0.0
bss 110292 110292 0 0.0
rodata 93240 93240 0 0.0
text 558960 558960 0 0.0
nrf5340dk_nrf5340_cpuapp (read/write) 763226 763226 0 0.0
bss 111700 111700 0 0.0
rodata 88548 88548 0 0.0
text 488508 488508 0 0.0
pigweed-app nrf52840dk_nrf52840 (read/write) 497323 497323 0 0.0
bss 51824 51824 0 0.0
rodata 45776 45776 0 0.0
text 339436 339436 0 0.0
pump-app nrf52840dk_nrf52840 (read/write) 844023 844023 0 0.0
bss 110428 110428 0 0.0
rodata 94952 94952 0 0.0
text 563124 563124 0 0.0
pump-controller-app nrf52840dk_nrf52840 (read/write) 837783 837783 0 0.0
bss 110328 110328 0 0.0
rodata 93240 93240 0 0.0
text 558696 558696 0 0.0
shell nrf52840dk_nrf52840 (read/write) 775899 775899 0 0.0
bss 109080 109080 0 0.0
rodata 72496 72496 0 0.0
text 519736 519736 0 0.0
nrf5340dk_nrf5340_cpuapp (read/write) 690938 690938 0 0.0
bss 110060 110060 0 0.0
rodata 67140 67140 0 0.0
text 440328 440328 0 0.0
p6 all-clusters-app default (read/write) 2300072 2300072 0 0.0
.bss 106840 106840 0 0.0
.data 2520 2520 0 0.0
.heap 923984 923984 0 0.0
.text 1258336 1258336 0 0.0
lock-app default (read/write) 2212784 2212784 0 0.0
.bss 95648 95648 0 0.0
.data 2392 2392 0 0.0
.heap 935304 935304 0 0.0
.text 1171048 1171048 0 0.0
qpg lighting-app qpg6100+debug (read only) 490532 490532 0 0.0
(read/write) 114140 114140 0 0.0
.bss 50944 50944 0 0.0
.data 1004 1004 0 0.0
.text 485212 485212 0 0.0
lock-app qpg6100+debug (read only) 466872 466872 0 0.0
(read/write) 114144 114144 0 0.0
.bss 49888 49888 0 0.0
.data 960 960 0 0.0
.text 461552 461552 0 0.0
persistent-storage-app qpg6100+debug (read only) 153212 153212 0 0.0
(read/write) 114140 114140 0 0.0
.bss 18912 18912 0 0.0
.data 356 356 0 0.0
.text 147892 147892 0 0.0
telink lighting-app tlsr9518adk80d (read/write) 662870 662870 0 0.0
bss 69072 69072 0 0.0
noinit 33216 33216 0 0.0
text 457962 457962 0 0.0

@andy31415
Copy link
Contributor

Fast track: this updates tests.

@bzbarsky-apple @kghost - could you review timeout comments? I believe for unit tests (which these cpp files seem to be using) 5 seconds should be a very long time.

Copy link
Contributor

@bzbarsky-apple bzbarsky-apple left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

OK, let's try this, and if we end up with CI instability we can think about raising the timeout....

@bzbarsky-apple bzbarsky-apple merged commit 3a337fd into project-chip:master Nov 5, 2021
PSONALl pushed a commit to PSONALl/connectedhomeip that referenced this pull request Dec 3, 2021
* Add async message dispatch to loopback

This PR was triggered by some test failures in some of the end-to-end IM
unit tests that utilized the loopback transport to send/receive payloads
from client to server and back. Since the current loopback transport
processes 'transmitted' messages synchronously without completing the
execution of the original context, it results in call flows that are not
typical of actual devices interacting with each other. This resulted in
a use-after-free error where the upon calling SendMessage() within the
CommandSender, the synchronous execution resulted in the eventual
destruction of the original CommandSender object immediately after
SendMessage() was called.

This PR adds support for asynchronous dispatch and handling of
transmitted messages that is more representative of real-world CHIP
node interactions to the existing loopback interface. It utilizes
SystemLayer::ScheduleWork to handle the processing of the sent message
as a bottom half handler.

It also adds a DrainAndServiceIO method on the AppContext that will
automatically drain and service the IO till all messages have been
handled.

Tests:
- Ensured the TestCommand failure doesn't happen again.

* Apply suggestions from code review

Co-authored-by: Boris Zbarsky <[email protected]>

Co-authored-by: Boris Zbarsky <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants