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 initial support for GRPC++ #568

Merged
merged 21 commits into from
Jun 20, 2024
Merged

Add initial support for GRPC++ #568

merged 21 commits into from
Jun 20, 2024

Conversation

victimsnino
Copy link
Owner

@victimsnino victimsnino commented May 3, 2024

Add client-side grpc support

@victimsnino victimsnino force-pushed the feature/grpc branch 10 times, most recently from 308b13d to 1ca7555 Compare May 13, 2024 20:07
Copy link
Contributor

github-actions bot commented May 14, 2024

BENCHMARK RESULTS (AUTOGENERATED)

ci-ubuntu-gcc

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 309.78 ns 2.19 ns 2.17 ns 1.01
Subscribe empty callbacks to empty observable via pipe operator 306.06 ns 2.19 ns 2.16 ns 1.01

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 693.38 ns 0.31 ns 0.31 ns 1.00
from array of 1 - create + subscribe + current_thread 1063.75 ns 3.70 ns 3.70 ns 1.00
concat_as_source of just(1 immediate) create + subscribe 2374.78 ns 117.75 ns 127.85 ns 0.92
defer from array of 1 - defer + create + subscribe + immediate 741.88 ns 0.31 ns 0.31 ns 1.00
interval - interval + take(3) + subscribe + immediate 2108.98 ns 59.19 ns 59.19 ns 1.00
interval - interval + take(3) + subscribe + current_thread 2990.56 ns 32.42 ns 32.40 ns 1.00
from array of 1 - create + as_blocking + subscribe + new_thread 26858.17 ns 28030.54 ns 29409.08 ns 0.95
from array of 1000 - create + as_blocking + subscribe + new_thread 38212.20 ns 51634.05 ns 52331.52 ns 0.99
concat_as_source of just(1 immediate) and just(1,2 immediate)create + subscribe 3577.62 ns 139.63 ns 151.32 ns 0.92

Filtering Operators

name rxcpp rpp prev rpp ratio
immediate_just+take(1)+subscribe 1096.71 ns 0.31 ns 0.31 ns 1.00
immediate_just+filter(true)+subscribe 868.36 ns 0.31 ns 0.31 ns 1.00
immediate_just(1,2)+skip(1)+subscribe 1063.99 ns 0.31 ns 0.31 ns 1.00
immediate_just(1,1,2)+distinct_until_changed()+subscribe 918.43 ns 0.31 ns 0.31 ns 1.00
immediate_just(1,2)+first()+subscribe 1245.21 ns 0.31 ns 0.31 ns 1.00
immediate_just(1,2)+last()+subscribe 976.99 ns 0.31 ns 0.31 ns 1.00
immediate_just+take_last(1)+subscribe 1142.05 ns 17.91 ns 18.20 ns 0.98

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 290.50 ns 2.16 ns 2.18 ns 0.99
current_thread scheduler create worker + schedule 370.23 ns 6.18 ns 6.17 ns 1.00
current_thread scheduler create worker + schedule + recursive schedule 821.69 ns 56.31 ns 58.64 ns 0.96

Transforming Operators

name rxcpp rpp prev rpp ratio
immediate_just+map(v*2)+subscribe 878.76 ns 0.31 ns 0.31 ns 1.00
immediate_just+scan(10, std::plus)+subscribe 934.82 ns 0.31 ns 0.31 ns 1.00
immediate_just+flat_map(immediate_just(v*2))+subscribe 2435.69 ns 166.97 ns 163.65 ns 1.02
immediate_just+buffer(2)+subscribe 1523.96 ns 13.59 ns 13.58 ns 1.00
immediate_just+window(2)+subscribe + subscsribe inner 2466.67 ns 1083.05 ns 1080.03 ns 1.00

Conditional Operators

name rxcpp rpp prev rpp ratio
immediate_just+take_while(false)+subscribe 854.16 ns - - 0.00
immediate_just+take_while(true)+subscribe 868.60 ns 0.31 ns 0.31 ns 1.00

Utility Operators

name rxcpp rpp prev rpp ratio
immediate_just(1)+subscribe_on(immediate)+subscribe 1997.10 ns 0.31 ns 0.31 ns 1.00

Combining Operators

name rxcpp rpp prev rpp ratio
immediate_just(immediate_just(1), immediate_just(1)) + merge() + subscribe 3491.42 ns 173.52 ns 173.86 ns 1.00
immediate_just(1) + merge_with(immediate_just(2)) + subscribe 3726.27 ns 167.02 ns 166.69 ns 1.00
immediate_just(1) + with_latest_from(immediate_just(2)) + subscribe - 131.39 ns 129.04 ns 1.02
immediate_just(immediate_just(1),immediate_just(1)) + switch_on_next() + subscribe 3628.55 ns 981.21 ns 1005.48 ns 0.98
immediate_just(1) + zip(immediate_just(2)) + subscribe 2155.48 ns 203.52 ns 211.72 ns 0.96

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 34.55 ns 14.64 ns 14.77 ns 0.99
subscribe 100 observers to publish_subject 198840.40 ns 15407.18 ns 16386.17 ns 0.94
100 on_next to 100 observers to publish_subject 27002.67 ns 17207.60 ns 17168.30 ns 1.00

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 1395.51 ns 13.27 ns 13.27 ns 1.00
basic sample with immediate scheduler 1410.28 ns 5.55 ns 5.55 ns 1.00

Aggregating Operators

name rxcpp rpp prev rpp ratio
immediate_just+reduce(10, std::plus)+subscribe 937.85 ns 0.31 ns 0.31 ns 1.00

Error Handling Operators

name rxcpp rpp prev rpp ratio
create(on_next(1), on_error())+on_error_resume_next(immediate_just(2)))+subscribe 2065.31 ns 1008.90 ns 984.85 ns 1.02

ci-macos

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 1095.50 ns 4.09 ns 3.96 ns 1.03
Subscribe empty callbacks to empty observable via pipe operator 1059.78 ns 4.14 ns 5.22 ns 0.79

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 2546.12 ns 0.28 ns 0.51 ns 0.55
from array of 1 - create + subscribe + current_thread 2830.31 ns 33.83 ns 39.54 ns 0.86
concat_as_source of just(1 immediate) create + subscribe 6682.65 ns 381.99 ns 461.87 ns 0.83
defer from array of 1 - defer + create + subscribe + immediate 2243.85 ns 0.27 ns 0.51 ns 0.52
interval - interval + take(3) + subscribe + immediate 5749.87 ns 127.57 ns 146.19 ns 0.87
interval - interval + take(3) + subscribe + current_thread 6689.98 ns 102.57 ns 110.55 ns 0.93
from array of 1 - create + as_blocking + subscribe + new_thread 97223.25 ns 92774.00 ns 93640.92 ns 0.99
from array of 1000 - create + as_blocking + subscribe + new_thread 104694.67 ns 103803.45 ns 101866.00 ns 1.02
concat_as_source of just(1 immediate) and just(1,2 immediate)create + subscribe 10045.01 ns 435.25 ns 387.14 ns 1.12

Filtering Operators

name rxcpp rpp prev rpp ratio
immediate_just+take(1)+subscribe 3081.51 ns 0.25 ns 0.28 ns 0.88
immediate_just+filter(true)+subscribe 2262.91 ns 0.25 ns 0.25 ns 0.99
immediate_just(1,2)+skip(1)+subscribe 2948.24 ns 0.25 ns 0.25 ns 1.00
immediate_just(1,1,2)+distinct_until_changed()+subscribe 2233.86 ns 0.49 ns 0.49 ns 1.00
immediate_just(1,2)+first()+subscribe 3452.81 ns 0.25 ns 0.51 ns 0.48
immediate_just(1,2)+last()+subscribe 2555.90 ns 0.25 ns 0.51 ns 0.48
immediate_just+take_last(1)+subscribe 3278.17 ns 73.40 ns 128.02 ns 0.57

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 909.62 ns 4.37 ns 6.71 ns 0.65
current_thread scheduler create worker + schedule 1347.00 ns 39.72 ns 47.26 ns 0.84
current_thread scheduler create worker + schedule + recursive schedule 2304.49 ns 241.31 ns 211.42 ns 1.14

Transforming Operators

name rxcpp rpp prev rpp ratio
immediate_just+map(v*2)+subscribe 2493.27 ns 4.54 ns 4.35 ns 1.04
immediate_just+scan(10, std::plus)+subscribe 2793.08 ns 0.55 ns 0.87 ns 0.63
immediate_just+flat_map(immediate_just(v*2))+subscribe 6380.76 ns 488.64 ns 499.47 ns 0.98
immediate_just+buffer(2)+subscribe 3090.51 ns 76.77 ns 111.54 ns 0.69
immediate_just+window(2)+subscribe + subscsribe inner 6908.75 ns 3008.49 ns 2508.37 ns 1.20

Conditional Operators

name rxcpp rpp prev rpp ratio
immediate_just+take_while(false)+subscribe 2598.11 ns - - 0.00
immediate_just+take_while(true)+subscribe 2288.58 ns 0.29 ns 0.24 ns 1.19

Utility Operators

name rxcpp rpp prev rpp ratio
immediate_just(1)+subscribe_on(immediate)+subscribe 5349.52 ns 5.18 ns 5.15 ns 1.01

Combining Operators

name rxcpp rpp prev rpp ratio
immediate_just(immediate_just(1), immediate_just(1)) + merge() + subscribe 8471.91 ns 481.15 ns 654.20 ns 0.74
immediate_just(1) + merge_with(immediate_just(2)) + subscribe 10125.04 ns 507.88 ns 633.26 ns 0.80
immediate_just(1) + with_latest_from(immediate_just(2)) + subscribe - 557.80 ns 666.76 ns 0.84
immediate_just(immediate_just(1),immediate_just(1)) + switch_on_next() + subscribe 9804.80 ns 2309.25 ns 2340.20 ns 0.99
immediate_just(1) + zip(immediate_just(2)) + subscribe 6116.53 ns 993.21 ns 1108.33 ns 0.90

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 81.44 ns 53.05 ns 51.64 ns 1.03
subscribe 100 observers to publish_subject 382036.67 ns 44447.29 ns 43133.37 ns 1.03
100 on_next to 100 observers to publish_subject 62682.41 ns 20503.33 ns 19649.03 ns 1.04

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 3039.37 ns 71.88 ns 71.66 ns 1.00
basic sample with immediate scheduler 3021.53 ns 19.44 ns 19.19 ns 1.01

Aggregating Operators

name rxcpp rpp prev rpp ratio
immediate_just+reduce(10, std::plus)+subscribe 2554.27 ns 0.25 ns 0.25 ns 1.01

Error Handling Operators

name rxcpp rpp prev rpp ratio
create(on_next(1), on_error())+on_error_resume_next(immediate_just(2)))+subscribe 7557.14 ns 4749.68 ns 4387.47 ns 1.08

ci-ubuntu-clang

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 267.24 ns 1.56 ns 0.88 ns 1.78
Subscribe empty callbacks to empty observable via pipe operator 271.36 ns 1.56 ns 0.88 ns 1.78

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 558.41 ns 0.31 ns 0.31 ns 1.00
from array of 1 - create + subscribe + current_thread 786.96 ns 4.32 ns 4.32 ns 1.00
concat_as_source of just(1 immediate) create + subscribe 2382.39 ns 135.35 ns 135.64 ns 1.00
defer from array of 1 - defer + create + subscribe + immediate 781.54 ns 0.31 ns 0.31 ns 1.00
interval - interval + take(3) + subscribe + immediate 2214.73 ns 58.31 ns 58.26 ns 1.00
interval - interval + take(3) + subscribe + current_thread 3245.67 ns 30.89 ns 30.86 ns 1.00
from array of 1 - create + as_blocking + subscribe + new_thread 29981.20 ns 27843.31 ns 28036.07 ns 0.99
from array of 1000 - create + as_blocking + subscribe + new_thread 37957.40 ns 35472.62 ns 35753.89 ns 0.99
concat_as_source of just(1 immediate) and just(1,2 immediate)create + subscribe 3663.05 ns 158.35 ns 158.87 ns 1.00

Filtering Operators

name rxcpp rpp prev rpp ratio
immediate_just+take(1)+subscribe 1160.20 ns 0.31 ns 0.31 ns 1.00
immediate_just+filter(true)+subscribe 852.47 ns 0.31 ns 0.31 ns 1.00
immediate_just(1,2)+skip(1)+subscribe 1086.87 ns 0.31 ns 0.31 ns 1.00
immediate_just(1,1,2)+distinct_until_changed()+subscribe 860.63 ns 0.62 ns 0.62 ns 1.00
immediate_just(1,2)+first()+subscribe 1377.04 ns 0.31 ns 0.31 ns 1.00
immediate_just(1,2)+last()+subscribe 1021.03 ns 0.31 ns 0.31 ns 1.00
immediate_just+take_last(1)+subscribe 1187.10 ns 0.31 ns 0.31 ns 1.00

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 282.15 ns 1.56 ns 0.88 ns 1.78
current_thread scheduler create worker + schedule 392.96 ns 4.63 ns 4.63 ns 1.00
current_thread scheduler create worker + schedule + recursive schedule 851.49 ns 56.15 ns 55.98 ns 1.00

Transforming Operators

name rxcpp rpp prev rpp ratio
immediate_just+map(v*2)+subscribe 850.10 ns 0.31 ns 0.31 ns 1.00
immediate_just+scan(10, std::plus)+subscribe 975.61 ns 0.31 ns 0.31 ns 1.00
immediate_just+flat_map(immediate_just(v*2))+subscribe 2287.68 ns 140.37 ns 146.90 ns 0.96
immediate_just+buffer(2)+subscribe 1521.51 ns 14.20 ns 13.89 ns 1.02
immediate_just+window(2)+subscribe + subscsribe inner 2448.44 ns 932.24 ns 926.07 ns 1.01

Conditional Operators

name rxcpp rpp prev rpp ratio
immediate_just+take_while(false)+subscribe 835.94 ns - - 0.00
immediate_just+take_while(true)+subscribe 849.43 ns 0.31 ns 0.31 ns 1.00

Utility Operators

name rxcpp rpp prev rpp ratio
immediate_just(1)+subscribe_on(immediate)+subscribe 2008.55 ns 0.31 ns 0.31 ns 1.00

Combining Operators

name rxcpp rpp prev rpp ratio
immediate_just(immediate_just(1), immediate_just(1)) + merge() + subscribe 3312.53 ns 158.40 ns 161.51 ns 0.98
immediate_just(1) + merge_with(immediate_just(2)) + subscribe 3739.62 ns 146.07 ns 146.20 ns 1.00
immediate_just(1) + with_latest_from(immediate_just(2)) + subscribe - 142.49 ns 143.45 ns 0.99
immediate_just(immediate_just(1),immediate_just(1)) + switch_on_next() + subscribe 3378.84 ns 842.90 ns 843.59 ns 1.00
immediate_just(1) + zip(immediate_just(2)) + subscribe 2196.66 ns 209.02 ns 208.42 ns 1.00

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 53.98 ns 17.72 ns 17.70 ns 1.00
subscribe 100 observers to publish_subject 211468.00 ns 16018.48 ns 16051.23 ns 1.00
100 on_next to 100 observers to publish_subject 42741.24 ns 20954.92 ns 20971.61 ns 1.00

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 1310.91 ns 12.04 ns 12.04 ns 1.00
basic sample with immediate scheduler 1304.56 ns 5.86 ns 5.86 ns 1.00

Aggregating Operators

name rxcpp rpp prev rpp ratio
immediate_just+reduce(10, std::plus)+subscribe 1000.21 ns 0.31 ns 0.31 ns 1.00

Error Handling Operators

name rxcpp rpp prev rpp ratio
create(on_next(1), on_error())+on_error_resume_next(immediate_just(2)))+subscribe 2151.67 ns 1234.33 ns 1214.29 ns 1.02

ci-windows

General

name rxcpp rpp prev rpp ratio
Subscribe empty callbacks to empty observable 561.92 ns 4.94 ns 4.94 ns 1.00
Subscribe empty callbacks to empty observable via pipe operator 580.34 ns 4.94 ns 4.94 ns 1.00

Sources

name rxcpp rpp prev rpp ratio
from array of 1 - create + subscribe + immediate 1162.97 ns 5.86 ns 5.86 ns 1.00
from array of 1 - create + subscribe + current_thread 1446.43 ns 15.13 ns 15.13 ns 1.00
concat_as_source of just(1 immediate) create + subscribe 3718.12 ns 171.17 ns 174.35 ns 0.98
defer from array of 1 - defer + create + subscribe + immediate 1208.08 ns 5.86 ns 5.86 ns 1.00
interval - interval + take(3) + subscribe + immediate 3323.94 ns 133.31 ns 133.32 ns 1.00
interval - interval + take(3) + subscribe + current_thread 3476.70 ns 53.10 ns 52.96 ns 1.00
from array of 1 - create + as_blocking + subscribe + new_thread 117730.00 ns 109390.00 ns 114275.00 ns 0.96
from array of 1000 - create + as_blocking + subscribe + new_thread 125822.22 ns 126066.67 ns 130800.00 ns 0.96
concat_as_source of just(1 immediate) and just(1,2 immediate)create + subscribe 5363.78 ns 204.69 ns 204.97 ns 1.00

Filtering Operators

name rxcpp rpp prev rpp ratio
immediate_just+take(1)+subscribe 1847.61 ns 12.87 ns 12.88 ns 1.00
immediate_just+filter(true)+subscribe 1307.08 ns 12.36 ns 12.35 ns 1.00
immediate_just(1,2)+skip(1)+subscribe 1705.56 ns 13.05 ns 13.01 ns 1.00
immediate_just(1,1,2)+distinct_until_changed()+subscribe 1376.18 ns 15.95 ns 15.95 ns 1.00
immediate_just(1,2)+first()+subscribe 2342.83 ns 12.95 ns 12.96 ns 1.00
immediate_just(1,2)+last()+subscribe 1788.93 ns 13.60 ns 13.61 ns 1.00
immediate_just+take_last(1)+subscribe 2024.40 ns 59.21 ns 59.61 ns 0.99

Schedulers

name rxcpp rpp prev rpp ratio
immediate scheduler create worker + schedule 478.78 ns 6.17 ns 6.17 ns 1.00
current_thread scheduler create worker + schedule 646.44 ns 14.12 ns 14.51 ns 0.97
current_thread scheduler create worker + schedule + recursive schedule 1085.15 ns 107.29 ns 107.19 ns 1.00

Transforming Operators

name rxcpp rpp prev rpp ratio
immediate_just+map(v*2)+subscribe 1324.08 ns 12.33 ns 12.26 ns 1.01
immediate_just+scan(10, std::plus)+subscribe 1426.17 ns 21.59 ns 21.58 ns 1.00
immediate_just+flat_map(immediate_just(v*2))+subscribe 3533.73 ns 202.88 ns 202.25 ns 1.00
immediate_just+buffer(2)+subscribe 2577.33 ns 58.26 ns 59.26 ns 0.98
immediate_just+window(2)+subscribe + subscsribe inner 3973.70 ns 1279.15 ns 1273.07 ns 1.00

Conditional Operators

name rxcpp rpp prev rpp ratio
immediate_just+take_while(false)+subscribe 1324.21 ns 11.41 ns 11.41 ns 1.00
immediate_just+take_while(true)+subscribe 1324.94 ns 12.36 ns 12.37 ns 1.00

Utility Operators

name rxcpp rpp prev rpp ratio
immediate_just(1)+subscribe_on(immediate)+subscribe 3141.10 ns 8.02 ns 8.02 ns 1.00

Combining Operators

name rxcpp rpp prev rpp ratio
immediate_just(immediate_just(1), immediate_just(1)) + merge() + subscribe 5030.59 ns 210.94 ns 210.48 ns 1.00
immediate_just(1) + merge_with(immediate_just(2)) + subscribe 5443.52 ns 220.93 ns 219.58 ns 1.01
immediate_just(1) + with_latest_from(immediate_just(2)) + subscribe - 202.64 ns 198.12 ns 1.02
immediate_just(immediate_just(1),immediate_just(1)) + switch_on_next() + subscribe 5397.44 ns 939.45 ns 926.07 ns 1.01
immediate_just(1) + zip(immediate_just(2)) + subscribe 3609.18 ns 513.53 ns 527.20 ns 0.97

Subjects

name rxcpp rpp prev rpp ratio
publish_subject with 1 observer - on_next 36.70 ns 20.11 ns 20.11 ns 1.00
subscribe 100 observers to publish_subject 263625.00 ns 27402.44 ns 29048.57 ns 0.94
100 on_next to 100 observers to publish_subject 51765.00 ns 32650.00 ns 32648.57 ns 1.00

Scenarios

name rxcpp rpp prev rpp ratio
basic sample 2281.56 ns 57.88 ns 57.59 ns 1.00
basic sample with immediate scheduler 1910.28 ns 38.25 ns 38.25 ns 1.00

Aggregating Operators

name rxcpp rpp prev rpp ratio
immediate_just+reduce(10, std::plus)+subscribe 1858.11 ns 19.97 ns 19.98 ns 1.00

Error Handling Operators

name rxcpp rpp prev rpp ratio
create(on_next(1), on_error())+on_error_resume_next(immediate_just(2)))+subscribe 1951.54 ns 339.06 ns 340.46 ns 1.00

Copy link
Contributor

@CorentinBT CorentinBT left a comment

Choose a reason for hiding this comment

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

Something to maybe consider is support for task cancellation. A grpc client context has a TryCancel method that could be called during early on_completed/on_error calls, allowing early termination on server side.

src/extensions/rppgrpc/rppgrpc/client_reactor.hpp Outdated Show resolved Hide resolved
src/extensions/rppgrpc/rppgrpc/utils/exceptions.hpp Outdated Show resolved Hide resolved
src/extensions/rppgrpc/rppgrpc/client_reactor.hpp Outdated Show resolved Hide resolved
src/extensions/rppgrpc/rppgrpc/server_reactor.hpp Outdated Show resolved Hide resolved
src/tests/CMakeLists.txt Outdated Show resolved Hide resolved
src/tests/utils/fakeit.hpp Outdated Show resolved Hide resolved
@victimsnino
Copy link
Owner Author

victimsnino commented May 21, 2024

Something to maybe consider is support for task cancellation. A grpc client context has a TryCancel method that could be called during early on_completed/on_error calls, allowing early termination on server side.

@CorentinBT , Hmmmm, good idea, but loos like callback api doesn't have it. Only server could call Finish with not OK status

@victimsnino victimsnino force-pushed the feature/grpc branch 2 times, most recently from 5803244 to f589fc6 Compare May 28, 2024 19:50
@victimsnino victimsnino changed the title Add support for GRPC++ Add initial support for GRPC++ Jun 19, 2024
Copy link

sonarcloud bot commented Jun 20, 2024

Quality Gate Failed Quality Gate failed

Failed conditions
13.8% Duplication on New Code (required ≤ 3%)

See analysis details on SonarCloud

@victimsnino victimsnino marked this pull request as ready for review June 20, 2024 07:31
@victimsnino victimsnino merged commit 973c278 into v2 Jun 20, 2024
34 of 35 checks passed
@victimsnino victimsnino deleted the feature/grpc branch June 20, 2024 07:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants