From f52cf32e563aa7f5d60c25b25d35cff24835753e Mon Sep 17 00:00:00 2001 From: wehub-resource-sync Date: Mon, 13 Jul 2026 13:29:29 +0800 Subject: [PATCH] chore: import upstream snapshot with attribution --- AGENTS.md | 62 + BUILD.bazel | 582 ++ CHANGES.md | 61 + CLAUDE.md | 123 + CMakeLists.txt | 654 ++ CODE_OF_CONDUCT.md | 46 + CONTRIBUTING.md | 29 + MODULE.bazel | 54 + README.md | 117 + README.wehub.md | 7 + README_cn.md | 124 + SECURITY.md | 13 + THREAT_MODEL.md | 627 ++ WORKSPACE.bzlmod | 0 bazel/BUILD.bazel | 26 + bazel/config/BUILD.bazel | 152 + bazel/third_party/BUILD.bazel | 17 + bazel/third_party/crc32c/BUILD.bazel | 17 + bazel/third_party/crc32c/crc32c.BUILD | 93 + bazel/third_party/event/BUILD.bazel | 17 + bazel/third_party/event/event.BUILD | 59 + .../0001-mark-override-resolve-warning.patch | 36 + bazel/third_party/glog/BUILD.bazel | 17 + bazel/third_party/leveldb/BUILD.bazel | 21 + bazel/third_party/leveldb/leveldb.BUILD | 72 + bazel/third_party/leveldb/port.h | 34 + bazel/third_party/leveldb/port_config.h | 38 + bazel/third_party/openssl/BUILD.bazel | 17 + bazel/third_party/openssl/openssl.BUILD | 165 + bazel/third_party/protobuf/BUILD.bazel | 17 + bazel/third_party/protobuf/protobuf.BUILD | 498 ++ bazel/third_party/snappy/BUILD.bazel | 17 + bazel/third_party/snappy/snappy.BUILD | 122 + bazel/third_party/thrift/BUILD.bazel | 17 + bazel/third_party/thrift/thrift.BUILD | 75 + bazel/third_party/zlib/BUILD.bazel | 17 + bazel/third_party/zlib/zlib.BUILD | 111 + bazel/tools/BUILD.bazel | 23 + bazel/tools/brpc_proto_library.bzl | 138 + bazel/tools/proto_gen.bzl | 240 + cmake/CMakeLists.download_gtest.in | 30 + cmake/CompileProto.cmake | 34 + cmake/FindBoringSSL.cmake | 77 + cmake/FindGFLAGS.cmake | 41 + cmake/FindGperftools.cmake | 66 + cmake/SetupGtest.cmake | 39 + cmake/brpc.pc.in | 26 + community/apache-package-validator.sh | 94 + community/cases.md | 130 + community/logo-bRPC.svg | 1 + community/newcommitter_cn.md | 68 + community/newcommitter_en.md | 60 + community/oncall.md | 71 + community/release_cn.md | 592 ++ community/release_en.md | 595 ++ community/release_schedule.md | 27 + community/releasecheck.md | 54 + community/releasecheck.png | Bin 0 -> 251728 bytes community/releasefail.png | Bin 0 -> 228365 bytes config.h.in | 24 + config_brpc.sh | 673 ++ docs/cn/atomic_instructions.md | 107 + docs/cn/auto_concurrency_limiter.md | 174 + docs/cn/avalanche.md | 21 + docs/cn/backup_request.md | 120 + docs/cn/baidu_std.md | 159 + docs/cn/bazel_support.md | 20 + docs/cn/benchmark.md | 221 + docs/cn/benchmark_http.md | 5 + docs/cn/brpc_intro.pptx | Bin 0 -> 1715846 bytes docs/cn/bthread.md | 66 + docs/cn/bthread_id.md | 36 + docs/cn/bthread_or_not.md | 59 + docs/cn/bthread_tagged_task_group.md | 53 + docs/cn/bthread_tracer.md | 217 + docs/cn/builtin_service.md | 57 + docs/cn/bvar.md | 80 + docs/cn/bvar_c++.md | 658 ++ docs/cn/case_apicontrol.md | 50 + docs/cn/case_baidu_dsp.md | 23 + docs/cn/case_elf.md | 87 + docs/cn/case_ubrpc.md | 45 + docs/cn/circuit_breaker.md | 65 + docs/cn/client.md | 1028 +++ docs/cn/combo_channel.md | 509 ++ docs/cn/connections.md | 52 + docs/cn/consistent_hashing.md | 41 + docs/cn/contention_profiler.md | 31 + docs/cn/coroutine.md | 193 + docs/cn/couchbase_example.md | 5 + docs/cn/cpu_profiler.md | 119 + docs/cn/dummy_server.md | 24 + docs/cn/endpoint.md | 61 + docs/cn/error_code.md | 81 + docs/cn/execution_queue.md | 219 + docs/cn/flags.md | 137 + docs/cn/flatmap.md | 179 + docs/cn/getting_started.md | 401 ++ docs/cn/heap_profiler.md | 169 + docs/cn/http_client.md | 259 + docs/cn/http_derivatives.md | 37 + docs/cn/http_service.md | 385 ++ docs/cn/io.md | 51 + docs/cn/iobuf.md | 103 + docs/cn/json2pb.md | 141 + docs/cn/lalb.md | 151 + docs/cn/load_balancing.md | 47 + docs/cn/mbvar_c++.md | 922 +++ docs/cn/memcache_client.md | 102 + docs/cn/memory_management.md | 46 + docs/cn/mysql_client.md | 556 ++ docs/cn/new_protocol.md | 156 + docs/cn/nshead_service.md | 230 + docs/cn/overview.md | 93 + docs/cn/parallel_http.md | 1 + docs/cn/rdma.md | 90 + docs/cn/redis_client.md | 320 + docs/cn/rpc_press.md | 111 + docs/cn/rpc_replay.md | 110 + docs/cn/rpc_view.md | 37 + docs/cn/rpcz.md | 79 + docs/cn/sanitizers.md | 50 + docs/cn/server.md | 1117 ++++ docs/cn/server_debugging.md | 161 + docs/cn/server_push.md | 28 + docs/cn/status.md | 37 + docs/cn/streaming_log.md | 280 + docs/cn/streaming_rpc.md | 153 + docs/cn/thread_local.md | 64 + docs/cn/threading_overview.md | 45 + docs/cn/thrift.md | 147 + docs/cn/timeout_concurrency_limiter.md | 25 + docs/cn/timer_keeping.md | 55 + docs/cn/ub_client.md | 370 ++ docs/cn/vars.md | 101 + docs/cn/wireshark_baidu_std.md | 27 + docs/en/atomic_instructions.md | 107 + docs/en/auto_concurrency_limiter.md | 7 + docs/en/avalanche.md | 5 + docs/en/backup_request.md | 120 + docs/en/baidu_std.md | 7 + docs/en/bazel_support.md | 20 + docs/en/benchmark.md | 7 + docs/en/benchmark_http.md | 7 + docs/en/brpc_internal.pptx | Bin 0 -> 448900 bytes docs/en/bthread.md | 7 + docs/en/bthread_id.md | 7 + docs/en/bthread_or_not.md | 7 + docs/en/bthread_tagged_task_group.md | 7 + docs/en/bthread_tracer.md | 7 + docs/en/builtin_service.md | 59 + docs/en/bvar.md | 81 + docs/en/bvar_c++.md | 498 ++ docs/en/case_apicontrol.md | 7 + docs/en/case_baidu_dsp.md | 7 + docs/en/case_elf.md | 7 + docs/en/case_ubrpc.md | 7 + docs/en/circuit_breaker.md | 7 + docs/en/client.md | 929 +++ docs/en/combo_channel.md | 519 ++ docs/en/connections.md | 7 + docs/en/consistent_hashing.md | 7 + docs/en/contention_profiler.md | 7 + docs/en/coroutine.md | 7 + docs/en/couchbase_example.md | 1209 ++++ docs/en/cpu_profiler.md | 7 + docs/en/dummy_server.md | 24 + docs/en/endpoint.md | 7 + docs/en/error_code.md | 88 + docs/en/execution_queue.md | 7 + docs/en/flags.md | 7 + docs/en/flatmap.md | 7 + docs/en/getting_started.md | 396 ++ docs/en/heap_profiler.md | 7 + docs/en/http_client.md | 263 + docs/en/http_derivatives.md | 37 + docs/en/http_service.md | 386 ++ docs/en/io.md | 51 + docs/en/iobuf.md | 103 + docs/en/json2pb.md | 7 + docs/en/lalb.md | 22 + docs/en/load_balancing.md | 7 + docs/en/mbvar_c++.md | 7 + docs/en/memcache_client.md | 102 + docs/en/memory_management.md | 7 + docs/en/new_protocol.md | 153 + docs/en/nshead_service.md | 7 + docs/en/overview.md | 91 + docs/en/parallel_http.md | 7 + docs/en/rdma.md | 88 + docs/en/redis_client.md | 321 + docs/en/rpc_press.md | 7 + docs/en/rpc_replay.md | 7 + docs/en/rpc_view.md | 7 + docs/en/rpcz.md | 7 + docs/en/sanitizers.md | 7 + docs/en/server.md | 1113 ++++ docs/en/server_debugging.md | 161 + docs/en/server_push.md | 28 + docs/en/status.md | 37 + docs/en/streaming_log.md | 283 + docs/en/streaming_rpc.md | 155 + docs/en/thread_local.md | 7 + docs/en/threading_overview.md | 45 + docs/en/thrift.md | 146 + docs/en/timeout_concurrency_limiter.md | 7 + docs/en/timer_keeping.md | 7 + docs/en/tutorial_on_building_services.pptx | Bin 0 -> 1851084 bytes docs/en/ub_client.md | 7 + docs/en/vars.md | 101 + docs/en/wireshark_baidu_std.md | 27 + docs/images/302.png | Bin 0 -> 32213 bytes docs/images/apicontrol_compare_1.png | Bin 0 -> 31584 bytes docs/images/apicontrol_compare_2.png | Bin 0 -> 39964 bytes docs/images/apicontrol_compare_3.png | Bin 0 -> 25322 bytes docs/images/apicontrol_compare_4.png | Bin 0 -> 32399 bytes docs/images/apicontrol_compare_5.png | Bin 0 -> 10546 bytes docs/images/backup_request_1.png | Bin 0 -> 22198 bytes docs/images/backup_request_2.png | Bin 0 -> 45644 bytes docs/images/backup_request_3.png | Bin 0 -> 30140 bytes docs/images/backup_request_4.png | Bin 0 -> 21024 bytes docs/images/baidu_dsp_compare_1.png | Bin 0 -> 35908 bytes docs/images/baidu_dsp_compare_10.png | Bin 0 -> 31382 bytes docs/images/baidu_dsp_compare_2.png | Bin 0 -> 36011 bytes docs/images/baidu_dsp_compare_3.png | Bin 0 -> 35498 bytes docs/images/baidu_dsp_compare_4.png | Bin 0 -> 28475 bytes docs/images/baidu_dsp_compare_5.png | Bin 0 -> 48125 bytes docs/images/baidu_dsp_compare_6.png | Bin 0 -> 38226 bytes docs/images/baidu_dsp_compare_7.png | Bin 0 -> 30661 bytes docs/images/baidu_dsp_compare_8.png | Bin 0 -> 30800 bytes docs/images/baidu_dsp_compare_9.png | Bin 0 -> 32526 bytes docs/images/bthread_concurrency_1.png | Bin 0 -> 35166 bytes docs/images/bthread_concurrency_2.png | Bin 0 -> 18192 bytes docs/images/bthread_concurrency_3.png | Bin 0 -> 4265 bytes docs/images/bthread_creation_qps.png | Bin 0 -> 23590 bytes docs/images/bthread_status_model.svg | 3 + docs/images/bthread_stb_model.svg | 3 + docs/images/bthread_tagged_increment_all.png | Bin 0 -> 179089 bytes docs/images/bthread_tagged_increment_tag1.png | Bin 0 -> 178168 bytes docs/images/bthread_tagged_worker_usage.png | Bin 0 -> 190384 bytes docs/images/builtin_service_from_console.png | Bin 0 -> 127971 bytes docs/images/builtin_service_more.png | Bin 0 -> 72208 bytes docs/images/bvar_dump_flags.png | Bin 0 -> 31152 bytes docs/images/bvar_dump_flags_2.png | Bin 0 -> 34488 bytes docs/images/bvar_flow.png | Bin 0 -> 9252 bytes docs/images/bvar_noah1.png | Bin 0 -> 32722 bytes docs/images/bvar_noah2.png | Bin 0 -> 20280 bytes docs/images/bvar_noah3.png | Bin 0 -> 25759 bytes docs/images/bvar_perf.png | Bin 0 -> 106239 bytes docs/images/chash.png | Bin 0 -> 20446 bytes docs/images/client_side.png | Bin 0 -> 42131 bytes docs/images/cmd_jeprof_text.png | Bin 0 -> 374689 bytes docs/images/connection_timedout.png | Bin 0 -> 185600 bytes docs/images/curl_jeprof_flamegraph.png | Bin 0 -> 777258 bytes docs/images/curl_jeprof_svg.png | Bin 0 -> 346446 bytes docs/images/curl_jeprof_text.png | Bin 0 -> 484854 bytes docs/images/dummy_server_1.png | Bin 0 -> 1988 bytes docs/images/dummy_server_2.png | Bin 0 -> 30010 bytes docs/images/dummy_server_3.png | Bin 0 -> 37915 bytes docs/images/echo_cpu_profiling.png | Bin 0 -> 250029 bytes docs/images/flag_setvalue.png | Bin 0 -> 10826 bytes docs/images/foobar_bvar.png | Bin 0 -> 58629 bytes docs/images/foobar_latency_cdf.png | Bin 0 -> 16830 bytes docs/images/full_worker_usage.png | Bin 0 -> 23286 bytes docs/images/full_worker_usage_2.png | Bin 0 -> 26680 bytes docs/images/growth_profiler.png | Bin 0 -> 170350 bytes docs/images/health_service.png | Bin 0 -> 6521 bytes docs/images/heap_profiler_1.png | Bin 0 -> 201040 bytes docs/images/heap_profiler_2.png | Bin 0 -> 126084 bytes docs/images/heap_profiler_3.gif | Bin 0 -> 2247904 bytes docs/images/high_cpu_usage.png | Bin 0 -> 24193 bytes docs/images/je_stats_print.png | Bin 0 -> 253493 bytes docs/images/lalb_1.png | Bin 0 -> 15250 bytes docs/images/lalb_2.png | Bin 0 -> 1165962 bytes docs/images/lalb_3.png | Bin 0 -> 840918 bytes docs/images/lalb_4.png | Bin 0 -> 3025 bytes docs/images/lalb_5.png | Bin 0 -> 2994 bytes docs/images/latency_cdf.png | Bin 0 -> 77892 bytes docs/images/lb.png | Bin 0 -> 6167 bytes docs/images/logo-white.png | Bin 0 -> 9721 bytes docs/images/logo.png | Bin 0 -> 10115 bytes docs/images/multi_client_latency_cdf.png | Bin 0 -> 89313 bytes docs/images/multi_server_latency_cdf.png | Bin 0 -> 82956 bytes docs/images/normal_cpu_usage.png | Bin 0 -> 27189 bytes docs/images/normal_worker_usage.png | Bin 0 -> 26899 bytes docs/images/ns.png | Bin 0 -> 5942 bytes docs/images/ns_access_interval.png | Bin 0 -> 37332 bytes docs/images/ns_filter.jpg | Bin 0 -> 11648 bytes docs/images/pchan.png | Bin 0 -> 21250 bytes docs/images/pooled_conn.png | Bin 0 -> 21428 bytes docs/images/protobufs_service.png | Bin 0 -> 22602 bytes docs/images/qps_vs_multi_client.png | Bin 0 -> 90134 bytes docs/images/qps_vs_reqsize.png | Bin 0 -> 118079 bytes docs/images/qps_vs_threadnum.png | Bin 0 -> 95901 bytes docs/images/raft_contention_1.png | Bin 0 -> 896576 bytes docs/images/raft_contention_2.png | Bin 0 -> 118523 bytes docs/images/raft_contention_3.png | Bin 0 -> 113155 bytes docs/images/register_lb.png | Bin 0 -> 17384 bytes docs/images/register_ns.png | Bin 0 -> 31870 bytes docs/images/reloadable_flags.png | Bin 0 -> 34324 bytes docs/images/resource_pool.png | Bin 0 -> 9227 bytes docs/images/restful_1.png | Bin 0 -> 13695 bytes docs/images/restful_2.png | Bin 0 -> 14638 bytes docs/images/restful_3.png | Bin 0 -> 33118 bytes docs/images/rpc.png | Bin 0 -> 13643 bytes docs/images/rpc_flow.png | Bin 0 -> 54016 bytes docs/images/rpc_press_1.png | Bin 0 -> 17965 bytes docs/images/rpc_press_2.png | Bin 0 -> 83440 bytes docs/images/rpc_replay_1.png | Bin 0 -> 36288 bytes docs/images/rpc_replay_2.png | Bin 0 -> 6338 bytes docs/images/rpc_replay_3.png | Bin 0 -> 35966 bytes docs/images/rpc_replay_4.png | Bin 0 -> 19835 bytes docs/images/rpc_replay_5.png | Bin 0 -> 77345 bytes docs/images/rpc_view_1.png | Bin 0 -> 79695 bytes docs/images/rpc_view_2.png | Bin 0 -> 92344 bytes docs/images/rpc_view_3.png | Bin 0 -> 135737 bytes docs/images/rpcz.png | Bin 0 -> 200429 bytes docs/images/rpcz_2.png | Bin 0 -> 45268 bytes docs/images/rpcz_3.png | Bin 0 -> 33345 bytes docs/images/rpcz_4.png | Bin 0 -> 12971 bytes docs/images/rpcz_5.png | Bin 0 -> 30211 bytes docs/images/rpcz_6.png | Bin 0 -> 138317 bytes docs/images/rpcz_7.png | Bin 0 -> 191679 bytes docs/images/server_side.png | Bin 0 -> 41706 bytes docs/images/set_flag_invalid_value.png | Bin 0 -> 13154 bytes docs/images/set_flag_reject.png | Bin 0 -> 13692 bytes docs/images/set_flag_with_form.png | Bin 0 -> 17969 bytes docs/images/set_flag_with_form_2.png | Bin 0 -> 18089 bytes docs/images/set_flag_with_form_3.png | Bin 0 -> 8999 bytes docs/images/short_conn.png | Bin 0 -> 17957 bytes docs/images/single_conn.png | Bin 0 -> 20962 bytes docs/images/status.png | Bin 0 -> 138800 bytes docs/images/status_2.png | Bin 0 -> 170832 bytes docs/images/tcmalloc_stuck.png | Bin 0 -> 716744 bytes docs/images/the_r_after_flag.png | Bin 0 -> 7331 bytes docs/images/threading_overview_1.png | Bin 0 -> 25019 bytes docs/images/threading_overview_2.png | Bin 0 -> 31149 bytes docs/images/trace_printf.png | Bin 0 -> 7940 bytes docs/images/twolevel_server_latency_cdf.png | Bin 0 -> 80948 bytes docs/images/ubrpc_compare_1.png | Bin 0 -> 142076 bytes docs/images/ubrpc_compare_2.png | Bin 0 -> 107741 bytes docs/images/vars_1.gif | Bin 0 -> 1117263 bytes docs/images/vars_2.gif | Bin 0 -> 1632482 bytes docs/images/vars_3.gif | Bin 0 -> 1603109 bytes docs/images/vars_4.png | Bin 0 -> 21442 bytes docs/images/vars_5.png | Bin 0 -> 38628 bytes docs/images/vars_6.png | Bin 0 -> 84449 bytes docs/images/vars_7.png | Bin 0 -> 30808 bytes docs/images/version_service.png | Bin 0 -> 8943 bytes docs/images/vlog_service.png | Bin 0 -> 150416 bytes docs/images/wireshark_baidu_std_request.png | Bin 0 -> 88216 bytes docs/images/wireshark_baidu_std_response.png | Bin 0 -> 80784 bytes docs/images/wireshark_folders.png | Bin 0 -> 119784 bytes .../wireshark_protobuf_search_paths.png | Bin 0 -> 133530 bytes docs/images/wireshark_protobuf_settings.png | Bin 0 -> 573273 bytes docs/images/write.png | Bin 0 -> 22661 bytes example/BUILD.bazel | 122 + example/asynchronous_echo_c++/CMakeLists.txt | 110 + example/asynchronous_echo_c++/client.cpp | 110 + example/asynchronous_echo_c++/echo.proto | 33 + example/asynchronous_echo_c++/server.cpp | 118 + .../auto_concurrency_limiter/CMakeLists.txt | 104 + .../auto_concurrency_limiter/cl_test.proto | 61 + example/auto_concurrency_limiter/client.cpp | 247 + .../dummy_server.port | 1 + example/auto_concurrency_limiter/server.cpp | 295 + .../auto_concurrency_limiter/settings.flags | 25 + .../auto_concurrency_limiter/test_case.json | 253 + example/backup_request_c++/CMakeLists.txt | 110 + example/backup_request_c++/client.cpp | 87 + example/backup_request_c++/echo.proto | 33 + example/backup_request_c++/server.cpp | 109 + .../CMakeLists.txt | 105 + .../baidu_proxy_and_generic_call/client.cpp | 94 + .../baidu_proxy_and_generic_call/echo.proto | 33 + .../baidu_proxy_and_generic_call/proxy.cpp | 142 + .../baidu_proxy_and_generic_call/server.cpp | 118 + example/bthread_tag_echo_c++/CMakeLists.txt | 115 + example/bthread_tag_echo_c++/client.cpp | 154 + example/bthread_tag_echo_c++/echo.proto | 33 + example/bthread_tag_echo_c++/server.cpp | 153 + example/build_with_bazel/BUILD.bazel | 29 + example/build_with_bazel/brpc_workspace.bzl | 94 + example/build_with_bazel/leveldb.BUILD | 97 + example/build_with_bazel/openssl.BUILD | 56 + example/build_with_bazel/protobuf.BUILD | 498 ++ example/build_with_bazel/test.cc | 30 + example/build_with_bazel/zlib.BUILD | 110 + example/build_with_old_bazel/BUILD.bazel | 28 + example/build_with_old_bazel/leveldb.BUILD | 97 + example/build_with_old_bazel/openssl.BUILD | 56 + example/build_with_old_bazel/zlib.BUILD | 23 + example/cancel_c++/CMakeLists.txt | 110 + example/cancel_c++/client.cpp | 129 + example/cancel_c++/echo.proto | 33 + example/cancel_c++/server.cpp | 104 + example/cascade_echo_c++/CMakeLists.txt | 109 + example/cascade_echo_c++/client.cpp | 149 + example/cascade_echo_c++/echo.proto | 34 + example/cascade_echo_c++/server.cpp | 139 + example/cmake/BrpcExample.cmake | 75 + example/coroutine/coroutine_server.cpp | 145 + example/coroutine/echo.proto | 34 + example/couchbase_c++/couchbase_client.cpp | 451 ++ .../multithreaded_couchbase_client.cpp | 375 ++ .../traditional_brpc_couchbase_client.cpp | 171 + .../dynamic_partition_echo_c++/CMakeLists.txt | 118 + example/dynamic_partition_echo_c++/client.cpp | 213 + example/dynamic_partition_echo_c++/echo.proto | 33 + example/dynamic_partition_echo_c++/server.cpp | 173 + example/echo_c++/CMakeLists.txt | 110 + example/echo_c++/client.cpp | 97 + example/echo_c++/echo.proto | 33 + example/echo_c++/server.cpp | 140 + example/grpc_c++/CMakeLists.txt | 109 + example/grpc_c++/client.cpp | 86 + example/grpc_c++/helloworld.proto | 38 + example/grpc_c++/server.cpp | 77 + example/http_c++/CMakeLists.txt | 123 + example/http_c++/benchmark_http.cpp | 135 + example/http_c++/cert.pem | 26 + example/http_c++/http.proto | 43 + example/http_c++/http_client.cpp | 86 + example/http_c++/http_server.cpp | 279 + example/http_c++/key.pem | 27 + example/memcache_c++/CMakeLists.txt | 107 + example/memcache_c++/client.cpp | 204 + .../multi_threaded_echo_c++/CMakeLists.txt | 120 + example/multi_threaded_echo_c++/cert.pem | 26 + example/multi_threaded_echo_c++/client.cpp | 159 + example/multi_threaded_echo_c++/echo.proto | 33 + example/multi_threaded_echo_c++/key.pem | 27 + example/multi_threaded_echo_c++/server.cpp | 99 + .../CMakeLists.txt | 115 + .../multi_threaded_echo_fns_c++/client.cpp | 157 + .../multi_threaded_echo_fns_c++/echo.proto | 33 + .../random_kill.sh | 61 + .../multi_threaded_echo_fns_c++/server.cpp | 188 + example/mysql_c++/CMakeLists.txt | 148 + example/mysql_c++/mysql_cli.cpp | 173 + example/mysql_c++/mysql_go_press.go | 80 + example/mysql_c++/mysql_press.cpp | 242 + example/mysql_c++/mysql_stmt.cpp | 205 + example/mysql_c++/mysql_tx.cpp | 121 + example/mysql_c++/mysqlclient_press.cpp | 244 + example/nshead_extension_c++/CMakeLists.txt | 110 + example/nshead_extension_c++/client.cpp | 82 + example/nshead_extension_c++/server.cpp | 71 + .../nshead_pb_extension_c++/CMakeLists.txt | 110 + example/nshead_pb_extension_c++/client.cpp | 82 + example/nshead_pb_extension_c++/echo.proto | 33 + example/nshead_pb_extension_c++/server.cpp | 126 + example/parallel_echo_c++/CMakeLists.txt | 115 + example/parallel_echo_c++/client.cpp | 214 + example/parallel_echo_c++/echo.proto | 33 + example/parallel_echo_c++/server.cpp | 84 + example/partition_echo_c++/CMakeLists.txt | 118 + example/partition_echo_c++/client.cpp | 215 + example/partition_echo_c++/echo.proto | 33 + example/partition_echo_c++/server.cpp | 173 + example/rdma_performance/CMakeLists.txt | 118 + example/rdma_performance/client.cpp | 321 + example/rdma_performance/server.cpp | 97 + example/rdma_performance/test.proto | 33 + example/redis_c++/CMakeLists.txt | 129 + example/redis_c++/redis_cli.cpp | 159 + example/redis_c++/redis_cluster_client.cpp | 119 + example/redis_c++/redis_press.cpp | 188 + example/redis_c++/redis_server.cpp | 219 + example/rpcz_echo_c++/CMakeLists.txt | 111 + example/rpcz_echo_c++/client.cpp | 96 + example/rpcz_echo_c++/echo.proto | 33 + example/rpcz_echo_c++/server.cpp | 171 + example/selective_echo_c++/CMakeLists.txt | 115 + example/selective_echo_c++/client.cpp | 240 + example/selective_echo_c++/echo.proto | 33 + example/selective_echo_c++/server.cpp | 172 + .../CMakeLists.txt | 115 + .../session_data_and_thread_local/client.cpp | 151 + .../session_data_and_thread_local/echo.proto | 33 + .../session_data_and_thread_local/server.cpp | 253 + .../streaming_batch_echo_c++/CMakeLists.txt | 107 + example/streaming_batch_echo_c++/client.cpp | 118 + example/streaming_batch_echo_c++/echo.proto | 33 + example/streaming_batch_echo_c++/server.cpp | 122 + example/streaming_echo_c++/CMakeLists.txt | 110 + example/streaming_echo_c++/client.cpp | 83 + example/streaming_echo_c++/echo.proto | 33 + example/streaming_echo_c++/server.cpp | 113 + example/thrift_extension_c++/README.md | 10 + example/thrift_extension_c++/client.cpp | 88 + example/thrift_extension_c++/client2.cpp | 147 + example/thrift_extension_c++/echo.thrift | 38 + .../thrift_extension_c++/native_client.cpp | 78 + .../thrift_extension_c++/native_server.cpp | 109 + example/thrift_extension_c++/server.cpp | 81 + example/thrift_extension_c++/server2.cpp | 104 + homebrew-formula/protobuf.rb | 100 + package/rpm/brpc.spec | 125 + .../1.8.1.brpc-no-unwind/MODULE.bazel | 21 + .../1.8.1.brpc-no-unwind/overlay/BUILD.bazel | 781 +++ .../1.8.1.brpc-no-unwind/overlay/MODULE.bazel | 21 + .../1.8.1.brpc-no-unwind/presubmit.yml | 18 + .../1.8.1.brpc-no-unwind/source.json | 9 + .../1.8.3.brpc-no-unwind/MODULE.bazel | 21 + .../1.8.3.brpc-no-unwind/overlay/BUILD.bazel | 781 +++ .../1.8.3.brpc-no-unwind/overlay/MODULE.bazel | 21 + .../1.8.3.brpc-no-unwind/presubmit.yml | 18 + .../1.8.3.brpc-no-unwind/source.json | 9 + registry/modules/libunwind/metadata.json | 19 + src/CMakeLists.txt | 106 + src/brpc/acceptor.cpp | 357 ++ src/brpc/acceptor.h | 124 + src/brpc/adaptive_connection_type.cpp | 72 + src/brpc/adaptive_connection_type.h | 70 + src/brpc/adaptive_max_concurrency.cpp | 119 + src/brpc/adaptive_max_concurrency.h | 115 + src/brpc/adaptive_protocol_type.h | 93 + src/brpc/amf.cpp | 1296 ++++ src/brpc/amf.h | 304 + src/brpc/amf_inl.h | 171 + src/brpc/authenticator.h | 98 + src/brpc/backup_request_policy.cpp | 177 + src/brpc/backup_request_policy.h | 80 + src/brpc/baidu_master_service.cpp | 52 + src/brpc/baidu_master_service.h | 108 + src/brpc/builtin/bad_method_service.cpp | 67 + src/brpc/builtin/bad_method_service.h | 39 + src/brpc/builtin/bthreads_service.cpp | 75 + src/brpc/builtin/bthreads_service.h | 38 + src/brpc/builtin/common.cpp | 399 ++ src/brpc/builtin/common.h | 150 + src/brpc/builtin/connections_service.cpp | 411 ++ src/brpc/builtin/connections_service.h | 47 + src/brpc/builtin/dir_service.cpp | 129 + src/brpc/builtin/dir_service.h | 39 + src/brpc/builtin/flags_service.cpp | 257 + src/brpc/builtin/flags_service.h | 46 + src/brpc/builtin/flot_min_js.cpp | 49 + src/brpc/builtin/flot_min_js.h | 37 + src/brpc/builtin/get_favicon_service.cpp | 79 + src/brpc/builtin/get_favicon_service.h | 37 + src/brpc/builtin/get_js_service.cpp | 132 + src/brpc/builtin/get_js_service.h | 56 + .../builtin/grpc_health_check_service.cpp | 41 + src/brpc/builtin/grpc_health_check_service.h | 37 + src/brpc/builtin/health_service.cpp | 44 + src/brpc/builtin/health_service.h | 39 + src/brpc/builtin/hotspots_service.cpp | 1285 ++++ src/brpc/builtin/hotspots_service.h | 90 + src/brpc/builtin/ids_service.cpp | 60 + src/brpc/builtin/ids_service.h | 38 + src/brpc/builtin/index_service.cpp | 176 + src/brpc/builtin/index_service.h | 42 + src/brpc/builtin/jquery_min_js.cpp | 51 + src/brpc/builtin/jquery_min_js.h | 37 + src/brpc/builtin/list_service.cpp | 42 + src/brpc/builtin/list_service.h | 44 + src/brpc/builtin/memory_service.cpp | 93 + src/brpc/builtin/memory_service.h | 36 + src/brpc/builtin/pprof_perl.cpp | 5510 +++++++++++++++++ src/brpc/builtin/pprof_perl.h | 30 + src/brpc/builtin/pprof_service.cpp | 579 ++ src/brpc/builtin/pprof_service.h | 62 + .../builtin/prometheus_metrics_service.cpp | 244 + src/brpc/builtin/prometheus_metrics_service.h | 39 + src/brpc/builtin/protobufs_service.cpp | 118 + src/brpc/builtin/protobufs_service.h | 53 + src/brpc/builtin/rpcz_service.cpp | 742 +++ src/brpc/builtin/rpcz_service.h | 66 + src/brpc/builtin/sockets_service.cpp | 55 + src/brpc/builtin/sockets_service.h | 38 + src/brpc/builtin/sorttable_js.cpp | 529 ++ src/brpc/builtin/sorttable_js.h | 36 + src/brpc/builtin/status_service.cpp | 272 + src/brpc/builtin/status_service.h | 43 + src/brpc/builtin/tabbed.h | 88 + src/brpc/builtin/threads_service.cpp | 53 + src/brpc/builtin/threads_service.h | 39 + src/brpc/builtin/vars_service.cpp | 438 ++ src/brpc/builtin/vars_service.h | 41 + src/brpc/builtin/version_service.cpp | 41 + src/brpc/builtin/version_service.h | 45 + src/brpc/builtin/viz_min_js.cpp | 61 + src/brpc/builtin/viz_min_js.h | 37 + src/brpc/builtin/vlog_service.cpp | 99 + src/brpc/builtin/vlog_service.h | 42 + src/brpc/builtin_service.proto | 179 + src/brpc/callback.h | 1097 ++++ src/brpc/channel.cpp | 661 ++ src/brpc/channel.h | 277 + src/brpc/channel_base.h | 49 + src/brpc/checksum.cpp | 100 + src/brpc/checksum.h | 63 + src/brpc/circuit_breaker.cpp | 256 + src/brpc/circuit_breaker.h | 96 + src/brpc/closure_guard.h | 74 + src/brpc/cluster_recover_policy.cpp | 149 + src/brpc/cluster_recover_policy.h | 89 + src/brpc/compress.cpp | 128 + src/brpc/compress.h | 202 + src/brpc/concurrency_limiter.h | 65 + src/brpc/controller.cpp | 1806 ++++++ src/brpc/controller.h | 1031 +++ src/brpc/coroutine.h | 148 + src/brpc/coroutine_inl.h | 312 + src/brpc/couchbase.cpp | 2634 ++++++++ src/brpc/couchbase.h | 517 ++ src/brpc/data_factory.h | 50 + src/brpc/describable.h | 114 + src/brpc/destroyable.h | 49 + .../details/controller_private_accessor.h | 200 + src/brpc/details/has_epollrdhup.cpp | 71 + src/brpc/details/has_epollrdhup.h | 34 + src/brpc/details/health_check.cpp | 235 + src/brpc/details/health_check.h | 36 + src/brpc/details/hpack-static-table.h | 366 ++ src/brpc/details/hpack.cpp | 887 +++ src/brpc/details/hpack.h | 152 + src/brpc/details/http_message.cpp | 757 +++ src/brpc/details/http_message.h | 159 + src/brpc/details/http_parser.cpp | 2466 ++++++++ src/brpc/details/http_parser.h | 341 + src/brpc/details/jemalloc_profiler.cpp | 358 ++ src/brpc/details/jemalloc_profiler.h | 34 + .../details/load_balancer_with_naming.cpp | 68 + src/brpc/details/load_balancer_with_naming.h | 51 + src/brpc/details/mesalink_ssl_helper.cpp | 402 ++ src/brpc/details/method_status.cpp | 167 + src/brpc/details/method_status.h | 122 + src/brpc/details/naming_service_thread.cpp | 507 ++ src/brpc/details/naming_service_thread.h | 144 + src/brpc/details/profiler_linker.h | 55 + src/brpc/details/rtmp_utils.cpp | 63 + src/brpc/details/rtmp_utils.h | 63 + src/brpc/details/server_private_accessor.h | 130 + src/brpc/details/sparse_minute_counter.h | 168 + src/brpc/details/ssl_helper.cpp | 1005 +++ src/brpc/details/ssl_helper.h | 126 + src/brpc/details/tcmalloc_extension.cpp | 70 + src/brpc/details/tcmalloc_extension.h | 321 + src/brpc/details/usercode_backup_pool.cpp | 186 + src/brpc/details/usercode_backup_pool.h | 88 + src/brpc/errno.proto | 57 + src/brpc/esp_head.h | 46 + src/brpc/esp_message.cpp | 72 + src/brpc/esp_message.h | 55 + src/brpc/event_dispatcher.cpp | 114 + src/brpc/event_dispatcher.h | 315 + src/brpc/event_dispatcher_epoll.cpp | 252 + src/brpc/event_dispatcher_kqueue.cpp | 232 + src/brpc/excluded_servers.h | 102 + src/brpc/extension.h | 62 + src/brpc/extension_inl.h | 87 + src/brpc/get_favicon.proto | 32 + src/brpc/get_js.proto | 31 + src/brpc/global.cpp | 700 +++ src/brpc/global.h | 32 + src/brpc/grpc.cpp | 209 + src/brpc/grpc.h | 161 + src/brpc/grpc_health_check.proto | 41 + src/brpc/health_check_option.h | 34 + src/brpc/health_reporter.h | 42 + src/brpc/http2.cpp | 115 + src/brpc/http2.h | 126 + src/brpc/http_header.cpp | 160 + src/brpc/http_header.h | 213 + src/brpc/http_method.cpp | 142 + src/brpc/http_method.h | 63 + src/brpc/http_status_code.cpp | 144 + src/brpc/http_status_code.h | 683 ++ src/brpc/input_message_base.h | 69 + src/brpc/input_messenger.cpp | 587 ++ src/brpc/input_messenger.h | 167 + src/brpc/interceptor.h | 42 + src/brpc/kvmap.h | 75 + src/brpc/load_balancer.cpp | 136 + src/brpc/load_balancer.h | 194 + src/brpc/log.h | 31 + src/brpc/memcache.cpp | 807 +++ src/brpc/memcache.h | 223 + src/brpc/mongo_head.h | 78 + src/brpc/mongo_service_adaptor.h | 63 + src/brpc/naming_service.h | 77 + src/brpc/naming_service_filter.h | 40 + src/brpc/nonreflectable_message.h | 310 + src/brpc/nshead.h | 41 + src/brpc/nshead_message.cpp | 90 + src/brpc/nshead_message.h | 66 + src/brpc/nshead_meta.proto | 41 + src/brpc/nshead_pb_service_adaptor.cpp | 148 + src/brpc/nshead_pb_service_adaptor.h | 95 + src/brpc/nshead_service.cpp | 61 + src/brpc/nshead_service.h | 129 + src/brpc/options.proto | 112 + src/brpc/parallel_channel.cpp | 835 +++ src/brpc/parallel_channel.h | 291 + src/brpc/parse_result.h | 92 + src/brpc/partition_channel.cpp | 491 ++ src/brpc/partition_channel.h | 174 + src/brpc/pb_compat.h | 52 + src/brpc/periodic_naming_service.cpp | 75 + src/brpc/periodic_naming_service.h | 41 + src/brpc/periodic_task.cpp | 67 + src/brpc/periodic_task.h | 50 + src/brpc/policy/auto_concurrency_limiter.cpp | 300 + src/brpc/policy/auto_concurrency_limiter.h | 90 + src/brpc/policy/baidu_naming_service.cpp | 80 + src/brpc/policy/baidu_naming_service.h | 48 + src/brpc/policy/baidu_rpc_meta.proto | 55 + src/brpc/policy/baidu_rpc_protocol.cpp | 1151 ++++ src/brpc/policy/baidu_rpc_protocol.h | 59 + .../consistent_hashing_load_balancer.cpp | 411 ++ .../policy/consistent_hashing_load_balancer.h | 90 + .../policy/constant_concurrency_limiter.cpp | 51 + .../policy/constant_concurrency_limiter.h | 48 + src/brpc/policy/consul_naming_service.cpp | 269 + src/brpc/policy/consul_naming_service.h | 59 + src/brpc/policy/couchbase_authenticator.cpp | 57 + src/brpc/policy/couchbase_authenticator.h | 51 + src/brpc/policy/couchbase_protocol.cpp | 239 + src/brpc/policy/couchbase_protocol.h | 173 + src/brpc/policy/crc32c_checksum.cpp | 64 + src/brpc/policy/crc32c_checksum.h | 37 + src/brpc/policy/dh.cpp | 123 + src/brpc/policy/dh.h | 67 + src/brpc/policy/discovery_naming_service.cpp | 469 ++ src/brpc/policy/discovery_naming_service.h | 89 + src/brpc/policy/domain_naming_service.cpp | 184 + src/brpc/policy/domain_naming_service.h | 54 + src/brpc/policy/dynpart_load_balancer.cpp | 185 + src/brpc/policy/dynpart_load_balancer.h | 62 + src/brpc/policy/esp_authenticator.cpp | 49 + src/brpc/policy/esp_authenticator.h | 42 + src/brpc/policy/esp_protocol.cpp | 160 + src/brpc/policy/esp_protocol.h | 55 + src/brpc/policy/file_naming_service.cpp | 168 + src/brpc/policy/file_naming_service.h | 48 + src/brpc/policy/giano_authenticator.cpp | 90 + src/brpc/policy/giano_authenticator.h | 56 + src/brpc/policy/gzip_compress.cpp | 198 + src/brpc/policy/gzip_compress.h | 52 + src/brpc/policy/hasher.cpp | 171 + src/brpc/policy/hasher.h | 43 + src/brpc/policy/http2_rpc_protocol.cpp | 1851 ++++++ src/brpc/policy/http2_rpc_protocol.h | 426 ++ src/brpc/policy/http_rpc_protocol.cpp | 1818 ++++++ src/brpc/policy/http_rpc_protocol.h | 163 + src/brpc/policy/hulu_pbrpc_controller.h | 92 + src/brpc/policy/hulu_pbrpc_meta.proto | 56 + src/brpc/policy/hulu_pbrpc_protocol.cpp | 733 +++ src/brpc/policy/hulu_pbrpc_protocol.h | 53 + src/brpc/policy/list_naming_service.cpp | 124 + src/brpc/policy/list_naming_service.h | 63 + .../policy/locality_aware_load_balancer.cpp | 592 ++ .../policy/locality_aware_load_balancer.h | 225 + src/brpc/policy/memcache_binary_header.h | 162 + src/brpc/policy/memcache_binary_protocol.cpp | 237 + src/brpc/policy/memcache_binary_protocol.h | 57 + src/brpc/policy/mongo.proto | 63 + src/brpc/policy/mongo_protocol.cpp | 308 + src/brpc/policy/mongo_protocol.h | 38 + src/brpc/policy/most_common_message.h | 55 + src/brpc/policy/mysql/mysql.cpp | 524 ++ src/brpc/policy/mysql/mysql.h | 244 + .../policy/mysql/mysql_auth_handshake.cpp | 305 + src/brpc/policy/mysql/mysql_auth_handshake.h | 137 + src/brpc/policy/mysql/mysql_auth_packet.cpp | 186 + src/brpc/policy/mysql/mysql_auth_packet.h | 104 + src/brpc/policy/mysql/mysql_auth_scramble.cpp | 204 + src/brpc/policy/mysql/mysql_auth_scramble.h | 119 + src/brpc/policy/mysql/mysql_authenticator.cpp | 221 + src/brpc/policy/mysql/mysql_authenticator.h | 91 + src/brpc/policy/mysql/mysql_command.cpp | 272 + src/brpc/policy/mysql/mysql_command.h | 94 + src/brpc/policy/mysql/mysql_common.cpp | 237 + src/brpc/policy/mysql/mysql_common.h | 196 + src/brpc/policy/mysql/mysql_protocol.cpp | 540 ++ src/brpc/policy/mysql/mysql_protocol.h | 55 + src/brpc/policy/mysql/mysql_reply.cpp | 1467 +++++ src/brpc/policy/mysql/mysql_reply.h | 850 +++ src/brpc/policy/mysql/mysql_statement.cpp | 163 + src/brpc/policy/mysql/mysql_statement.h | 69 + src/brpc/policy/mysql/mysql_statement_inl.h | 61 + src/brpc/policy/mysql/mysql_transaction.cpp | 125 + src/brpc/policy/mysql/mysql_transaction.h | 92 + src/brpc/policy/nacos_naming_service.cpp | 289 + src/brpc/policy/nacos_naming_service.h | 67 + src/brpc/policy/nova_pbrpc_protocol.cpp | 202 + src/brpc/policy/nova_pbrpc_protocol.h | 66 + src/brpc/policy/nshead_mcpack_protocol.cpp | 187 + src/brpc/policy/nshead_mcpack_protocol.h | 66 + src/brpc/policy/nshead_protocol.cpp | 451 ++ src/brpc/policy/nshead_protocol.h | 56 + src/brpc/policy/p2c_ewma_load_balancer.cpp | 389 ++ src/brpc/policy/p2c_ewma_load_balancer.h | 94 + src/brpc/policy/public_pbrpc_meta.proto | 61 + src/brpc/policy/public_pbrpc_protocol.cpp | 287 + src/brpc/policy/public_pbrpc_protocol.h | 64 + src/brpc/policy/randomized_load_balancer.cpp | 173 + src/brpc/policy/randomized_load_balancer.h | 64 + src/brpc/policy/redis_authenticator.cpp | 42 + src/brpc/policy/redis_authenticator.h | 59 + src/brpc/policy/redis_protocol.cpp | 333 + src/brpc/policy/redis_protocol.h | 64 + .../policy/remote_file_naming_service.cpp | 163 + src/brpc/policy/remote_file_naming_service.h | 52 + src/brpc/policy/round_robin_load_balancer.cpp | 173 + src/brpc/policy/round_robin_load_balancer.h | 68 + src/brpc/policy/rtmp_protocol.cpp | 3682 +++++++++++ src/brpc/policy/rtmp_protocol.h | 641 ++ src/brpc/policy/snappy_compress.cpp | 85 + src/brpc/policy/snappy_compress.h | 45 + src/brpc/policy/sofa_pbrpc_meta.proto | 75 + src/brpc/policy/sofa_pbrpc_protocol.cpp | 582 ++ src/brpc/policy/sofa_pbrpc_protocol.h | 54 + src/brpc/policy/streaming_rpc_protocol.cpp | 186 + src/brpc/policy/streaming_rpc_protocol.h | 51 + src/brpc/policy/thrift_protocol.cpp | 765 +++ src/brpc/policy/thrift_protocol.h | 54 + .../policy/timeout_concurrency_limiter.cpp | 186 + src/brpc/policy/timeout_concurrency_limiter.h | 79 + src/brpc/policy/ubrpc2pb_protocol.cpp | 573 ++ src/brpc/policy/ubrpc2pb_protocol.h | 83 + .../weighted_randomized_load_balancer.cpp | 203 + .../weighted_randomized_load_balancer.h | 71 + .../weighted_round_robin_load_balancer.cpp | 276 + .../weighted_round_robin_load_balancer.h | 90 + src/brpc/progressive_attachment.cpp | 261 + src/brpc/progressive_attachment.h | 83 + src/brpc/progressive_reader.h | 92 + src/brpc/proto_base.proto | 44 + src/brpc/protocol.cpp | 270 + src/brpc/protocol.h | 253 + src/brpc/rdma/block_pool.cpp | 670 ++ src/brpc/rdma/block_pool.h | 115 + src/brpc/rdma/rdma_endpoint.cpp | 1792 ++++++ src/brpc/rdma/rdma_endpoint.h | 365 ++ src/brpc/rdma/rdma_handshake.cpp | 408 ++ src/brpc/rdma/rdma_handshake.h | 192 + src/brpc/rdma/rdma_handshake.proto | 46 + src/brpc/rdma/rdma_helper.cpp | 746 +++ src/brpc/rdma/rdma_helper.h | 106 + src/brpc/rdma_transport.cpp | 239 + src/brpc/rdma_transport.h | 66 + src/brpc/redis.cpp | 395 ++ src/brpc/redis.h | 298 + src/brpc/redis_cluster.cpp | 1219 ++++ src/brpc/redis_cluster.h | 184 + src/brpc/redis_command.cpp | 629 ++ src/brpc/redis_command.h | 85 + src/brpc/redis_reply.cpp | 492 ++ src/brpc/redis_reply.h | 336 + src/brpc/reloadable_flags.cpp | 86 + src/brpc/reloadable_flags.h | 58 + src/brpc/restful.cpp | 506 ++ src/brpc/restful.h | 114 + src/brpc/retry_policy.cpp | 78 + src/brpc/retry_policy.h | 139 + src/brpc/rpc_dump.cpp | 364 ++ src/brpc/rpc_dump.h | 106 + src/brpc/rpc_dump.proto | 48 + src/brpc/rpc_pb_message_factory.cpp | 50 + src/brpc/rpc_pb_message_factory.h | 138 + src/brpc/rtmp.cpp | 2897 +++++++++ src/brpc/rtmp.h | 1130 ++++ src/brpc/rtmp.proto | 85 + src/brpc/selective_channel.cpp | 627 ++ src/brpc/selective_channel.h | 113 + src/brpc/serialized_request.cpp | 72 + src/brpc/serialized_request.h | 62 + src/brpc/serialized_response.cpp | 72 + src/brpc/serialized_response.h | 62 + src/brpc/server.cpp | 2415 ++++++++ src/brpc/server.h | 818 +++ src/brpc/server_id.cpp | 73 + src/brpc/server_id.h | 96 + src/brpc/server_node.h | 67 + src/brpc/shared_object.h | 31 + src/brpc/simple_data_pool.cpp | 137 + src/brpc/simple_data_pool.h | 60 + src/brpc/socket.cpp | 3035 +++++++++ src/brpc/socket.h | 1056 ++++ src/brpc/socket_id.h | 56 + src/brpc/socket_inl.h | 153 + src/brpc/socket_map.cpp | 436 ++ src/brpc/socket_map.h | 236 + src/brpc/socket_message.h | 86 + src/brpc/socket_mode.h | 26 + src/brpc/span.cpp | 1046 ++++ src/brpc/span.h | 337 + src/brpc/span.proto | 98 + src/brpc/ssl_options.cpp | 42 + src/brpc/ssl_options.h | 181 + src/brpc/stream.cpp | 950 +++ src/brpc/stream.h | 180 + src/brpc/stream_creator.h | 83 + src/brpc/stream_impl.h | 145 + src/brpc/streaming_rpc_meta.proto | 49 + src/brpc/tcp_transport.cpp | 106 + src/brpc/tcp_transport.h | 41 + src/brpc/thrift_message.cpp | 94 + src/brpc/thrift_message.h | 226 + src/brpc/thrift_service.cpp | 52 + src/brpc/thrift_service.h | 75 + src/brpc/traceprintf.h | 63 + src/brpc/trackme.cpp | 242 + src/brpc/trackme.h | 40 + src/brpc/trackme.proto | 50 + src/brpc/transport.h | 66 + src/brpc/transport_factory.cpp | 52 + src/brpc/transport_factory.h | 34 + src/brpc/ts.cpp | 1477 +++++ src/brpc/ts.h | 1262 ++++ src/brpc/uri.cpp | 511 ++ src/brpc/uri.h | 275 + src/brpc/versioned_ref_with_id.h | 628 ++ src/bthread/bthread.cpp | 677 ++ src/bthread/bthread.h | 462 ++ src/bthread/bthread_once.cpp | 81 + src/bthread/butex.cpp | 758 +++ src/bthread/butex.h | 90 + src/bthread/comlog_initializer.h | 49 + src/bthread/condition_variable.cpp | 143 + src/bthread/condition_variable.h | 120 + src/bthread/context.cpp | 994 +++ src/bthread/context.h | 96 + src/bthread/countdown_event.cpp | 108 + src/bthread/countdown_event.h | 62 + src/bthread/errno.cpp | 47 + src/bthread/errno.h | 42 + src/bthread/execution_queue.cpp | 474 ++ src/bthread/execution_queue.h | 251 + src/bthread/execution_queue_inl.h | 596 ++ src/bthread/fd.cpp | 552 ++ src/bthread/id.cpp | 800 +++ src/bthread/id.h | 193 + src/bthread/interrupt_pthread.cpp | 42 + src/bthread/interrupt_pthread.h | 35 + src/bthread/key.cpp | 676 ++ src/bthread/list_of_abafree_id.h | 350 ++ src/bthread/log.h | 31 + src/bthread/mutex.cpp | 1330 ++++ src/bthread/mutex.h | 255 + src/bthread/offset_inl.list | 37 + src/bthread/parking_lot.h | 99 + src/bthread/prime_offset.h | 39 + src/bthread/processor.h | 67 + src/bthread/remote_task_queue.h | 83 + src/bthread/rwlock.cpp | 526 ++ src/bthread/rwlock.h | 219 + src/bthread/semaphore.cpp | 173 + src/bthread/singleton_on_bthread_once.h | 61 + src/bthread/stack.cpp | 153 + src/bthread/stack.h | 84 + src/bthread/stack_inl.h | 282 + src/bthread/sys_futex.cpp | 145 + src/bthread/sys_futex.h | 72 + src/bthread/task_control.cpp | 791 +++ src/bthread/task_control.h | 230 + src/bthread/task_group.cpp | 1279 ++++ src/bthread/task_group.h | 390 ++ src/bthread/task_group_inl.h | 113 + src/bthread/task_meta.h | 177 + src/bthread/task_tracer.cpp | 462 ++ src/bthread/task_tracer.h | 128 + src/bthread/timer_thread.cpp | 494 ++ src/bthread/timer_thread.h | 112 + src/bthread/types.h | 323 + src/bthread/unstable.h | 142 + src/bthread/work_stealing_queue.h | 157 + src/butil/arena.cpp | 104 + src/butil/arena.h | 85 + src/butil/at_exit.cc | 75 + src/butil/at_exit.h | 76 + src/butil/atomic_ref_count.h | 80 + src/butil/atomic_sequence_num.h | 60 + src/butil/atomicops.h | 324 + src/butil/atomicops_internals_arm64_gcc.h | 307 + src/butil/atomicops_internals_arm_gcc.h | 294 + .../atomicops_internals_atomicword_compat.h | 100 + src/butil/atomicops_internals_gcc.h | 105 + .../atomicops_internals_loongarch64_gcc.h | 223 + src/butil/atomicops_internals_mac.h | 197 + src/butil/atomicops_internals_mips_gcc.h | 154 + src/butil/atomicops_internals_riscv_gcc.h | 192 + src/butil/atomicops_internals_tsan.h | 186 + src/butil/atomicops_internals_x86_gcc.cc | 100 + src/butil/atomicops_internals_x86_gcc.h | 242 + src/butil/atomicops_internals_x86_msvc.h | 198 + src/butil/auto_reset.h | 41 + src/butil/base64.cc | 37 + src/butil/base64.h | 24 + src/butil/base64url.cc | 96 + src/butil/base64url.h | 54 + src/butil/base_export.h | 34 + src/butil/basictypes.h | 35 + src/butil/big_endian.cc | 97 + src/butil/big_endian.h | 102 + src/butil/binary_printer.cpp | 165 + src/butil/binary_printer.h | 70 + src/butil/bit_array.h | 103 + src/butil/bits.h | 47 + src/butil/build_config.h | 193 + src/butil/cancelable_callback.h | 272 + src/butil/class_name.cpp | 61 + src/butil/class_name.h | 58 + src/butil/comlog_sink.cc | 392 ++ src/butil/comlog_sink.h | 166 + src/butil/compat.h | 91 + src/butil/compiler_specific.h | 313 + src/butil/containers/bounded_queue.h | 307 + .../containers/case_ignored_flat_map.cpp | 53 + src/butil/containers/case_ignored_flat_map.h | 77 + src/butil/containers/doubly_buffered_data.h | 574 ++ src/butil/containers/flat_map.h | 640 ++ src/butil/containers/flat_map_inl.h | 847 +++ src/butil/containers/hash_tables.h | 260 + src/butil/containers/linked_list.h | 201 + src/butil/containers/mpsc_queue.h | 188 + src/butil/containers/mru_cache.h | 310 + src/butil/containers/optional.h | 563 ++ src/butil/containers/pooled_map.h | 196 + src/butil/containers/scoped_ptr_hash_map.h | 157 + src/butil/containers/small_map.h | 652 ++ src/butil/containers/stack_container.h | 276 + src/butil/cpu.cc | 244 + src/butil/cpu.h | 90 + src/butil/crc32c.cc | 875 +++ src/butil/crc32c.h | 52 + src/butil/debug/address_annotations.h | 42 + src/butil/debug/alias.cc | 23 + src/butil/debug/alias.h | 21 + src/butil/debug/asan_invalid_access.cc | 94 + src/butil/debug/asan_invalid_access.h | 47 + src/butil/debug/crash_logging.cc | 202 + src/butil/debug/crash_logging.h | 104 + src/butil/debug/debugger.cc | 41 + src/butil/debug/debugger.h | 44 + src/butil/debug/debugger_posix.cc | 257 + src/butil/debug/dump_without_crashing.cc | 32 + src/butil/debug/dump_without_crashing.h | 27 + src/butil/debug/leak_annotations.h | 58 + src/butil/debug/leak_tracker.h | 138 + src/butil/debug/proc_maps_linux.cc | 167 + src/butil/debug/proc_maps_linux.h | 90 + src/butil/debug/stack_trace.cc | 47 + src/butil/debug/stack_trace.h | 122 + src/butil/debug/stack_trace_posix.cc | 894 +++ src/butil/details/extended_endpoint.hpp | 383 ++ src/butil/endpoint.cpp | 696 +++ src/butil/endpoint.h | 249 + src/butil/environment.cc | 237 + src/butil/environment.h | 90 + src/butil/errno.cpp | 101 + src/butil/errno.h | 87 + src/butil/fast_rand.cpp | 208 + src/butil/fast_rand.h | 78 + src/butil/fd_guard.h | 79 + src/butil/fd_utility.cpp | 111 + src/butil/fd_utility.h | 51 + src/butil/file_descriptor_posix.h | 50 + src/butil/file_util.cc | 269 + src/butil/file_util.h | 466 ++ src/butil/file_util_linux.cc | 96 + src/butil/file_util_mac.mm | 52 + src/butil/file_util_posix.cc | 932 +++ src/butil/files/dir_reader_fallback.h | 35 + src/butil/files/dir_reader_linux.h | 98 + src/butil/files/dir_reader_posix.h | 40 + src/butil/files/dir_reader_unix.h | 90 + src/butil/files/fd_guard.h | 32 + src/butil/files/file.cc | 127 + src/butil/files/file.h | 313 + src/butil/files/file_enumerator.cc | 21 + src/butil/files/file_enumerator.h | 159 + src/butil/files/file_enumerator_posix.cc | 168 + src/butil/files/file_path.cc | 1298 ++++ src/butil/files/file_path.h | 469 ++ src/butil/files/file_path_constants.cc | 22 + src/butil/files/file_posix.cc | 486 ++ src/butil/files/file_watcher.cpp | 99 + src/butil/files/file_watcher.h | 84 + src/butil/files/memory_mapped_file.cc | 53 + src/butil/files/memory_mapped_file.h | 72 + src/butil/files/memory_mapped_file_posix.cc | 48 + src/butil/files/scoped_file.cc | 35 + src/butil/files/scoped_file.h | 108 + src/butil/files/scoped_temp_dir.cc | 83 + src/butil/files/scoped_temp_dir.h | 62 + src/butil/files/temp_file.cpp | 154 + src/butil/files/temp_file.h | 77 + src/butil/find_cstr.cpp | 26 + src/butil/find_cstr.h | 162 + src/butil/float_util.h | 36 + src/butil/format_macros.h | 101 + src/butil/gperftools_profiler.h | 83 + src/butil/gtest_prod_util.h | 85 + src/butil/guid.cc | 29 + src/butil/guid.h | 32 + src/butil/guid_posix.cc | 28 + src/butil/hash.cc | 18 + src/butil/hash.h | 38 + src/butil/intrusive_ptr.hpp | 296 + src/butil/iobuf.cpp | 2281 +++++++ src/butil/iobuf.h | 942 +++ src/butil/iobuf_inl.h | 652 ++ src/butil/iobuf_profiler.cpp | 319 + src/butil/iobuf_profiler.h | 169 + src/butil/lazy_instance.cc | 59 + src/butil/lazy_instance.h | 232 + src/butil/location.cc | 102 + src/butil/location.h | 94 + src/butil/logging.cc | 1988 ++++++ src/butil/logging.h | 1344 ++++ src/butil/mac/bundle_locations.h | 67 + src/butil/mac/bundle_locations.mm | 83 + src/butil/mac/foundation_util.h | 376 ++ src/butil/mac/foundation_util.mm | 445 ++ src/butil/mac/scoped_cftyperef.h | 59 + src/butil/mac/scoped_mach_port.cc | 33 + src/butil/mac/scoped_mach_port.h | 67 + src/butil/mac/scoped_typeref.h | 131 + src/butil/macros.h | 496 ++ src/butil/memory/aligned_memory.cc | 46 + src/butil/memory/aligned_memory.h | 126 + src/butil/memory/linked_ptr.h | 181 + src/butil/memory/manual_constructor.h | 78 + .../raw_scoped_refptr_mismatch_checker.h | 128 + src/butil/memory/ref_counted.cc | 53 + src/butil/memory/ref_counted.h | 363 ++ src/butil/memory/ref_counted_memory.cc | 100 + src/butil/memory/ref_counted_memory.h | 146 + src/butil/memory/scope_guard.h | 109 + src/butil/memory/scoped_open_process.h | 48 + src/butil/memory/scoped_policy.h | 25 + src/butil/memory/scoped_ptr.h | 580 ++ src/butil/memory/scoped_vector.h | 144 + src/butil/memory/singleton.cc | 33 + src/butil/memory/singleton.h | 300 + src/butil/memory/singleton_objc.h | 60 + src/butil/memory/singleton_on_pthread_once.h | 83 + src/butil/memory/weak_ptr.cc | 67 + src/butil/memory/weak_ptr.h | 336 + src/butil/move.h | 218 + src/butil/numerics/safe_conversions.h | 88 + src/butil/numerics/safe_conversions_impl.h | 216 + src/butil/numerics/safe_math.h | 271 + src/butil/numerics/safe_math_impl.h | 502 ++ src/butil/object_pool.h | 114 + src/butil/object_pool_inl.h | 644 ++ src/butil/observer_list.h | 217 + src/butil/popen.cpp | 206 + src/butil/popen.h | 34 + src/butil/port.h | 48 + src/butil/posix/eintr_wrapper.h | 68 + src/butil/posix/file_descriptor_shuffle.cc | 100 + src/butil/posix/file_descriptor_shuffle.h | 87 + src/butil/posix/global_descriptors.cc | 60 + src/butil/posix/global_descriptors.h | 74 + src/butil/process_util.cc | 103 + src/butil/process_util.h | 42 + src/butil/ptr_container.h | 80 + src/butil/rand_util.cc | 71 + src/butil/rand_util.h | 65 + src/butil/rand_util_posix.cc | 59 + src/butil/raw_pack.h | 95 + src/butil/reader_writer.h | 53 + src/butil/recordio.cc | 388 ++ src/butil/recordio.h | 143 + src/butil/reloadable_flags.h | 79 + src/butil/resource_pool.h | 142 + src/butil/resource_pool_inl.h | 636 ++ src/butil/safe_strerror_posix.cc | 115 + src/butil/safe_strerror_posix.h | 38 + src/butil/scoped_clear_errno.h | 34 + src/butil/scoped_generic.h | 177 + src/butil/scoped_lock.h | 400 ++ src/butil/scoped_observer.h | 56 + src/butil/sha1.h | 29 + src/butil/sha1_portable.cc | 215 + src/butil/shared_object.h | 73 + src/butil/single_iobuf.cpp | 285 + src/butil/single_iobuf.h | 109 + src/butil/single_threaded_pool.h | 147 + src/butil/ssl_compat.h | 554 ++ src/butil/status.cpp | 137 + src/butil/status.h | 157 + src/butil/stl_util.h | 260 + src/butil/string_printf.cpp | 155 + src/butil/string_printf.h | 54 + src/butil/string_splitter.h | 245 + src/butil/string_splitter_inl.h | 331 + .../strings/latin1_string_conversions.cc | 19 + src/butil/strings/latin1_string_conversions.h | 32 + src/butil/strings/nullable_string16.cc | 17 + src/butil/strings/nullable_string16.h | 46 + src/butil/strings/safe_sprintf.cc | 682 ++ src/butil/strings/safe_sprintf.h | 417 ++ src/butil/strings/string16.cc | 82 + src/butil/strings/string16.h | 184 + .../strings/string_number_conversions.cc | 504 ++ src/butil/strings/string_number_conversions.h | 131 + src/butil/strings/string_piece.cc | 437 ++ src/butil/strings/string_piece.h | 519 ++ src/butil/strings/string_split.cc | 289 + src/butil/strings/string_split.h | 110 + src/butil/strings/string_tokenizer.h | 260 + src/butil/strings/string_util.cc | 911 +++ src/butil/strings/string_util.h | 556 ++ src/butil/strings/string_util_constants.cc | 57 + src/butil/strings/string_util_posix.h | 52 + src/butil/strings/stringize_macros.h | 31 + src/butil/strings/stringprintf.cc | 190 + src/butil/strings/stringprintf.h | 62 + src/butil/strings/sys_string_conversions.h | 83 + .../strings/sys_string_conversions_mac.mm | 186 + .../strings/sys_string_conversions_posix.cc | 161 + .../strings/utf_offset_string_conversions.cc | 260 + .../strings/utf_offset_string_conversions.h | 126 + .../strings/utf_string_conversion_utils.cc | 148 + .../strings/utf_string_conversion_utils.h | 97 + src/butil/strings/utf_string_conversions.cc | 190 + src/butil/strings/utf_string_conversions.h | 53 + .../synchronization/cancellation_flag.cc | 22 + src/butil/synchronization/cancellation_flag.h | 43 + .../synchronization/condition_variable.h | 114 + .../condition_variable_posix.cc | 76 + src/butil/synchronization/lock.h | 178 + src/butil/synchronization/spin_wait.h | 50 + src/butil/synchronization/waitable_event.h | 182 + .../synchronization/waitable_event_posix.cc | 408 ++ src/butil/synchronous_event.h | 233 + src/butil/sys_byteorder.h | 141 + src/butil/third_party/dmg_fp/README.chromium | 22 + src/butil/third_party/dmg_fp/dmg_fp.h | 30 + src/butil/third_party/dmg_fp/dtoa.cc | 4210 +++++++++++++ src/butil/third_party/dmg_fp/dtoa_wrapper.cc | 46 + .../dmg_fp/float_precision_crash.patch | 13 + src/butil/third_party/dmg_fp/g_fmt.cc | 102 + src/butil/third_party/dmg_fp/gcc_64_bit.patch | 25 + .../third_party/dmg_fp/gcc_warnings.patch | 126 + src/butil/third_party/dmg_fp/mac_wextra.patch | 53 + .../dmg_fp/vs2013-optimization.patch | 18 + src/butil/third_party/dmg_fp/win_vs2012.patch | 13 + .../dynamic_annotations/README.chromium | 13 + .../dynamic_annotations/dynamic_annotations.c | 269 + .../dynamic_annotations/dynamic_annotations.h | 595 ++ src/butil/third_party/icu/README.chromium | 16 + src/butil/third_party/icu/icu_utf.cc | 230 + src/butil/third_party/icu/icu_utf.h | 391 ++ .../third_party/modp_b64/README.chromium | 15 + src/butil/third_party/modp_b64/modp_b64.cc | 265 + src/butil/third_party/modp_b64/modp_b64.h | 171 + .../third_party/modp_b64/modp_b64_data.h | 482 ++ .../third_party/murmurhash3/murmurhash3.cpp | 714 +++ .../third_party/murmurhash3/murmurhash3.h | 116 + src/butil/third_party/rapidjson/allocators.h | 265 + src/butil/third_party/rapidjson/document.h | 2056 ++++++ .../third_party/rapidjson/encodedstream.h | 261 + src/butil/third_party/rapidjson/encodings.h | 625 ++ src/butil/third_party/rapidjson/error/en.h | 65 + src/butil/third_party/rapidjson/error/error.h | 147 + .../third_party/rapidjson/filereadstream.h | 88 + .../third_party/rapidjson/filewritestream.h | 91 + .../rapidjson/internal/biginteger.h | 280 + .../third_party/rapidjson/internal/diyfp.h | 247 + .../third_party/rapidjson/internal/dtoa.h | 217 + .../third_party/rapidjson/internal/ieee754.h | 77 + .../third_party/rapidjson/internal/itoa.h | 304 + .../third_party/rapidjson/internal/meta.h | 181 + .../third_party/rapidjson/internal/pow10.h | 55 + .../third_party/rapidjson/internal/stack.h | 179 + .../third_party/rapidjson/internal/strfunc.h | 39 + .../third_party/rapidjson/internal/strtod.h | 270 + .../third_party/rapidjson/memorybuffer.h | 70 + .../third_party/rapidjson/memorystream.h | 61 + .../rapidjson/msinttypes/inttypes.h | 316 + .../third_party/rapidjson/msinttypes/stdint.h | 300 + .../third_party/rapidjson/optimized_writer.h | 114 + src/butil/third_party/rapidjson/pointer.h | 1313 ++++ .../third_party/rapidjson/prettywriter.h | 207 + src/butil/third_party/rapidjson/rapidjson.h | 667 ++ src/butil/third_party/rapidjson/reader.h | 1576 +++++ src/butil/third_party/rapidjson/rename.patch | 139 + .../third_party/rapidjson/stringbuffer.h | 97 + src/butil/third_party/rapidjson/writer.h | 395 ++ .../third_party/snappy/format_description.txt | 110 + .../third_party/snappy/framing_format.txt | 135 + .../third_party/snappy/snappy-internal.h | 152 + .../third_party/snappy/snappy-sinksource.cc | 106 + .../third_party/snappy/snappy-sinksource.h | 184 + .../snappy/snappy-stubs-internal.cc | 44 + .../snappy/snappy-stubs-internal.h | 418 ++ src/butil/third_party/snappy/snappy.cc | 1578 +++++ src/butil/third_party/snappy/snappy.h | 210 + .../third_party/superfasthash/README.chromium | 29 + .../third_party/superfasthash/superfasthash.c | 84 + .../third_party/symbolize/README.chromium | 18 + src/butil/third_party/symbolize/config.h | 7 + src/butil/third_party/symbolize/demangle.cc | 1304 ++++ src/butil/third_party/symbolize/demangle.h | 84 + .../third_party/symbolize/glog/logging.h | 5 + .../third_party/symbolize/glog/raw_logging.h | 6 + src/butil/third_party/symbolize/symbolize.cc | 948 +++ src/butil/third_party/symbolize/symbolize.h | 157 + src/butil/third_party/symbolize/utilities.h | 10 + src/butil/third_party/valgrind/valgrind.h | 4840 +++++++++++++++ src/butil/thread_key.cpp | 171 + src/butil/thread_key.h | 221 + src/butil/thread_local.cpp | 160 + src/butil/thread_local.h | 116 + src/butil/thread_local_inl.h | 53 + src/butil/threading/non_thread_safe.h | 71 + src/butil/threading/non_thread_safe_impl.cc | 23 + src/butil/threading/non_thread_safe_impl.h | 39 + src/butil/threading/platform_thread.h | 201 + .../threading/platform_thread_freebsd.cc | 106 + src/butil/threading/platform_thread_linux.cc | 123 + src/butil/threading/platform_thread_mac.mm | 223 + src/butil/threading/platform_thread_posix.cc | 237 + src/butil/threading/simple_thread.cc | 159 + src/butil/threading/simple_thread.h | 190 + src/butil/threading/thread_checker.h | 83 + src/butil/threading/thread_checker_impl.cc | 34 + src/butil/threading/thread_checker_impl.h | 43 + .../threading/thread_collision_warner.cc | 64 + src/butil/threading/thread_collision_warner.h | 245 + src/butil/threading/thread_id_name_manager.cc | 113 + src/butil/threading/thread_id_name_manager.h | 67 + src/butil/threading/thread_local.h | 133 + src/butil/threading/thread_local_posix.cc | 42 + src/butil/threading/thread_local_storage.cc | 250 + src/butil/threading/thread_local_storage.h | 144 + .../threading/thread_local_storage_posix.cc | 34 + src/butil/threading/thread_restrictions.cc | 85 + src/butil/threading/thread_restrictions.h | 257 + src/butil/threading/watchdog.cc | 184 + src/butil/threading/watchdog.h | 94 + src/butil/time.cpp | 158 + src/butil/time.h | 427 ++ src/butil/time/clock.cc | 11 + src/butil/time/clock.h | 40 + src/butil/time/default_clock.cc | 15 + src/butil/time/default_clock.h | 25 + src/butil/time/default_tick_clock.cc | 15 + src/butil/time/default_tick_clock.h | 25 + src/butil/time/tick_clock.cc | 11 + src/butil/time/tick_clock.h | 40 + src/butil/time/time.cc | 259 + src/butil/time/time.h | 774 +++ src/butil/time/time_mac.cc | 240 + src/butil/time/time_posix.cc | 386 ++ src/butil/type_traits.h | 401 ++ src/butil/unique_ptr.h | 472 ++ src/butil/unix_socket.cpp | 75 + src/butil/unix_socket.h | 41 + src/butil/version.cc | 178 + src/butil/version.h | 72 + src/butil/zero_copy_stream_as_streambuf.cpp | 71 + src/butil/zero_copy_stream_as_streambuf.h | 54 + src/bvar/bvar.h | 32 + src/bvar/collector.cpp | 442 ++ src/bvar/collector.h | 144 + src/bvar/default_variables.cpp | 891 +++ src/bvar/detail/agent_group.h | 202 + src/bvar/detail/call_op_returning_void.h | 35 + src/bvar/detail/combiner.h | 396 ++ src/bvar/detail/is_atomical.h | 41 + src/bvar/detail/percentile.cpp | 167 + src/bvar/detail/percentile.h | 625 ++ src/bvar/detail/sampler.cpp | 220 + src/bvar/detail/sampler.h | 223 + src/bvar/detail/series.h | 332 + src/bvar/gflag.cpp | 91 + src/bvar/gflag.h | 65 + src/bvar/latency_recorder.cpp | 302 + src/bvar/latency_recorder.h | 164 + src/bvar/multi_dimension.h | 235 + src/bvar/multi_dimension_inl.h | 398 ++ src/bvar/mvariable.cpp | 271 + src/bvar/mvariable.h | 136 + src/bvar/passive_status.h | 280 + src/bvar/recorder.h | 394 ++ src/bvar/reducer.h | 533 ++ src/bvar/scoped_timer.h | 59 + src/bvar/status.h | 242 + src/bvar/utils/lock_timer.h | 433 ++ src/bvar/variable.cpp | 971 +++ src/bvar/variable.h | 266 + src/bvar/vector.h | 121 + src/bvar/window.h | 362 ++ src/idl_options.proto | 54 + src/json2pb/encode_decode.cpp | 114 + src/json2pb/encode_decode.h | 43 + src/json2pb/json_to_pb.cpp | 776 +++ src/json2pb/json_to_pb.h | 103 + src/json2pb/pb_to_json.cpp | 452 ++ src/json2pb/pb_to_json.h | 119 + src/json2pb/protobuf_map.cpp | 52 + src/json2pb/protobuf_map.h | 52 + src/json2pb/protobuf_type_resolver.cpp | 36 + src/json2pb/protobuf_type_resolver.h | 74 + src/json2pb/rapidjson.h | 48 + src/json2pb/zero_copy_stream_reader.h | 85 + src/json2pb/zero_copy_stream_writer.h | 114 + src/mcpack2pb/field_type.cpp | 56 + src/mcpack2pb/field_type.h | 150 + src/mcpack2pb/generator.cpp | 1429 +++++ src/mcpack2pb/mcpack2pb.cpp | 59 + src/mcpack2pb/mcpack2pb.h | 165 + src/mcpack2pb/parser-inl.h | 267 + src/mcpack2pb/parser.cpp | 608 ++ src/mcpack2pb/parser.h | 273 + src/mcpack2pb/serializer-inl.h | 304 + src/mcpack2pb/serializer.cpp | 816 +++ src/mcpack2pb/serializer.h | 289 + test/BUILD.bazel | 292 + test/CMakeLists.txt | 309 + test/README_mysql_auth.md | 92 + test/abalist_unittest.cc | 46 + test/addressbook.proto | 78 + test/addressbook1.proto | 56 + test/addressbook_encode_decode.proto | 55 + test/addressbook_map.proto | 67 + test/aligned_memory_unittest.cc | 110 + test/allocator_unittest.cc | 515 ++ test/at_exit_unittest.cc | 79 + test/atomicops_unittest.cc | 241 + test/baidu_thread_local_unittest.cpp | 204 + test/baidu_time_unittest.cpp | 214 + test/barrier_closure_unittest.cc | 36 + test/base64_unittest.cc | 27 + test/base64url_unittest.cc | 110 + test/big_endian_unittest.cc | 100 + test/bits_unittest.cc | 48 + test/bounded_queue_unittest.cc | 105 + test/brpc_adaptive_class_unittest.cpp | 75 + test/brpc_alpn_protocol_unittest.cpp | 131 + ...brpc_auto_concurrency_limiter_unittest.cpp | 168 + test/brpc_block_pool_unittest.cpp | 219 + test/brpc_builtin_service_unittest.cpp | 1018 +++ test/brpc_channel_unittest.cpp | 3423 ++++++++++ test/brpc_circuit_breaker_unittest.cpp | 293 + test/brpc_controller_unittest.cpp | 138 + test/brpc_coroutine_unittest.cpp | 221 + test/brpc_couchbase_unittest.cpp | 112 + test/brpc_esp_protocol_unittest.cpp | 158 + test/brpc_event_dispatcher_unittest.cpp | 534 ++ test/brpc_extension_unittest.cpp | 72 + test/brpc_grpc_protocol_unittest.cpp | 275 + test/brpc_h2_unsent_message_unittest.cpp | 88 + test/brpc_hpack_unittest.cpp | 620 ++ test/brpc_http_message_unittest.cpp | 741 +++ test/brpc_http_parser_unittest.cpp | 171 + test/brpc_http_rpc_protocol_unittest.cpp | 2424 ++++++++ test/brpc_http_status_code_unittest.cpp | 39 + test/brpc_hulu_pbrpc_protocol_unittest.cpp | 350 ++ test/brpc_input_messenger_unittest.cpp | 225 + test/brpc_interceptor_unittest.cpp | 201 + test/brpc_load_balancer_unittest.cpp | 1401 +++++ test/brpc_memcache_unittest.cpp | 254 + test/brpc_mongo_protocol_unittest.cpp | 235 + test/brpc_mysql_auth_handshake_unittest.cpp | 1289 ++++ test/brpc_mysql_auth_packet_unittest.cpp | 299 + test/brpc_mysql_auth_scramble_unittest.cpp | 520 ++ test/brpc_mysql_connection_type_unittest.cpp | 353 ++ test/brpc_mysql_pool_concurrency_unittest.cpp | 1250 ++++ ...pc_mysql_prepared_integration_unittest.cpp | 742 +++ test/brpc_mysql_txn_integration_unittest.cpp | 605 ++ test/brpc_naming_service_filter_unittest.cpp | 74 + test/brpc_naming_service_unittest.cpp | 850 +++ test/brpc_nova_pbrpc_protocol_unittest.cpp | 278 + test/brpc_p2c_ewma_load_balancer_unittest.cpp | 428 ++ ...pc_prometheus_metrics_service_unittest.cpp | 42 + test/brpc_prometheus_metrics_unittest.cpp | 197 + test/brpc_proto_unittest.cpp | 83 + test/brpc_protobuf_json_unittest.cpp | 1898 ++++++ test/brpc_public_pbrpc_protocol_unittest.cpp | 330 + test/brpc_rdma_unittest.cpp | 2571 ++++++++ test/brpc_redis_cluster_unittest.cpp | 1598 +++++ test/brpc_redis_unittest.cpp | 1633 +++++ test/brpc_repeated_field_unittest.cpp | 41 + test/brpc_rtmp_unittest.cpp | 1147 ++++ test/brpc_server_unittest.cpp | 2118 +++++++ test/brpc_snappy_compress_unittest.cpp | 255 + test/brpc_socket_map_unittest.cpp | 176 + test/brpc_socket_unittest.cpp | 1721 +++++ test/brpc_sofa_pbrpc_protocol_unittest.cpp | 347 ++ test/brpc_ssl_unittest.cpp | 571 ++ test/brpc_streaming_rpc_unittest.cpp | 902 +++ ...c_timeout_concurrency_limiter_unittest.cpp | 129 + test/brpc_uri_unittest.cpp | 494 ++ test/bthread_butex_multi_tag_unittest.cpp | 171 + test/bthread_butex_unittest.cpp | 446 ++ test/bthread_cond_bug_unittest.cpp | 141 + test/bthread_cond_unittest.cpp | 516 ++ test/bthread_countdown_event_unittest.cpp | 69 + test/bthread_dispatcher_unittest.cpp | 335 + test/bthread_execution_queue_unittest.cpp | 920 +++ test/bthread_fd_unittest.cpp | 656 ++ test/bthread_futex_unittest.cpp | 210 + test/bthread_id_unittest.cpp | 597 ++ test/bthread_key_unittest.cpp | 622 ++ test/bthread_list_unittest.cpp | 60 + test/bthread_mutex_unittest.cpp | 369 ++ test/bthread_once_unittest.cpp | 136 + test/bthread_ping_pong_unittest.cpp | 221 + test/bthread_priority_queue_unittest.cpp | 228 + test/bthread_rwlock_unittest.cpp | 708 +++ test/bthread_sched_yield_unittest.cpp | 64 + test/bthread_semaphore_unittest.cpp | 207 + test/bthread_setconcurrency_unittest.cpp | 225 + test/bthread_timer_thread_unittest.cpp | 257 + test/bthread_unittest.cpp | 705 +++ test/bthread_work_stealing_queue_unittest.cpp | 133 + test/butil_unittest_main.cpp | 42 + test/bvar_agent_group_unittest.cpp | 152 + test/bvar_file_dumper_unittest.cpp | 40 + test/bvar_lock_timer_unittest.cpp | 265 + test/bvar_multi_dimension_unittest.cpp | 665 ++ test/bvar_mvariable_unittest.cpp | 201 + test/bvar_percentile_unittest.cpp | 192 + test/bvar_recorder_unittest.cpp | 258 + test/bvar_reducer_unittest.cpp | 345 ++ test/bvar_sampler_unittest.cpp | 139 + test/bvar_status_unittest.cpp | 207 + test/bvar_variable_unittest.cpp | 417 ++ test/bvar_window_unittest.cpp | 97 + test/cacheline_unittest.cpp | 52 + test/callback_helpers_unittest.cc | 61 + test/callback_list_unittest.cc | 291 + test/callback_unittest.cc | 181 + test/cancelable_callback_unittest.cc | 158 + test/cancellation_flag_unittest.cc | 36 + test/cert1.crt | 25 + test/cert1.key | 28 + test/cert2.crt | 25 + test/cert2.key | 28 + test/class_name_unittest.cpp | 62 + test/condition_variable_unittest.cc | 723 +++ test/cpu_unittest.cc | 97 + test/crash_logging_unittest.cc | 181 + test/crc32c_unittest.cc | 77 + test/dir_reader_posix_unittest.cc | 92 + test/echo.proto | 118 + test/endpoint_unittest.cpp | 614 ++ test/environment_unittest.cc | 164 + test/errno_unittest.cpp | 60 + test/fd_guard_unittest.cpp | 77 + test/file_descriptor_shuffle_unittest.cc | 287 + test/file_path_unittest.cc | 1286 ++++ test/file_unittest.cc | 468 ++ test/file_util_unittest.cc | 2633 ++++++++ test/file_watcher_unittest.cpp | 78 + test/find_cstr_unittest.cpp | 97 + test/flat_map_unittest.cpp | 1619 +++++ test/fuzzing/fuzz_amf.cpp | 81 + test/fuzzing/fuzz_baidu_rpc.cpp | 41 + test/fuzzing/fuzz_butil.cpp | 52 + .../fuzz_butil_seed_corpus/base64_decoded.txt | 1 + .../fuzz_butil_seed_corpus/base64_encoded.txt | 1 + .../fuzz_butil_seed_corpus/crc32c.data | Bin 0 -> 48 bytes test/fuzzing/fuzz_common.h | 44 + test/fuzzing/fuzz_couchbase.cpp | 41 + test/fuzzing/fuzz_esp.cpp | 43 + test/fuzzing/fuzz_hpack.cpp | 43 + .../header_never_indexed.hpack | 1 + .../header_with_indexing.hpack | 2 + .../header_without_indexing.hpack | 1 + .../requests_without_huffman.hpack | 2 + .../responses_without_huffman.hpack | 1 + test/fuzzing/fuzz_http.cpp | 45 + test/fuzzing/fuzz_http_parser.cpp | 97 + .../fuzz_http_seed_corpus/http_request.http | 9 + .../http_request_v2.http | 23 + test/fuzzing/fuzz_hulu.cpp | 43 + test/fuzzing/fuzz_json.cpp | 37 + test/fuzzing/fuzz_json_seed_corpus/info1.json | 1 + test/fuzzing/fuzz_json_seed_corpus/info2.json | 1 + test/fuzzing/fuzz_json_seed_corpus/info3.json | 1 + test/fuzzing/fuzz_memcache.cpp | 41 + test/fuzzing/fuzz_mongo.cpp | 41 + test/fuzzing/fuzz_redis.cpp | 48 + .../command_parser.redis | 7 + .../fuzz_redis_seed_corpus/request.redis | 1 + test/fuzzing/fuzz_shead.cpp | 43 + test/fuzzing/fuzz_sofa.cpp | 44 + test/fuzzing/fuzz_streaming.cpp | 41 + test/fuzzing/fuzz_thrift.cpp | 36 + test/fuzzing/fuzz_uri.cpp | 52 + test/fuzzing/fuzz_uri_seed_corpus/data_1.rtmp | 1 + test/fuzzing/fuzz_uri_seed_corpus/data_1.uri | 1 + test/fuzzing/fuzz_uri_seed_corpus/data_2.uri | 1 + test/fuzzing/oss-fuzz.sh | 56 + test/generate_unittests.bzl | 55 + test/gperftools_helper.h | 34 + test/grpc.proto | 38 + test/guid_unittest.cc | 42 + test/hash_tables_unittest.cc | 53 + test/hash_unittest.cc | 82 + test/health_check.proto | 28 + test/iobuf.proto | 45 + test/iobuf_unittest.cpp | 2259 +++++++ test/lazy_instance_unittest.cc | 172 + test/leak_tracker_unittest.cc | 113 + test/linked_list_unittest.cc | 308 + test/linked_ptr_unittest.cc | 110 + test/lock_unittest.cc | 216 + test/logging_unittest.cc | 652 ++ test/memory_unittest.cc | 433 ++ test/memory_unittest_mac.h | 32 + test/message.proto | 371 ++ test/mpsc_queue_unittest.cc | 141 + test/mru_cache_unittest.cc | 271 + test/multiprocess_func_list.h | 70 + test/non_thread_safe_unittest.cc | 167 + test/nullable_string16_unittest.cc | 35 + test/object_pool_unittest.cpp | 379 ++ test/observer_list_unittest.cc | 189 + test/optional_unittest.cpp | 298 + test/platform_thread_unittest.cc | 121 + test/popen_unittest.cpp | 143 + test/proc_maps_linux_unittest.cc | 314 + test/rand_util_unittest.cc | 218 + test/recordio_unittest.cpp | 324 + test/ref_counted_memory_unittest.cc | 89 + test/ref_counted_unittest.cc | 97 + test/repeated.proto | 25 + test/resource_pool_unittest.cpp | 424 ++ test/root_runfiles.bzl | 79 + test/run_tests.sh | 63 + test/safe_numerics_unittest.cc | 579 ++ test/safe_sprintf_unittest.cc | 757 +++ test/scope_guard_unittest.cpp | 58 + test/scoped_clear_errno_unittest.cc | 30 + test/scoped_generic_unittest.cc | 153 + test/scoped_locale.cc | 23 + test/scoped_locale.h | 29 + test/scoped_lock_unittest.cpp | 104 + test/scoped_ptr_unittest.cc | 602 ++ test/scoped_temp_dir_unittest.cc | 113 + test/scoped_vector_unittest.cc | 319 + test/security_unittest.cc | 305 + test/sha1_unittest.cc | 108 + test/shared_memory_unittest.cc | 686 ++ test/simple_thread_unittest.cc | 170 + test/singleton_unittest.cc | 287 + test/small_map_unittest.cc | 483 ++ test/snappy_message.proto | 24 + test/stack_container_unittest.cc | 151 + test/stack_trace_unittest.cc | 268 + test/status_unittest.cpp | 272 + test/stl_util_unittest.cc | 242 + test/string16_unittest.cc | 58 + test/string_number_conversions_unittest.cc | 796 +++ test/string_piece_unittest.cc | 689 +++ test/string_printf_unittest.cpp | 54 + test/string_split_unittest.cc | 398 ++ test/string_splitter_unittest.cpp | 451 ++ test/string_tokenizer_unittest.cc | 234 + test/string_util_unittest.cc | 1190 ++++ test/stringize_macros_unittest.cc | 29 + test/stringprintf_unittest.cc | 188 + test/synchronous_event_unittest.cpp | 74 + test/sys_info_unittest.cc | 148 + test/sys_string_conversions_unittest.cc | 188 + test/temp_file_unittest.cpp | 160 + test/test_file_util_linux.cc | 26 + test/test_switches.cc | 60 + test/test_switches.h | 31 + test/thread_checker_unittest.cc | 183 + test/thread_collision_warner_unittest.cc | 385 ++ test/thread_id_name_manager_unittest.cc | 42 + test/thread_key_unittest.cpp | 513 ++ test/thread_local_storage_unittest.cc | 124 + test/thread_local_unittest.cc | 169 + test/time_unittest.cc | 788 +++ test/type_traits_unittest.cc | 251 + test/unique_ptr_unittest.cpp | 66 + .../utf_offset_string_conversions_unittest.cc | 296 + test/utf_string_conversions_unittest.cc | 211 + test/v1.proto | 38 + test/v2.proto | 34 + test/v3.proto | 38 + test/version_unittest.cc | 142 + test/waitable_event_unittest.cc | 108 + test/watchdog_unittest.cc | 142 + test/weak_ptr_unittest.cc | 152 + tools/CMakeLists.txt | 24 + tools/add_syntax_equal_proto2_to_all.sh | 27 + tools/gdb_bthread_stack.py | 294 + tools/get_brpc_revision.sh | 27 + tools/lldb_bthread_stack.py | 347 ++ tools/parallel_http/CMakeLists.txt | 20 + tools/parallel_http/parallel_http.cpp | 211 + tools/print_gcc_version.sh | 41 + tools/rpc_press/CMakeLists.txt | 21 + tools/rpc_press/client.py | 28 + tools/rpc_press/info_thread.cpp | 130 + tools/rpc_press/info_thread.h | 55 + tools/rpc_press/json_loader.cpp | 229 + tools/rpc_press/json_loader.h | 63 + tools/rpc_press/pb_util.cpp | 72 + tools/rpc_press/pb_util.h | 44 + tools/rpc_press/rpc_press.cpp | 129 + tools/rpc_press/rpc_press_impl.cpp | 297 + tools/rpc_press/rpc_press_impl.h | 141 + tools/rpc_replay/CMakeLists.txt | 21 + tools/rpc_replay/info_thread.cpp | 130 + tools/rpc_replay/info_thread.h | 55 + tools/rpc_replay/rpc_replay.cpp | 301 + tools/rpc_view/CMakeLists.txt | 24 + tools/rpc_view/rpc_view.cpp | 176 + tools/rpc_view/view.proto | 26 + tools/trackme_server/CMakeLists.txt | 20 + tools/trackme_server/trackme_server.cpp | 280 + tools/wireshark_baidu_std.lua | 325 + 1718 files changed, 366293 insertions(+) create mode 100644 AGENTS.md create mode 100644 BUILD.bazel create mode 100644 CHANGES.md create mode 100644 CLAUDE.md create mode 100644 CMakeLists.txt create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 MODULE.bazel create mode 100644 README.md create mode 100644 README.wehub.md create mode 100644 README_cn.md create mode 100644 SECURITY.md create mode 100644 THREAT_MODEL.md create mode 100644 WORKSPACE.bzlmod create mode 100644 bazel/BUILD.bazel create mode 100644 bazel/config/BUILD.bazel create mode 100644 bazel/third_party/BUILD.bazel create mode 100644 bazel/third_party/crc32c/BUILD.bazel create mode 100644 bazel/third_party/crc32c/crc32c.BUILD create mode 100644 bazel/third_party/event/BUILD.bazel create mode 100644 bazel/third_party/event/event.BUILD create mode 100644 bazel/third_party/glog/0001-mark-override-resolve-warning.patch create mode 100644 bazel/third_party/glog/BUILD.bazel create mode 100644 bazel/third_party/leveldb/BUILD.bazel create mode 100644 bazel/third_party/leveldb/leveldb.BUILD create mode 100644 bazel/third_party/leveldb/port.h create mode 100644 bazel/third_party/leveldb/port_config.h create mode 100644 bazel/third_party/openssl/BUILD.bazel create mode 100644 bazel/third_party/openssl/openssl.BUILD create mode 100644 bazel/third_party/protobuf/BUILD.bazel create mode 100644 bazel/third_party/protobuf/protobuf.BUILD create mode 100644 bazel/third_party/snappy/BUILD.bazel create mode 100644 bazel/third_party/snappy/snappy.BUILD create mode 100644 bazel/third_party/thrift/BUILD.bazel create mode 100644 bazel/third_party/thrift/thrift.BUILD create mode 100644 bazel/third_party/zlib/BUILD.bazel create mode 100644 bazel/third_party/zlib/zlib.BUILD create mode 100644 bazel/tools/BUILD.bazel create mode 100644 bazel/tools/brpc_proto_library.bzl create mode 100644 bazel/tools/proto_gen.bzl create mode 100644 cmake/CMakeLists.download_gtest.in create mode 100644 cmake/CompileProto.cmake create mode 100644 cmake/FindBoringSSL.cmake create mode 100644 cmake/FindGFLAGS.cmake create mode 100644 cmake/FindGperftools.cmake create mode 100644 cmake/SetupGtest.cmake create mode 100644 cmake/brpc.pc.in create mode 100755 community/apache-package-validator.sh create mode 100644 community/cases.md create mode 100644 community/logo-bRPC.svg create mode 100644 community/newcommitter_cn.md create mode 100644 community/newcommitter_en.md create mode 100644 community/oncall.md create mode 100644 community/release_cn.md create mode 100644 community/release_en.md create mode 100644 community/release_schedule.md create mode 100644 community/releasecheck.md create mode 100644 community/releasecheck.png create mode 100644 community/releasefail.png create mode 100644 config.h.in create mode 100755 config_brpc.sh create mode 100644 docs/cn/atomic_instructions.md create mode 100644 docs/cn/auto_concurrency_limiter.md create mode 100644 docs/cn/avalanche.md create mode 100644 docs/cn/backup_request.md create mode 100644 docs/cn/baidu_std.md create mode 100644 docs/cn/bazel_support.md create mode 100644 docs/cn/benchmark.md create mode 100644 docs/cn/benchmark_http.md create mode 100644 docs/cn/brpc_intro.pptx create mode 100644 docs/cn/bthread.md create mode 100644 docs/cn/bthread_id.md create mode 100644 docs/cn/bthread_or_not.md create mode 100644 docs/cn/bthread_tagged_task_group.md create mode 100644 docs/cn/bthread_tracer.md create mode 100644 docs/cn/builtin_service.md create mode 100644 docs/cn/bvar.md create mode 100644 docs/cn/bvar_c++.md create mode 100644 docs/cn/case_apicontrol.md create mode 100644 docs/cn/case_baidu_dsp.md create mode 100644 docs/cn/case_elf.md create mode 100644 docs/cn/case_ubrpc.md create mode 100644 docs/cn/circuit_breaker.md create mode 100755 docs/cn/client.md create mode 100644 docs/cn/combo_channel.md create mode 100644 docs/cn/connections.md create mode 100644 docs/cn/consistent_hashing.md create mode 100644 docs/cn/contention_profiler.md create mode 100644 docs/cn/coroutine.md create mode 100644 docs/cn/couchbase_example.md create mode 100644 docs/cn/cpu_profiler.md create mode 100644 docs/cn/dummy_server.md create mode 100644 docs/cn/endpoint.md create mode 100644 docs/cn/error_code.md create mode 100644 docs/cn/execution_queue.md create mode 100644 docs/cn/flags.md create mode 100644 docs/cn/flatmap.md create mode 100644 docs/cn/getting_started.md create mode 100644 docs/cn/heap_profiler.md create mode 100644 docs/cn/http_client.md create mode 100644 docs/cn/http_derivatives.md create mode 100644 docs/cn/http_service.md create mode 100644 docs/cn/io.md create mode 100644 docs/cn/iobuf.md create mode 100644 docs/cn/json2pb.md create mode 100644 docs/cn/lalb.md create mode 100644 docs/cn/load_balancing.md create mode 100644 docs/cn/mbvar_c++.md create mode 100644 docs/cn/memcache_client.md create mode 100644 docs/cn/memory_management.md create mode 100644 docs/cn/mysql_client.md create mode 100644 docs/cn/new_protocol.md create mode 100644 docs/cn/nshead_service.md create mode 100644 docs/cn/overview.md create mode 100644 docs/cn/parallel_http.md create mode 100644 docs/cn/rdma.md create mode 100644 docs/cn/redis_client.md create mode 100644 docs/cn/rpc_press.md create mode 100644 docs/cn/rpc_replay.md create mode 100644 docs/cn/rpc_view.md create mode 100644 docs/cn/rpcz.md create mode 100644 docs/cn/sanitizers.md create mode 100644 docs/cn/server.md create mode 100644 docs/cn/server_debugging.md create mode 100644 docs/cn/server_push.md create mode 100644 docs/cn/status.md create mode 100644 docs/cn/streaming_log.md create mode 100644 docs/cn/streaming_rpc.md create mode 100644 docs/cn/thread_local.md create mode 100644 docs/cn/threading_overview.md create mode 100755 docs/cn/thrift.md create mode 100644 docs/cn/timeout_concurrency_limiter.md create mode 100644 docs/cn/timer_keeping.md create mode 100644 docs/cn/ub_client.md create mode 100644 docs/cn/vars.md create mode 100644 docs/cn/wireshark_baidu_std.md create mode 100644 docs/en/atomic_instructions.md create mode 100644 docs/en/auto_concurrency_limiter.md create mode 100644 docs/en/avalanche.md create mode 100644 docs/en/backup_request.md create mode 100644 docs/en/baidu_std.md create mode 100644 docs/en/bazel_support.md create mode 100644 docs/en/benchmark.md create mode 100644 docs/en/benchmark_http.md create mode 100644 docs/en/brpc_internal.pptx create mode 100644 docs/en/bthread.md create mode 100644 docs/en/bthread_id.md create mode 100644 docs/en/bthread_or_not.md create mode 100644 docs/en/bthread_tagged_task_group.md create mode 100644 docs/en/bthread_tracer.md create mode 100644 docs/en/builtin_service.md create mode 100644 docs/en/bvar.md create mode 100644 docs/en/bvar_c++.md create mode 100644 docs/en/case_apicontrol.md create mode 100644 docs/en/case_baidu_dsp.md create mode 100644 docs/en/case_elf.md create mode 100644 docs/en/case_ubrpc.md create mode 100644 docs/en/circuit_breaker.md create mode 100644 docs/en/client.md create mode 100644 docs/en/combo_channel.md create mode 100644 docs/en/connections.md create mode 100644 docs/en/consistent_hashing.md create mode 100644 docs/en/contention_profiler.md create mode 100644 docs/en/coroutine.md create mode 100644 docs/en/couchbase_example.md create mode 100644 docs/en/cpu_profiler.md create mode 100644 docs/en/dummy_server.md create mode 100644 docs/en/endpoint.md create mode 100644 docs/en/error_code.md create mode 100644 docs/en/execution_queue.md create mode 100644 docs/en/flags.md create mode 100644 docs/en/flatmap.md create mode 100644 docs/en/getting_started.md create mode 100644 docs/en/heap_profiler.md create mode 100644 docs/en/http_client.md create mode 100644 docs/en/http_derivatives.md create mode 100644 docs/en/http_service.md create mode 100644 docs/en/io.md create mode 100644 docs/en/iobuf.md create mode 100644 docs/en/json2pb.md create mode 100644 docs/en/lalb.md create mode 100644 docs/en/load_balancing.md create mode 100644 docs/en/mbvar_c++.md create mode 100644 docs/en/memcache_client.md create mode 100644 docs/en/memory_management.md create mode 100644 docs/en/new_protocol.md create mode 100644 docs/en/nshead_service.md create mode 100644 docs/en/overview.md create mode 100644 docs/en/parallel_http.md create mode 100644 docs/en/rdma.md create mode 100644 docs/en/redis_client.md create mode 100644 docs/en/rpc_press.md create mode 100644 docs/en/rpc_replay.md create mode 100644 docs/en/rpc_view.md create mode 100644 docs/en/rpcz.md create mode 100644 docs/en/sanitizers.md create mode 100644 docs/en/server.md create mode 100644 docs/en/server_debugging.md create mode 100644 docs/en/server_push.md create mode 100644 docs/en/status.md create mode 100644 docs/en/streaming_log.md create mode 100644 docs/en/streaming_rpc.md create mode 100644 docs/en/thread_local.md create mode 100644 docs/en/threading_overview.md create mode 100755 docs/en/thrift.md create mode 100644 docs/en/timeout_concurrency_limiter.md create mode 100644 docs/en/timer_keeping.md create mode 100644 docs/en/tutorial_on_building_services.pptx create mode 100644 docs/en/ub_client.md create mode 100644 docs/en/vars.md create mode 100644 docs/en/wireshark_baidu_std.md create mode 100644 docs/images/302.png create mode 100644 docs/images/apicontrol_compare_1.png create mode 100644 docs/images/apicontrol_compare_2.png create mode 100644 docs/images/apicontrol_compare_3.png create mode 100644 docs/images/apicontrol_compare_4.png create mode 100644 docs/images/apicontrol_compare_5.png create mode 100644 docs/images/backup_request_1.png create mode 100644 docs/images/backup_request_2.png create mode 100644 docs/images/backup_request_3.png create mode 100644 docs/images/backup_request_4.png create mode 100644 docs/images/baidu_dsp_compare_1.png create mode 100644 docs/images/baidu_dsp_compare_10.png create mode 100644 docs/images/baidu_dsp_compare_2.png create mode 100644 docs/images/baidu_dsp_compare_3.png create mode 100644 docs/images/baidu_dsp_compare_4.png create mode 100644 docs/images/baidu_dsp_compare_5.png create mode 100644 docs/images/baidu_dsp_compare_6.png create mode 100644 docs/images/baidu_dsp_compare_7.png create mode 100644 docs/images/baidu_dsp_compare_8.png create mode 100644 docs/images/baidu_dsp_compare_9.png create mode 100644 docs/images/bthread_concurrency_1.png create mode 100644 docs/images/bthread_concurrency_2.png create mode 100644 docs/images/bthread_concurrency_3.png create mode 100644 docs/images/bthread_creation_qps.png create mode 100644 docs/images/bthread_status_model.svg create mode 100644 docs/images/bthread_stb_model.svg create mode 100644 docs/images/bthread_tagged_increment_all.png create mode 100644 docs/images/bthread_tagged_increment_tag1.png create mode 100644 docs/images/bthread_tagged_worker_usage.png create mode 100644 docs/images/builtin_service_from_console.png create mode 100644 docs/images/builtin_service_more.png create mode 100644 docs/images/bvar_dump_flags.png create mode 100644 docs/images/bvar_dump_flags_2.png create mode 100644 docs/images/bvar_flow.png create mode 100644 docs/images/bvar_noah1.png create mode 100644 docs/images/bvar_noah2.png create mode 100644 docs/images/bvar_noah3.png create mode 100644 docs/images/bvar_perf.png create mode 100644 docs/images/chash.png create mode 100644 docs/images/client_side.png create mode 100644 docs/images/cmd_jeprof_text.png create mode 100644 docs/images/connection_timedout.png create mode 100644 docs/images/curl_jeprof_flamegraph.png create mode 100644 docs/images/curl_jeprof_svg.png create mode 100644 docs/images/curl_jeprof_text.png create mode 100644 docs/images/dummy_server_1.png create mode 100644 docs/images/dummy_server_2.png create mode 100644 docs/images/dummy_server_3.png create mode 100644 docs/images/echo_cpu_profiling.png create mode 100644 docs/images/flag_setvalue.png create mode 100644 docs/images/foobar_bvar.png create mode 100644 docs/images/foobar_latency_cdf.png create mode 100644 docs/images/full_worker_usage.png create mode 100644 docs/images/full_worker_usage_2.png create mode 100644 docs/images/growth_profiler.png create mode 100644 docs/images/health_service.png create mode 100644 docs/images/heap_profiler_1.png create mode 100644 docs/images/heap_profiler_2.png create mode 100644 docs/images/heap_profiler_3.gif create mode 100644 docs/images/high_cpu_usage.png create mode 100644 docs/images/je_stats_print.png create mode 100644 docs/images/lalb_1.png create mode 100644 docs/images/lalb_2.png create mode 100644 docs/images/lalb_3.png create mode 100644 docs/images/lalb_4.png create mode 100644 docs/images/lalb_5.png create mode 100644 docs/images/latency_cdf.png create mode 100644 docs/images/lb.png create mode 100644 docs/images/logo-white.png create mode 100644 docs/images/logo.png create mode 100644 docs/images/multi_client_latency_cdf.png create mode 100644 docs/images/multi_server_latency_cdf.png create mode 100644 docs/images/normal_cpu_usage.png create mode 100644 docs/images/normal_worker_usage.png create mode 100644 docs/images/ns.png create mode 100644 docs/images/ns_access_interval.png create mode 100644 docs/images/ns_filter.jpg create mode 100644 docs/images/pchan.png create mode 100644 docs/images/pooled_conn.png create mode 100644 docs/images/protobufs_service.png create mode 100644 docs/images/qps_vs_multi_client.png create mode 100644 docs/images/qps_vs_reqsize.png create mode 100644 docs/images/qps_vs_threadnum.png create mode 100644 docs/images/raft_contention_1.png create mode 100644 docs/images/raft_contention_2.png create mode 100644 docs/images/raft_contention_3.png create mode 100644 docs/images/register_lb.png create mode 100644 docs/images/register_ns.png create mode 100644 docs/images/reloadable_flags.png create mode 100644 docs/images/resource_pool.png create mode 100644 docs/images/restful_1.png create mode 100644 docs/images/restful_2.png create mode 100644 docs/images/restful_3.png create mode 100644 docs/images/rpc.png create mode 100644 docs/images/rpc_flow.png create mode 100644 docs/images/rpc_press_1.png create mode 100644 docs/images/rpc_press_2.png create mode 100644 docs/images/rpc_replay_1.png create mode 100644 docs/images/rpc_replay_2.png create mode 100644 docs/images/rpc_replay_3.png create mode 100644 docs/images/rpc_replay_4.png create mode 100644 docs/images/rpc_replay_5.png create mode 100644 docs/images/rpc_view_1.png create mode 100644 docs/images/rpc_view_2.png create mode 100644 docs/images/rpc_view_3.png create mode 100644 docs/images/rpcz.png create mode 100644 docs/images/rpcz_2.png create mode 100644 docs/images/rpcz_3.png create mode 100644 docs/images/rpcz_4.png create mode 100644 docs/images/rpcz_5.png create mode 100644 docs/images/rpcz_6.png create mode 100644 docs/images/rpcz_7.png create mode 100644 docs/images/server_side.png create mode 100644 docs/images/set_flag_invalid_value.png create mode 100644 docs/images/set_flag_reject.png create mode 100644 docs/images/set_flag_with_form.png create mode 100644 docs/images/set_flag_with_form_2.png create mode 100644 docs/images/set_flag_with_form_3.png create mode 100644 docs/images/short_conn.png create mode 100644 docs/images/single_conn.png create mode 100644 docs/images/status.png create mode 100644 docs/images/status_2.png create mode 100644 docs/images/tcmalloc_stuck.png create mode 100644 docs/images/the_r_after_flag.png create mode 100644 docs/images/threading_overview_1.png create mode 100644 docs/images/threading_overview_2.png create mode 100644 docs/images/trace_printf.png create mode 100644 docs/images/twolevel_server_latency_cdf.png create mode 100644 docs/images/ubrpc_compare_1.png create mode 100644 docs/images/ubrpc_compare_2.png create mode 100644 docs/images/vars_1.gif create mode 100644 docs/images/vars_2.gif create mode 100644 docs/images/vars_3.gif create mode 100644 docs/images/vars_4.png create mode 100644 docs/images/vars_5.png create mode 100644 docs/images/vars_6.png create mode 100644 docs/images/vars_7.png create mode 100644 docs/images/version_service.png create mode 100644 docs/images/vlog_service.png create mode 100644 docs/images/wireshark_baidu_std_request.png create mode 100644 docs/images/wireshark_baidu_std_response.png create mode 100644 docs/images/wireshark_folders.png create mode 100644 docs/images/wireshark_protobuf_search_paths.png create mode 100644 docs/images/wireshark_protobuf_settings.png create mode 100644 docs/images/write.png create mode 100644 example/BUILD.bazel create mode 100644 example/asynchronous_echo_c++/CMakeLists.txt create mode 100644 example/asynchronous_echo_c++/client.cpp create mode 100644 example/asynchronous_echo_c++/echo.proto create mode 100644 example/asynchronous_echo_c++/server.cpp create mode 100644 example/auto_concurrency_limiter/CMakeLists.txt create mode 100644 example/auto_concurrency_limiter/cl_test.proto create mode 100644 example/auto_concurrency_limiter/client.cpp create mode 100644 example/auto_concurrency_limiter/dummy_server.port create mode 100644 example/auto_concurrency_limiter/server.cpp create mode 100644 example/auto_concurrency_limiter/settings.flags create mode 100644 example/auto_concurrency_limiter/test_case.json create mode 100644 example/backup_request_c++/CMakeLists.txt create mode 100644 example/backup_request_c++/client.cpp create mode 100644 example/backup_request_c++/echo.proto create mode 100644 example/backup_request_c++/server.cpp create mode 100644 example/baidu_proxy_and_generic_call/CMakeLists.txt create mode 100644 example/baidu_proxy_and_generic_call/client.cpp create mode 100644 example/baidu_proxy_and_generic_call/echo.proto create mode 100644 example/baidu_proxy_and_generic_call/proxy.cpp create mode 100644 example/baidu_proxy_and_generic_call/server.cpp create mode 100644 example/bthread_tag_echo_c++/CMakeLists.txt create mode 100644 example/bthread_tag_echo_c++/client.cpp create mode 100644 example/bthread_tag_echo_c++/echo.proto create mode 100644 example/bthread_tag_echo_c++/server.cpp create mode 100644 example/build_with_bazel/BUILD.bazel create mode 100644 example/build_with_bazel/brpc_workspace.bzl create mode 100644 example/build_with_bazel/leveldb.BUILD create mode 100644 example/build_with_bazel/openssl.BUILD create mode 100644 example/build_with_bazel/protobuf.BUILD create mode 100644 example/build_with_bazel/test.cc create mode 100644 example/build_with_bazel/zlib.BUILD create mode 100644 example/build_with_old_bazel/BUILD.bazel create mode 100644 example/build_with_old_bazel/leveldb.BUILD create mode 100644 example/build_with_old_bazel/openssl.BUILD create mode 100644 example/build_with_old_bazel/zlib.BUILD create mode 100644 example/cancel_c++/CMakeLists.txt create mode 100644 example/cancel_c++/client.cpp create mode 100644 example/cancel_c++/echo.proto create mode 100644 example/cancel_c++/server.cpp create mode 100644 example/cascade_echo_c++/CMakeLists.txt create mode 100644 example/cascade_echo_c++/client.cpp create mode 100644 example/cascade_echo_c++/echo.proto create mode 100644 example/cascade_echo_c++/server.cpp create mode 100644 example/cmake/BrpcExample.cmake create mode 100644 example/coroutine/coroutine_server.cpp create mode 100644 example/coroutine/echo.proto create mode 100644 example/couchbase_c++/couchbase_client.cpp create mode 100644 example/couchbase_c++/multithreaded_couchbase_client.cpp create mode 100644 example/couchbase_c++/traditional_brpc_couchbase_client.cpp create mode 100644 example/dynamic_partition_echo_c++/CMakeLists.txt create mode 100644 example/dynamic_partition_echo_c++/client.cpp create mode 100644 example/dynamic_partition_echo_c++/echo.proto create mode 100644 example/dynamic_partition_echo_c++/server.cpp create mode 100644 example/echo_c++/CMakeLists.txt create mode 100644 example/echo_c++/client.cpp create mode 100644 example/echo_c++/echo.proto create mode 100644 example/echo_c++/server.cpp create mode 100644 example/grpc_c++/CMakeLists.txt create mode 100644 example/grpc_c++/client.cpp create mode 100644 example/grpc_c++/helloworld.proto create mode 100644 example/grpc_c++/server.cpp create mode 100644 example/http_c++/CMakeLists.txt create mode 100644 example/http_c++/benchmark_http.cpp create mode 100644 example/http_c++/cert.pem create mode 100644 example/http_c++/http.proto create mode 100644 example/http_c++/http_client.cpp create mode 100644 example/http_c++/http_server.cpp create mode 100644 example/http_c++/key.pem create mode 100644 example/memcache_c++/CMakeLists.txt create mode 100644 example/memcache_c++/client.cpp create mode 100644 example/multi_threaded_echo_c++/CMakeLists.txt create mode 100644 example/multi_threaded_echo_c++/cert.pem create mode 100644 example/multi_threaded_echo_c++/client.cpp create mode 100644 example/multi_threaded_echo_c++/echo.proto create mode 100644 example/multi_threaded_echo_c++/key.pem create mode 100644 example/multi_threaded_echo_c++/server.cpp create mode 100644 example/multi_threaded_echo_fns_c++/CMakeLists.txt create mode 100644 example/multi_threaded_echo_fns_c++/client.cpp create mode 100644 example/multi_threaded_echo_fns_c++/echo.proto create mode 100644 example/multi_threaded_echo_fns_c++/random_kill.sh create mode 100644 example/multi_threaded_echo_fns_c++/server.cpp create mode 100644 example/mysql_c++/CMakeLists.txt create mode 100644 example/mysql_c++/mysql_cli.cpp create mode 100644 example/mysql_c++/mysql_go_press.go create mode 100644 example/mysql_c++/mysql_press.cpp create mode 100644 example/mysql_c++/mysql_stmt.cpp create mode 100644 example/mysql_c++/mysql_tx.cpp create mode 100644 example/mysql_c++/mysqlclient_press.cpp create mode 100644 example/nshead_extension_c++/CMakeLists.txt create mode 100644 example/nshead_extension_c++/client.cpp create mode 100644 example/nshead_extension_c++/server.cpp create mode 100644 example/nshead_pb_extension_c++/CMakeLists.txt create mode 100644 example/nshead_pb_extension_c++/client.cpp create mode 100644 example/nshead_pb_extension_c++/echo.proto create mode 100644 example/nshead_pb_extension_c++/server.cpp create mode 100644 example/parallel_echo_c++/CMakeLists.txt create mode 100644 example/parallel_echo_c++/client.cpp create mode 100644 example/parallel_echo_c++/echo.proto create mode 100644 example/parallel_echo_c++/server.cpp create mode 100644 example/partition_echo_c++/CMakeLists.txt create mode 100644 example/partition_echo_c++/client.cpp create mode 100644 example/partition_echo_c++/echo.proto create mode 100644 example/partition_echo_c++/server.cpp create mode 100644 example/rdma_performance/CMakeLists.txt create mode 100644 example/rdma_performance/client.cpp create mode 100644 example/rdma_performance/server.cpp create mode 100644 example/rdma_performance/test.proto create mode 100644 example/redis_c++/CMakeLists.txt create mode 100644 example/redis_c++/redis_cli.cpp create mode 100644 example/redis_c++/redis_cluster_client.cpp create mode 100644 example/redis_c++/redis_press.cpp create mode 100644 example/redis_c++/redis_server.cpp create mode 100644 example/rpcz_echo_c++/CMakeLists.txt create mode 100644 example/rpcz_echo_c++/client.cpp create mode 100644 example/rpcz_echo_c++/echo.proto create mode 100644 example/rpcz_echo_c++/server.cpp create mode 100644 example/selective_echo_c++/CMakeLists.txt create mode 100644 example/selective_echo_c++/client.cpp create mode 100644 example/selective_echo_c++/echo.proto create mode 100644 example/selective_echo_c++/server.cpp create mode 100644 example/session_data_and_thread_local/CMakeLists.txt create mode 100644 example/session_data_and_thread_local/client.cpp create mode 100644 example/session_data_and_thread_local/echo.proto create mode 100644 example/session_data_and_thread_local/server.cpp create mode 100644 example/streaming_batch_echo_c++/CMakeLists.txt create mode 100644 example/streaming_batch_echo_c++/client.cpp create mode 100644 example/streaming_batch_echo_c++/echo.proto create mode 100644 example/streaming_batch_echo_c++/server.cpp create mode 100644 example/streaming_echo_c++/CMakeLists.txt create mode 100644 example/streaming_echo_c++/client.cpp create mode 100644 example/streaming_echo_c++/echo.proto create mode 100644 example/streaming_echo_c++/server.cpp create mode 100644 example/thrift_extension_c++/README.md create mode 100755 example/thrift_extension_c++/client.cpp create mode 100644 example/thrift_extension_c++/client2.cpp create mode 100644 example/thrift_extension_c++/echo.thrift create mode 100644 example/thrift_extension_c++/native_client.cpp create mode 100755 example/thrift_extension_c++/native_server.cpp create mode 100755 example/thrift_extension_c++/server.cpp create mode 100755 example/thrift_extension_c++/server2.cpp create mode 100644 homebrew-formula/protobuf.rb create mode 100644 package/rpm/brpc.spec create mode 100644 registry/modules/libunwind/1.8.1.brpc-no-unwind/MODULE.bazel create mode 100644 registry/modules/libunwind/1.8.1.brpc-no-unwind/overlay/BUILD.bazel create mode 100644 registry/modules/libunwind/1.8.1.brpc-no-unwind/overlay/MODULE.bazel create mode 100644 registry/modules/libunwind/1.8.1.brpc-no-unwind/presubmit.yml create mode 100644 registry/modules/libunwind/1.8.1.brpc-no-unwind/source.json create mode 100644 registry/modules/libunwind/1.8.3.brpc-no-unwind/MODULE.bazel create mode 100644 registry/modules/libunwind/1.8.3.brpc-no-unwind/overlay/BUILD.bazel create mode 100644 registry/modules/libunwind/1.8.3.brpc-no-unwind/overlay/MODULE.bazel create mode 100644 registry/modules/libunwind/1.8.3.brpc-no-unwind/presubmit.yml create mode 100644 registry/modules/libunwind/1.8.3.brpc-no-unwind/source.json create mode 100644 registry/modules/libunwind/metadata.json create mode 100644 src/CMakeLists.txt create mode 100644 src/brpc/acceptor.cpp create mode 100644 src/brpc/acceptor.h create mode 100644 src/brpc/adaptive_connection_type.cpp create mode 100644 src/brpc/adaptive_connection_type.h create mode 100644 src/brpc/adaptive_max_concurrency.cpp create mode 100644 src/brpc/adaptive_max_concurrency.h create mode 100644 src/brpc/adaptive_protocol_type.h create mode 100644 src/brpc/amf.cpp create mode 100644 src/brpc/amf.h create mode 100644 src/brpc/amf_inl.h create mode 100644 src/brpc/authenticator.h create mode 100644 src/brpc/backup_request_policy.cpp create mode 100644 src/brpc/backup_request_policy.h create mode 100644 src/brpc/baidu_master_service.cpp create mode 100644 src/brpc/baidu_master_service.h create mode 100644 src/brpc/builtin/bad_method_service.cpp create mode 100644 src/brpc/builtin/bad_method_service.h create mode 100644 src/brpc/builtin/bthreads_service.cpp create mode 100644 src/brpc/builtin/bthreads_service.h create mode 100644 src/brpc/builtin/common.cpp create mode 100644 src/brpc/builtin/common.h create mode 100644 src/brpc/builtin/connections_service.cpp create mode 100644 src/brpc/builtin/connections_service.h create mode 100644 src/brpc/builtin/dir_service.cpp create mode 100644 src/brpc/builtin/dir_service.h create mode 100644 src/brpc/builtin/flags_service.cpp create mode 100644 src/brpc/builtin/flags_service.h create mode 100644 src/brpc/builtin/flot_min_js.cpp create mode 100644 src/brpc/builtin/flot_min_js.h create mode 100644 src/brpc/builtin/get_favicon_service.cpp create mode 100644 src/brpc/builtin/get_favicon_service.h create mode 100644 src/brpc/builtin/get_js_service.cpp create mode 100644 src/brpc/builtin/get_js_service.h create mode 100644 src/brpc/builtin/grpc_health_check_service.cpp create mode 100644 src/brpc/builtin/grpc_health_check_service.h create mode 100644 src/brpc/builtin/health_service.cpp create mode 100644 src/brpc/builtin/health_service.h create mode 100644 src/brpc/builtin/hotspots_service.cpp create mode 100644 src/brpc/builtin/hotspots_service.h create mode 100644 src/brpc/builtin/ids_service.cpp create mode 100644 src/brpc/builtin/ids_service.h create mode 100644 src/brpc/builtin/index_service.cpp create mode 100644 src/brpc/builtin/index_service.h create mode 100644 src/brpc/builtin/jquery_min_js.cpp create mode 100644 src/brpc/builtin/jquery_min_js.h create mode 100644 src/brpc/builtin/list_service.cpp create mode 100644 src/brpc/builtin/list_service.h create mode 100644 src/brpc/builtin/memory_service.cpp create mode 100644 src/brpc/builtin/memory_service.h create mode 100644 src/brpc/builtin/pprof_perl.cpp create mode 100644 src/brpc/builtin/pprof_perl.h create mode 100644 src/brpc/builtin/pprof_service.cpp create mode 100644 src/brpc/builtin/pprof_service.h create mode 100644 src/brpc/builtin/prometheus_metrics_service.cpp create mode 100644 src/brpc/builtin/prometheus_metrics_service.h create mode 100644 src/brpc/builtin/protobufs_service.cpp create mode 100644 src/brpc/builtin/protobufs_service.h create mode 100644 src/brpc/builtin/rpcz_service.cpp create mode 100644 src/brpc/builtin/rpcz_service.h create mode 100644 src/brpc/builtin/sockets_service.cpp create mode 100644 src/brpc/builtin/sockets_service.h create mode 100644 src/brpc/builtin/sorttable_js.cpp create mode 100644 src/brpc/builtin/sorttable_js.h create mode 100644 src/brpc/builtin/status_service.cpp create mode 100644 src/brpc/builtin/status_service.h create mode 100644 src/brpc/builtin/tabbed.h create mode 100644 src/brpc/builtin/threads_service.cpp create mode 100644 src/brpc/builtin/threads_service.h create mode 100644 src/brpc/builtin/vars_service.cpp create mode 100644 src/brpc/builtin/vars_service.h create mode 100644 src/brpc/builtin/version_service.cpp create mode 100644 src/brpc/builtin/version_service.h create mode 100644 src/brpc/builtin/viz_min_js.cpp create mode 100644 src/brpc/builtin/viz_min_js.h create mode 100644 src/brpc/builtin/vlog_service.cpp create mode 100644 src/brpc/builtin/vlog_service.h create mode 100644 src/brpc/builtin_service.proto create mode 100644 src/brpc/callback.h create mode 100644 src/brpc/channel.cpp create mode 100644 src/brpc/channel.h create mode 100644 src/brpc/channel_base.h create mode 100644 src/brpc/checksum.cpp create mode 100644 src/brpc/checksum.h create mode 100644 src/brpc/circuit_breaker.cpp create mode 100644 src/brpc/circuit_breaker.h create mode 100644 src/brpc/closure_guard.h create mode 100644 src/brpc/cluster_recover_policy.cpp create mode 100644 src/brpc/cluster_recover_policy.h create mode 100644 src/brpc/compress.cpp create mode 100644 src/brpc/compress.h create mode 100644 src/brpc/concurrency_limiter.h create mode 100644 src/brpc/controller.cpp create mode 100644 src/brpc/controller.h create mode 100644 src/brpc/coroutine.h create mode 100644 src/brpc/coroutine_inl.h create mode 100644 src/brpc/couchbase.cpp create mode 100644 src/brpc/couchbase.h create mode 100644 src/brpc/data_factory.h create mode 100644 src/brpc/describable.h create mode 100644 src/brpc/destroyable.h create mode 100644 src/brpc/details/controller_private_accessor.h create mode 100644 src/brpc/details/has_epollrdhup.cpp create mode 100644 src/brpc/details/has_epollrdhup.h create mode 100644 src/brpc/details/health_check.cpp create mode 100644 src/brpc/details/health_check.h create mode 100644 src/brpc/details/hpack-static-table.h create mode 100644 src/brpc/details/hpack.cpp create mode 100644 src/brpc/details/hpack.h create mode 100644 src/brpc/details/http_message.cpp create mode 100644 src/brpc/details/http_message.h create mode 100644 src/brpc/details/http_parser.cpp create mode 100644 src/brpc/details/http_parser.h create mode 100644 src/brpc/details/jemalloc_profiler.cpp create mode 100644 src/brpc/details/jemalloc_profiler.h create mode 100644 src/brpc/details/load_balancer_with_naming.cpp create mode 100644 src/brpc/details/load_balancer_with_naming.h create mode 100644 src/brpc/details/mesalink_ssl_helper.cpp create mode 100644 src/brpc/details/method_status.cpp create mode 100644 src/brpc/details/method_status.h create mode 100644 src/brpc/details/naming_service_thread.cpp create mode 100644 src/brpc/details/naming_service_thread.h create mode 100644 src/brpc/details/profiler_linker.h create mode 100644 src/brpc/details/rtmp_utils.cpp create mode 100644 src/brpc/details/rtmp_utils.h create mode 100644 src/brpc/details/server_private_accessor.h create mode 100644 src/brpc/details/sparse_minute_counter.h create mode 100644 src/brpc/details/ssl_helper.cpp create mode 100644 src/brpc/details/ssl_helper.h create mode 100644 src/brpc/details/tcmalloc_extension.cpp create mode 100644 src/brpc/details/tcmalloc_extension.h create mode 100644 src/brpc/details/usercode_backup_pool.cpp create mode 100644 src/brpc/details/usercode_backup_pool.h create mode 100644 src/brpc/errno.proto create mode 100644 src/brpc/esp_head.h create mode 100644 src/brpc/esp_message.cpp create mode 100644 src/brpc/esp_message.h create mode 100644 src/brpc/event_dispatcher.cpp create mode 100644 src/brpc/event_dispatcher.h create mode 100644 src/brpc/event_dispatcher_epoll.cpp create mode 100644 src/brpc/event_dispatcher_kqueue.cpp create mode 100644 src/brpc/excluded_servers.h create mode 100644 src/brpc/extension.h create mode 100644 src/brpc/extension_inl.h create mode 100644 src/brpc/get_favicon.proto create mode 100644 src/brpc/get_js.proto create mode 100644 src/brpc/global.cpp create mode 100644 src/brpc/global.h create mode 100644 src/brpc/grpc.cpp create mode 100644 src/brpc/grpc.h create mode 100644 src/brpc/grpc_health_check.proto create mode 100644 src/brpc/health_check_option.h create mode 100644 src/brpc/health_reporter.h create mode 100644 src/brpc/http2.cpp create mode 100644 src/brpc/http2.h create mode 100644 src/brpc/http_header.cpp create mode 100644 src/brpc/http_header.h create mode 100644 src/brpc/http_method.cpp create mode 100644 src/brpc/http_method.h create mode 100644 src/brpc/http_status_code.cpp create mode 100644 src/brpc/http_status_code.h create mode 100644 src/brpc/input_message_base.h create mode 100644 src/brpc/input_messenger.cpp create mode 100644 src/brpc/input_messenger.h create mode 100644 src/brpc/interceptor.h create mode 100644 src/brpc/kvmap.h create mode 100644 src/brpc/load_balancer.cpp create mode 100644 src/brpc/load_balancer.h create mode 100644 src/brpc/log.h create mode 100644 src/brpc/memcache.cpp create mode 100644 src/brpc/memcache.h create mode 100644 src/brpc/mongo_head.h create mode 100644 src/brpc/mongo_service_adaptor.h create mode 100644 src/brpc/naming_service.h create mode 100644 src/brpc/naming_service_filter.h create mode 100644 src/brpc/nonreflectable_message.h create mode 100644 src/brpc/nshead.h create mode 100644 src/brpc/nshead_message.cpp create mode 100644 src/brpc/nshead_message.h create mode 100644 src/brpc/nshead_meta.proto create mode 100644 src/brpc/nshead_pb_service_adaptor.cpp create mode 100644 src/brpc/nshead_pb_service_adaptor.h create mode 100644 src/brpc/nshead_service.cpp create mode 100644 src/brpc/nshead_service.h create mode 100644 src/brpc/options.proto create mode 100644 src/brpc/parallel_channel.cpp create mode 100644 src/brpc/parallel_channel.h create mode 100644 src/brpc/parse_result.h create mode 100644 src/brpc/partition_channel.cpp create mode 100644 src/brpc/partition_channel.h create mode 100644 src/brpc/pb_compat.h create mode 100644 src/brpc/periodic_naming_service.cpp create mode 100644 src/brpc/periodic_naming_service.h create mode 100644 src/brpc/periodic_task.cpp create mode 100644 src/brpc/periodic_task.h create mode 100644 src/brpc/policy/auto_concurrency_limiter.cpp create mode 100644 src/brpc/policy/auto_concurrency_limiter.h create mode 100644 src/brpc/policy/baidu_naming_service.cpp create mode 100644 src/brpc/policy/baidu_naming_service.h create mode 100644 src/brpc/policy/baidu_rpc_meta.proto create mode 100644 src/brpc/policy/baidu_rpc_protocol.cpp create mode 100644 src/brpc/policy/baidu_rpc_protocol.h create mode 100644 src/brpc/policy/consistent_hashing_load_balancer.cpp create mode 100644 src/brpc/policy/consistent_hashing_load_balancer.h create mode 100644 src/brpc/policy/constant_concurrency_limiter.cpp create mode 100644 src/brpc/policy/constant_concurrency_limiter.h create mode 100644 src/brpc/policy/consul_naming_service.cpp create mode 100644 src/brpc/policy/consul_naming_service.h create mode 100644 src/brpc/policy/couchbase_authenticator.cpp create mode 100644 src/brpc/policy/couchbase_authenticator.h create mode 100644 src/brpc/policy/couchbase_protocol.cpp create mode 100644 src/brpc/policy/couchbase_protocol.h create mode 100644 src/brpc/policy/crc32c_checksum.cpp create mode 100644 src/brpc/policy/crc32c_checksum.h create mode 100644 src/brpc/policy/dh.cpp create mode 100644 src/brpc/policy/dh.h create mode 100644 src/brpc/policy/discovery_naming_service.cpp create mode 100644 src/brpc/policy/discovery_naming_service.h create mode 100644 src/brpc/policy/domain_naming_service.cpp create mode 100644 src/brpc/policy/domain_naming_service.h create mode 100644 src/brpc/policy/dynpart_load_balancer.cpp create mode 100644 src/brpc/policy/dynpart_load_balancer.h create mode 100644 src/brpc/policy/esp_authenticator.cpp create mode 100644 src/brpc/policy/esp_authenticator.h create mode 100644 src/brpc/policy/esp_protocol.cpp create mode 100644 src/brpc/policy/esp_protocol.h create mode 100644 src/brpc/policy/file_naming_service.cpp create mode 100644 src/brpc/policy/file_naming_service.h create mode 100644 src/brpc/policy/giano_authenticator.cpp create mode 100644 src/brpc/policy/giano_authenticator.h create mode 100644 src/brpc/policy/gzip_compress.cpp create mode 100644 src/brpc/policy/gzip_compress.h create mode 100644 src/brpc/policy/hasher.cpp create mode 100644 src/brpc/policy/hasher.h create mode 100644 src/brpc/policy/http2_rpc_protocol.cpp create mode 100644 src/brpc/policy/http2_rpc_protocol.h create mode 100644 src/brpc/policy/http_rpc_protocol.cpp create mode 100644 src/brpc/policy/http_rpc_protocol.h create mode 100644 src/brpc/policy/hulu_pbrpc_controller.h create mode 100644 src/brpc/policy/hulu_pbrpc_meta.proto create mode 100644 src/brpc/policy/hulu_pbrpc_protocol.cpp create mode 100644 src/brpc/policy/hulu_pbrpc_protocol.h create mode 100644 src/brpc/policy/list_naming_service.cpp create mode 100644 src/brpc/policy/list_naming_service.h create mode 100644 src/brpc/policy/locality_aware_load_balancer.cpp create mode 100644 src/brpc/policy/locality_aware_load_balancer.h create mode 100644 src/brpc/policy/memcache_binary_header.h create mode 100644 src/brpc/policy/memcache_binary_protocol.cpp create mode 100644 src/brpc/policy/memcache_binary_protocol.h create mode 100644 src/brpc/policy/mongo.proto create mode 100644 src/brpc/policy/mongo_protocol.cpp create mode 100644 src/brpc/policy/mongo_protocol.h create mode 100644 src/brpc/policy/most_common_message.h create mode 100644 src/brpc/policy/mysql/mysql.cpp create mode 100644 src/brpc/policy/mysql/mysql.h create mode 100644 src/brpc/policy/mysql/mysql_auth_handshake.cpp create mode 100644 src/brpc/policy/mysql/mysql_auth_handshake.h create mode 100644 src/brpc/policy/mysql/mysql_auth_packet.cpp create mode 100644 src/brpc/policy/mysql/mysql_auth_packet.h create mode 100644 src/brpc/policy/mysql/mysql_auth_scramble.cpp create mode 100644 src/brpc/policy/mysql/mysql_auth_scramble.h create mode 100644 src/brpc/policy/mysql/mysql_authenticator.cpp create mode 100644 src/brpc/policy/mysql/mysql_authenticator.h create mode 100644 src/brpc/policy/mysql/mysql_command.cpp create mode 100644 src/brpc/policy/mysql/mysql_command.h create mode 100644 src/brpc/policy/mysql/mysql_common.cpp create mode 100644 src/brpc/policy/mysql/mysql_common.h create mode 100644 src/brpc/policy/mysql/mysql_protocol.cpp create mode 100644 src/brpc/policy/mysql/mysql_protocol.h create mode 100644 src/brpc/policy/mysql/mysql_reply.cpp create mode 100644 src/brpc/policy/mysql/mysql_reply.h create mode 100644 src/brpc/policy/mysql/mysql_statement.cpp create mode 100644 src/brpc/policy/mysql/mysql_statement.h create mode 100644 src/brpc/policy/mysql/mysql_statement_inl.h create mode 100644 src/brpc/policy/mysql/mysql_transaction.cpp create mode 100644 src/brpc/policy/mysql/mysql_transaction.h create mode 100644 src/brpc/policy/nacos_naming_service.cpp create mode 100644 src/brpc/policy/nacos_naming_service.h create mode 100644 src/brpc/policy/nova_pbrpc_protocol.cpp create mode 100644 src/brpc/policy/nova_pbrpc_protocol.h create mode 100644 src/brpc/policy/nshead_mcpack_protocol.cpp create mode 100644 src/brpc/policy/nshead_mcpack_protocol.h create mode 100644 src/brpc/policy/nshead_protocol.cpp create mode 100644 src/brpc/policy/nshead_protocol.h create mode 100644 src/brpc/policy/p2c_ewma_load_balancer.cpp create mode 100644 src/brpc/policy/p2c_ewma_load_balancer.h create mode 100644 src/brpc/policy/public_pbrpc_meta.proto create mode 100644 src/brpc/policy/public_pbrpc_protocol.cpp create mode 100644 src/brpc/policy/public_pbrpc_protocol.h create mode 100644 src/brpc/policy/randomized_load_balancer.cpp create mode 100644 src/brpc/policy/randomized_load_balancer.h create mode 100644 src/brpc/policy/redis_authenticator.cpp create mode 100644 src/brpc/policy/redis_authenticator.h create mode 100644 src/brpc/policy/redis_protocol.cpp create mode 100644 src/brpc/policy/redis_protocol.h create mode 100644 src/brpc/policy/remote_file_naming_service.cpp create mode 100644 src/brpc/policy/remote_file_naming_service.h create mode 100644 src/brpc/policy/round_robin_load_balancer.cpp create mode 100644 src/brpc/policy/round_robin_load_balancer.h create mode 100644 src/brpc/policy/rtmp_protocol.cpp create mode 100644 src/brpc/policy/rtmp_protocol.h create mode 100644 src/brpc/policy/snappy_compress.cpp create mode 100644 src/brpc/policy/snappy_compress.h create mode 100644 src/brpc/policy/sofa_pbrpc_meta.proto create mode 100644 src/brpc/policy/sofa_pbrpc_protocol.cpp create mode 100644 src/brpc/policy/sofa_pbrpc_protocol.h create mode 100644 src/brpc/policy/streaming_rpc_protocol.cpp create mode 100644 src/brpc/policy/streaming_rpc_protocol.h create mode 100755 src/brpc/policy/thrift_protocol.cpp create mode 100755 src/brpc/policy/thrift_protocol.h create mode 100644 src/brpc/policy/timeout_concurrency_limiter.cpp create mode 100644 src/brpc/policy/timeout_concurrency_limiter.h create mode 100644 src/brpc/policy/ubrpc2pb_protocol.cpp create mode 100644 src/brpc/policy/ubrpc2pb_protocol.h create mode 100644 src/brpc/policy/weighted_randomized_load_balancer.cpp create mode 100644 src/brpc/policy/weighted_randomized_load_balancer.h create mode 100644 src/brpc/policy/weighted_round_robin_load_balancer.cpp create mode 100644 src/brpc/policy/weighted_round_robin_load_balancer.h create mode 100644 src/brpc/progressive_attachment.cpp create mode 100644 src/brpc/progressive_attachment.h create mode 100644 src/brpc/progressive_reader.h create mode 100644 src/brpc/proto_base.proto create mode 100644 src/brpc/protocol.cpp create mode 100644 src/brpc/protocol.h create mode 100644 src/brpc/rdma/block_pool.cpp create mode 100644 src/brpc/rdma/block_pool.h create mode 100644 src/brpc/rdma/rdma_endpoint.cpp create mode 100644 src/brpc/rdma/rdma_endpoint.h create mode 100644 src/brpc/rdma/rdma_handshake.cpp create mode 100644 src/brpc/rdma/rdma_handshake.h create mode 100644 src/brpc/rdma/rdma_handshake.proto create mode 100644 src/brpc/rdma/rdma_helper.cpp create mode 100644 src/brpc/rdma/rdma_helper.h create mode 100644 src/brpc/rdma_transport.cpp create mode 100644 src/brpc/rdma_transport.h create mode 100644 src/brpc/redis.cpp create mode 100644 src/brpc/redis.h create mode 100644 src/brpc/redis_cluster.cpp create mode 100644 src/brpc/redis_cluster.h create mode 100644 src/brpc/redis_command.cpp create mode 100644 src/brpc/redis_command.h create mode 100644 src/brpc/redis_reply.cpp create mode 100644 src/brpc/redis_reply.h create mode 100644 src/brpc/reloadable_flags.cpp create mode 100644 src/brpc/reloadable_flags.h create mode 100644 src/brpc/restful.cpp create mode 100644 src/brpc/restful.h create mode 100644 src/brpc/retry_policy.cpp create mode 100644 src/brpc/retry_policy.h create mode 100644 src/brpc/rpc_dump.cpp create mode 100644 src/brpc/rpc_dump.h create mode 100644 src/brpc/rpc_dump.proto create mode 100644 src/brpc/rpc_pb_message_factory.cpp create mode 100644 src/brpc/rpc_pb_message_factory.h create mode 100644 src/brpc/rtmp.cpp create mode 100644 src/brpc/rtmp.h create mode 100644 src/brpc/rtmp.proto create mode 100644 src/brpc/selective_channel.cpp create mode 100644 src/brpc/selective_channel.h create mode 100644 src/brpc/serialized_request.cpp create mode 100644 src/brpc/serialized_request.h create mode 100644 src/brpc/serialized_response.cpp create mode 100644 src/brpc/serialized_response.h create mode 100644 src/brpc/server.cpp create mode 100644 src/brpc/server.h create mode 100644 src/brpc/server_id.cpp create mode 100644 src/brpc/server_id.h create mode 100644 src/brpc/server_node.h create mode 100644 src/brpc/shared_object.h create mode 100644 src/brpc/simple_data_pool.cpp create mode 100644 src/brpc/simple_data_pool.h create mode 100644 src/brpc/socket.cpp create mode 100644 src/brpc/socket.h create mode 100644 src/brpc/socket_id.h create mode 100644 src/brpc/socket_inl.h create mode 100644 src/brpc/socket_map.cpp create mode 100644 src/brpc/socket_map.h create mode 100644 src/brpc/socket_message.h create mode 100644 src/brpc/socket_mode.h create mode 100644 src/brpc/span.cpp create mode 100644 src/brpc/span.h create mode 100644 src/brpc/span.proto create mode 100644 src/brpc/ssl_options.cpp create mode 100644 src/brpc/ssl_options.h create mode 100644 src/brpc/stream.cpp create mode 100644 src/brpc/stream.h create mode 100644 src/brpc/stream_creator.h create mode 100644 src/brpc/stream_impl.h create mode 100644 src/brpc/streaming_rpc_meta.proto create mode 100644 src/brpc/tcp_transport.cpp create mode 100644 src/brpc/tcp_transport.h create mode 100644 src/brpc/thrift_message.cpp create mode 100644 src/brpc/thrift_message.h create mode 100644 src/brpc/thrift_service.cpp create mode 100644 src/brpc/thrift_service.h create mode 100644 src/brpc/traceprintf.h create mode 100644 src/brpc/trackme.cpp create mode 100644 src/brpc/trackme.h create mode 100644 src/brpc/trackme.proto create mode 100644 src/brpc/transport.h create mode 100644 src/brpc/transport_factory.cpp create mode 100644 src/brpc/transport_factory.h create mode 100644 src/brpc/ts.cpp create mode 100644 src/brpc/ts.h create mode 100644 src/brpc/uri.cpp create mode 100644 src/brpc/uri.h create mode 100644 src/brpc/versioned_ref_with_id.h create mode 100644 src/bthread/bthread.cpp create mode 100644 src/bthread/bthread.h create mode 100644 src/bthread/bthread_once.cpp create mode 100644 src/bthread/butex.cpp create mode 100644 src/bthread/butex.h create mode 100644 src/bthread/comlog_initializer.h create mode 100644 src/bthread/condition_variable.cpp create mode 100644 src/bthread/condition_variable.h create mode 100644 src/bthread/context.cpp create mode 100644 src/bthread/context.h create mode 100644 src/bthread/countdown_event.cpp create mode 100644 src/bthread/countdown_event.h create mode 100644 src/bthread/errno.cpp create mode 100644 src/bthread/errno.h create mode 100644 src/bthread/execution_queue.cpp create mode 100644 src/bthread/execution_queue.h create mode 100644 src/bthread/execution_queue_inl.h create mode 100644 src/bthread/fd.cpp create mode 100644 src/bthread/id.cpp create mode 100644 src/bthread/id.h create mode 100644 src/bthread/interrupt_pthread.cpp create mode 100644 src/bthread/interrupt_pthread.h create mode 100644 src/bthread/key.cpp create mode 100644 src/bthread/list_of_abafree_id.h create mode 100644 src/bthread/log.h create mode 100644 src/bthread/mutex.cpp create mode 100644 src/bthread/mutex.h create mode 100644 src/bthread/offset_inl.list create mode 100644 src/bthread/parking_lot.h create mode 100644 src/bthread/prime_offset.h create mode 100644 src/bthread/processor.h create mode 100644 src/bthread/remote_task_queue.h create mode 100644 src/bthread/rwlock.cpp create mode 100644 src/bthread/rwlock.h create mode 100644 src/bthread/semaphore.cpp create mode 100644 src/bthread/singleton_on_bthread_once.h create mode 100644 src/bthread/stack.cpp create mode 100644 src/bthread/stack.h create mode 100644 src/bthread/stack_inl.h create mode 100644 src/bthread/sys_futex.cpp create mode 100644 src/bthread/sys_futex.h create mode 100644 src/bthread/task_control.cpp create mode 100644 src/bthread/task_control.h create mode 100644 src/bthread/task_group.cpp create mode 100644 src/bthread/task_group.h create mode 100644 src/bthread/task_group_inl.h create mode 100644 src/bthread/task_meta.h create mode 100644 src/bthread/task_tracer.cpp create mode 100644 src/bthread/task_tracer.h create mode 100644 src/bthread/timer_thread.cpp create mode 100644 src/bthread/timer_thread.h create mode 100644 src/bthread/types.h create mode 100644 src/bthread/unstable.h create mode 100644 src/bthread/work_stealing_queue.h create mode 100644 src/butil/arena.cpp create mode 100644 src/butil/arena.h create mode 100644 src/butil/at_exit.cc create mode 100644 src/butil/at_exit.h create mode 100644 src/butil/atomic_ref_count.h create mode 100644 src/butil/atomic_sequence_num.h create mode 100644 src/butil/atomicops.h create mode 100644 src/butil/atomicops_internals_arm64_gcc.h create mode 100644 src/butil/atomicops_internals_arm_gcc.h create mode 100644 src/butil/atomicops_internals_atomicword_compat.h create mode 100644 src/butil/atomicops_internals_gcc.h create mode 100644 src/butil/atomicops_internals_loongarch64_gcc.h create mode 100644 src/butil/atomicops_internals_mac.h create mode 100644 src/butil/atomicops_internals_mips_gcc.h create mode 100644 src/butil/atomicops_internals_riscv_gcc.h create mode 100644 src/butil/atomicops_internals_tsan.h create mode 100644 src/butil/atomicops_internals_x86_gcc.cc create mode 100644 src/butil/atomicops_internals_x86_gcc.h create mode 100644 src/butil/atomicops_internals_x86_msvc.h create mode 100644 src/butil/auto_reset.h create mode 100644 src/butil/base64.cc create mode 100644 src/butil/base64.h create mode 100644 src/butil/base64url.cc create mode 100644 src/butil/base64url.h create mode 100644 src/butil/base_export.h create mode 100644 src/butil/basictypes.h create mode 100644 src/butil/big_endian.cc create mode 100644 src/butil/big_endian.h create mode 100644 src/butil/binary_printer.cpp create mode 100644 src/butil/binary_printer.h create mode 100644 src/butil/bit_array.h create mode 100644 src/butil/bits.h create mode 100644 src/butil/build_config.h create mode 100644 src/butil/cancelable_callback.h create mode 100644 src/butil/class_name.cpp create mode 100644 src/butil/class_name.h create mode 100644 src/butil/comlog_sink.cc create mode 100644 src/butil/comlog_sink.h create mode 100644 src/butil/compat.h create mode 100644 src/butil/compiler_specific.h create mode 100644 src/butil/containers/bounded_queue.h create mode 100644 src/butil/containers/case_ignored_flat_map.cpp create mode 100644 src/butil/containers/case_ignored_flat_map.h create mode 100644 src/butil/containers/doubly_buffered_data.h create mode 100644 src/butil/containers/flat_map.h create mode 100644 src/butil/containers/flat_map_inl.h create mode 100644 src/butil/containers/hash_tables.h create mode 100644 src/butil/containers/linked_list.h create mode 100644 src/butil/containers/mpsc_queue.h create mode 100644 src/butil/containers/mru_cache.h create mode 100644 src/butil/containers/optional.h create mode 100644 src/butil/containers/pooled_map.h create mode 100644 src/butil/containers/scoped_ptr_hash_map.h create mode 100644 src/butil/containers/small_map.h create mode 100644 src/butil/containers/stack_container.h create mode 100644 src/butil/cpu.cc create mode 100644 src/butil/cpu.h create mode 100644 src/butil/crc32c.cc create mode 100644 src/butil/crc32c.h create mode 100644 src/butil/debug/address_annotations.h create mode 100644 src/butil/debug/alias.cc create mode 100644 src/butil/debug/alias.h create mode 100644 src/butil/debug/asan_invalid_access.cc create mode 100644 src/butil/debug/asan_invalid_access.h create mode 100644 src/butil/debug/crash_logging.cc create mode 100644 src/butil/debug/crash_logging.h create mode 100644 src/butil/debug/debugger.cc create mode 100644 src/butil/debug/debugger.h create mode 100644 src/butil/debug/debugger_posix.cc create mode 100644 src/butil/debug/dump_without_crashing.cc create mode 100644 src/butil/debug/dump_without_crashing.h create mode 100644 src/butil/debug/leak_annotations.h create mode 100644 src/butil/debug/leak_tracker.h create mode 100644 src/butil/debug/proc_maps_linux.cc create mode 100644 src/butil/debug/proc_maps_linux.h create mode 100644 src/butil/debug/stack_trace.cc create mode 100644 src/butil/debug/stack_trace.h create mode 100644 src/butil/debug/stack_trace_posix.cc create mode 100644 src/butil/details/extended_endpoint.hpp create mode 100644 src/butil/endpoint.cpp create mode 100644 src/butil/endpoint.h create mode 100644 src/butil/environment.cc create mode 100644 src/butil/environment.h create mode 100644 src/butil/errno.cpp create mode 100644 src/butil/errno.h create mode 100644 src/butil/fast_rand.cpp create mode 100644 src/butil/fast_rand.h create mode 100644 src/butil/fd_guard.h create mode 100644 src/butil/fd_utility.cpp create mode 100644 src/butil/fd_utility.h create mode 100644 src/butil/file_descriptor_posix.h create mode 100644 src/butil/file_util.cc create mode 100644 src/butil/file_util.h create mode 100644 src/butil/file_util_linux.cc create mode 100644 src/butil/file_util_mac.mm create mode 100644 src/butil/file_util_posix.cc create mode 100644 src/butil/files/dir_reader_fallback.h create mode 100644 src/butil/files/dir_reader_linux.h create mode 100644 src/butil/files/dir_reader_posix.h create mode 100644 src/butil/files/dir_reader_unix.h create mode 100644 src/butil/files/fd_guard.h create mode 100644 src/butil/files/file.cc create mode 100644 src/butil/files/file.h create mode 100644 src/butil/files/file_enumerator.cc create mode 100644 src/butil/files/file_enumerator.h create mode 100644 src/butil/files/file_enumerator_posix.cc create mode 100644 src/butil/files/file_path.cc create mode 100644 src/butil/files/file_path.h create mode 100644 src/butil/files/file_path_constants.cc create mode 100644 src/butil/files/file_posix.cc create mode 100644 src/butil/files/file_watcher.cpp create mode 100644 src/butil/files/file_watcher.h create mode 100644 src/butil/files/memory_mapped_file.cc create mode 100644 src/butil/files/memory_mapped_file.h create mode 100644 src/butil/files/memory_mapped_file_posix.cc create mode 100644 src/butil/files/scoped_file.cc create mode 100644 src/butil/files/scoped_file.h create mode 100644 src/butil/files/scoped_temp_dir.cc create mode 100644 src/butil/files/scoped_temp_dir.h create mode 100644 src/butil/files/temp_file.cpp create mode 100644 src/butil/files/temp_file.h create mode 100644 src/butil/find_cstr.cpp create mode 100644 src/butil/find_cstr.h create mode 100644 src/butil/float_util.h create mode 100644 src/butil/format_macros.h create mode 100644 src/butil/gperftools_profiler.h create mode 100644 src/butil/gtest_prod_util.h create mode 100644 src/butil/guid.cc create mode 100644 src/butil/guid.h create mode 100644 src/butil/guid_posix.cc create mode 100644 src/butil/hash.cc create mode 100644 src/butil/hash.h create mode 100644 src/butil/intrusive_ptr.hpp create mode 100644 src/butil/iobuf.cpp create mode 100644 src/butil/iobuf.h create mode 100644 src/butil/iobuf_inl.h create mode 100644 src/butil/iobuf_profiler.cpp create mode 100644 src/butil/iobuf_profiler.h create mode 100644 src/butil/lazy_instance.cc create mode 100644 src/butil/lazy_instance.h create mode 100644 src/butil/location.cc create mode 100644 src/butil/location.h create mode 100644 src/butil/logging.cc create mode 100644 src/butil/logging.h create mode 100644 src/butil/mac/bundle_locations.h create mode 100644 src/butil/mac/bundle_locations.mm create mode 100644 src/butil/mac/foundation_util.h create mode 100644 src/butil/mac/foundation_util.mm create mode 100644 src/butil/mac/scoped_cftyperef.h create mode 100644 src/butil/mac/scoped_mach_port.cc create mode 100644 src/butil/mac/scoped_mach_port.h create mode 100644 src/butil/mac/scoped_typeref.h create mode 100644 src/butil/macros.h create mode 100644 src/butil/memory/aligned_memory.cc create mode 100644 src/butil/memory/aligned_memory.h create mode 100644 src/butil/memory/linked_ptr.h create mode 100644 src/butil/memory/manual_constructor.h create mode 100644 src/butil/memory/raw_scoped_refptr_mismatch_checker.h create mode 100644 src/butil/memory/ref_counted.cc create mode 100644 src/butil/memory/ref_counted.h create mode 100644 src/butil/memory/ref_counted_memory.cc create mode 100644 src/butil/memory/ref_counted_memory.h create mode 100644 src/butil/memory/scope_guard.h create mode 100644 src/butil/memory/scoped_open_process.h create mode 100644 src/butil/memory/scoped_policy.h create mode 100644 src/butil/memory/scoped_ptr.h create mode 100644 src/butil/memory/scoped_vector.h create mode 100644 src/butil/memory/singleton.cc create mode 100644 src/butil/memory/singleton.h create mode 100644 src/butil/memory/singleton_objc.h create mode 100644 src/butil/memory/singleton_on_pthread_once.h create mode 100644 src/butil/memory/weak_ptr.cc create mode 100644 src/butil/memory/weak_ptr.h create mode 100644 src/butil/move.h create mode 100644 src/butil/numerics/safe_conversions.h create mode 100644 src/butil/numerics/safe_conversions_impl.h create mode 100644 src/butil/numerics/safe_math.h create mode 100644 src/butil/numerics/safe_math_impl.h create mode 100644 src/butil/object_pool.h create mode 100644 src/butil/object_pool_inl.h create mode 100644 src/butil/observer_list.h create mode 100644 src/butil/popen.cpp create mode 100644 src/butil/popen.h create mode 100644 src/butil/port.h create mode 100644 src/butil/posix/eintr_wrapper.h create mode 100644 src/butil/posix/file_descriptor_shuffle.cc create mode 100644 src/butil/posix/file_descriptor_shuffle.h create mode 100644 src/butil/posix/global_descriptors.cc create mode 100644 src/butil/posix/global_descriptors.h create mode 100644 src/butil/process_util.cc create mode 100644 src/butil/process_util.h create mode 100644 src/butil/ptr_container.h create mode 100644 src/butil/rand_util.cc create mode 100644 src/butil/rand_util.h create mode 100644 src/butil/rand_util_posix.cc create mode 100644 src/butil/raw_pack.h create mode 100644 src/butil/reader_writer.h create mode 100644 src/butil/recordio.cc create mode 100644 src/butil/recordio.h create mode 100644 src/butil/reloadable_flags.h create mode 100644 src/butil/resource_pool.h create mode 100644 src/butil/resource_pool_inl.h create mode 100644 src/butil/safe_strerror_posix.cc create mode 100644 src/butil/safe_strerror_posix.h create mode 100644 src/butil/scoped_clear_errno.h create mode 100644 src/butil/scoped_generic.h create mode 100644 src/butil/scoped_lock.h create mode 100644 src/butil/scoped_observer.h create mode 100644 src/butil/sha1.h create mode 100644 src/butil/sha1_portable.cc create mode 100644 src/butil/shared_object.h create mode 100644 src/butil/single_iobuf.cpp create mode 100644 src/butil/single_iobuf.h create mode 100644 src/butil/single_threaded_pool.h create mode 100644 src/butil/ssl_compat.h create mode 100644 src/butil/status.cpp create mode 100644 src/butil/status.h create mode 100644 src/butil/stl_util.h create mode 100644 src/butil/string_printf.cpp create mode 100644 src/butil/string_printf.h create mode 100644 src/butil/string_splitter.h create mode 100644 src/butil/string_splitter_inl.h create mode 100644 src/butil/strings/latin1_string_conversions.cc create mode 100644 src/butil/strings/latin1_string_conversions.h create mode 100644 src/butil/strings/nullable_string16.cc create mode 100644 src/butil/strings/nullable_string16.h create mode 100644 src/butil/strings/safe_sprintf.cc create mode 100644 src/butil/strings/safe_sprintf.h create mode 100644 src/butil/strings/string16.cc create mode 100644 src/butil/strings/string16.h create mode 100644 src/butil/strings/string_number_conversions.cc create mode 100644 src/butil/strings/string_number_conversions.h create mode 100644 src/butil/strings/string_piece.cc create mode 100644 src/butil/strings/string_piece.h create mode 100644 src/butil/strings/string_split.cc create mode 100644 src/butil/strings/string_split.h create mode 100644 src/butil/strings/string_tokenizer.h create mode 100644 src/butil/strings/string_util.cc create mode 100644 src/butil/strings/string_util.h create mode 100644 src/butil/strings/string_util_constants.cc create mode 100644 src/butil/strings/string_util_posix.h create mode 100644 src/butil/strings/stringize_macros.h create mode 100644 src/butil/strings/stringprintf.cc create mode 100644 src/butil/strings/stringprintf.h create mode 100644 src/butil/strings/sys_string_conversions.h create mode 100644 src/butil/strings/sys_string_conversions_mac.mm create mode 100644 src/butil/strings/sys_string_conversions_posix.cc create mode 100644 src/butil/strings/utf_offset_string_conversions.cc create mode 100644 src/butil/strings/utf_offset_string_conversions.h create mode 100644 src/butil/strings/utf_string_conversion_utils.cc create mode 100644 src/butil/strings/utf_string_conversion_utils.h create mode 100644 src/butil/strings/utf_string_conversions.cc create mode 100644 src/butil/strings/utf_string_conversions.h create mode 100644 src/butil/synchronization/cancellation_flag.cc create mode 100644 src/butil/synchronization/cancellation_flag.h create mode 100644 src/butil/synchronization/condition_variable.h create mode 100644 src/butil/synchronization/condition_variable_posix.cc create mode 100644 src/butil/synchronization/lock.h create mode 100644 src/butil/synchronization/spin_wait.h create mode 100644 src/butil/synchronization/waitable_event.h create mode 100644 src/butil/synchronization/waitable_event_posix.cc create mode 100644 src/butil/synchronous_event.h create mode 100644 src/butil/sys_byteorder.h create mode 100644 src/butil/third_party/dmg_fp/README.chromium create mode 100644 src/butil/third_party/dmg_fp/dmg_fp.h create mode 100644 src/butil/third_party/dmg_fp/dtoa.cc create mode 100644 src/butil/third_party/dmg_fp/dtoa_wrapper.cc create mode 100644 src/butil/third_party/dmg_fp/float_precision_crash.patch create mode 100644 src/butil/third_party/dmg_fp/g_fmt.cc create mode 100644 src/butil/third_party/dmg_fp/gcc_64_bit.patch create mode 100644 src/butil/third_party/dmg_fp/gcc_warnings.patch create mode 100644 src/butil/third_party/dmg_fp/mac_wextra.patch create mode 100644 src/butil/third_party/dmg_fp/vs2013-optimization.patch create mode 100644 src/butil/third_party/dmg_fp/win_vs2012.patch create mode 100644 src/butil/third_party/dynamic_annotations/README.chromium create mode 100644 src/butil/third_party/dynamic_annotations/dynamic_annotations.c create mode 100644 src/butil/third_party/dynamic_annotations/dynamic_annotations.h create mode 100644 src/butil/third_party/icu/README.chromium create mode 100644 src/butil/third_party/icu/icu_utf.cc create mode 100644 src/butil/third_party/icu/icu_utf.h create mode 100644 src/butil/third_party/modp_b64/README.chromium create mode 100644 src/butil/third_party/modp_b64/modp_b64.cc create mode 100644 src/butil/third_party/modp_b64/modp_b64.h create mode 100644 src/butil/third_party/modp_b64/modp_b64_data.h create mode 100644 src/butil/third_party/murmurhash3/murmurhash3.cpp create mode 100644 src/butil/third_party/murmurhash3/murmurhash3.h create mode 100644 src/butil/third_party/rapidjson/allocators.h create mode 100644 src/butil/third_party/rapidjson/document.h create mode 100644 src/butil/third_party/rapidjson/encodedstream.h create mode 100644 src/butil/third_party/rapidjson/encodings.h create mode 100644 src/butil/third_party/rapidjson/error/en.h create mode 100644 src/butil/third_party/rapidjson/error/error.h create mode 100644 src/butil/third_party/rapidjson/filereadstream.h create mode 100644 src/butil/third_party/rapidjson/filewritestream.h create mode 100644 src/butil/third_party/rapidjson/internal/biginteger.h create mode 100644 src/butil/third_party/rapidjson/internal/diyfp.h create mode 100644 src/butil/third_party/rapidjson/internal/dtoa.h create mode 100644 src/butil/third_party/rapidjson/internal/ieee754.h create mode 100644 src/butil/third_party/rapidjson/internal/itoa.h create mode 100644 src/butil/third_party/rapidjson/internal/meta.h create mode 100644 src/butil/third_party/rapidjson/internal/pow10.h create mode 100644 src/butil/third_party/rapidjson/internal/stack.h create mode 100644 src/butil/third_party/rapidjson/internal/strfunc.h create mode 100644 src/butil/third_party/rapidjson/internal/strtod.h create mode 100644 src/butil/third_party/rapidjson/memorybuffer.h create mode 100644 src/butil/third_party/rapidjson/memorystream.h create mode 100644 src/butil/third_party/rapidjson/msinttypes/inttypes.h create mode 100644 src/butil/third_party/rapidjson/msinttypes/stdint.h create mode 100644 src/butil/third_party/rapidjson/optimized_writer.h create mode 100644 src/butil/third_party/rapidjson/pointer.h create mode 100644 src/butil/third_party/rapidjson/prettywriter.h create mode 100644 src/butil/third_party/rapidjson/rapidjson.h create mode 100644 src/butil/third_party/rapidjson/reader.h create mode 100644 src/butil/third_party/rapidjson/rename.patch create mode 100644 src/butil/third_party/rapidjson/stringbuffer.h create mode 100644 src/butil/third_party/rapidjson/writer.h create mode 100644 src/butil/third_party/snappy/format_description.txt create mode 100644 src/butil/third_party/snappy/framing_format.txt create mode 100644 src/butil/third_party/snappy/snappy-internal.h create mode 100644 src/butil/third_party/snappy/snappy-sinksource.cc create mode 100644 src/butil/third_party/snappy/snappy-sinksource.h create mode 100644 src/butil/third_party/snappy/snappy-stubs-internal.cc create mode 100644 src/butil/third_party/snappy/snappy-stubs-internal.h create mode 100644 src/butil/third_party/snappy/snappy.cc create mode 100644 src/butil/third_party/snappy/snappy.h create mode 100644 src/butil/third_party/superfasthash/README.chromium create mode 100644 src/butil/third_party/superfasthash/superfasthash.c create mode 100644 src/butil/third_party/symbolize/README.chromium create mode 100644 src/butil/third_party/symbolize/config.h create mode 100644 src/butil/third_party/symbolize/demangle.cc create mode 100644 src/butil/third_party/symbolize/demangle.h create mode 100644 src/butil/third_party/symbolize/glog/logging.h create mode 100644 src/butil/third_party/symbolize/glog/raw_logging.h create mode 100644 src/butil/third_party/symbolize/symbolize.cc create mode 100644 src/butil/third_party/symbolize/symbolize.h create mode 100644 src/butil/third_party/symbolize/utilities.h create mode 100644 src/butil/third_party/valgrind/valgrind.h create mode 100644 src/butil/thread_key.cpp create mode 100644 src/butil/thread_key.h create mode 100644 src/butil/thread_local.cpp create mode 100644 src/butil/thread_local.h create mode 100644 src/butil/thread_local_inl.h create mode 100644 src/butil/threading/non_thread_safe.h create mode 100644 src/butil/threading/non_thread_safe_impl.cc create mode 100644 src/butil/threading/non_thread_safe_impl.h create mode 100644 src/butil/threading/platform_thread.h create mode 100644 src/butil/threading/platform_thread_freebsd.cc create mode 100644 src/butil/threading/platform_thread_linux.cc create mode 100644 src/butil/threading/platform_thread_mac.mm create mode 100644 src/butil/threading/platform_thread_posix.cc create mode 100644 src/butil/threading/simple_thread.cc create mode 100644 src/butil/threading/simple_thread.h create mode 100644 src/butil/threading/thread_checker.h create mode 100644 src/butil/threading/thread_checker_impl.cc create mode 100644 src/butil/threading/thread_checker_impl.h create mode 100644 src/butil/threading/thread_collision_warner.cc create mode 100644 src/butil/threading/thread_collision_warner.h create mode 100644 src/butil/threading/thread_id_name_manager.cc create mode 100644 src/butil/threading/thread_id_name_manager.h create mode 100644 src/butil/threading/thread_local.h create mode 100644 src/butil/threading/thread_local_posix.cc create mode 100644 src/butil/threading/thread_local_storage.cc create mode 100644 src/butil/threading/thread_local_storage.h create mode 100644 src/butil/threading/thread_local_storage_posix.cc create mode 100644 src/butil/threading/thread_restrictions.cc create mode 100644 src/butil/threading/thread_restrictions.h create mode 100644 src/butil/threading/watchdog.cc create mode 100644 src/butil/threading/watchdog.h create mode 100644 src/butil/time.cpp create mode 100644 src/butil/time.h create mode 100644 src/butil/time/clock.cc create mode 100644 src/butil/time/clock.h create mode 100644 src/butil/time/default_clock.cc create mode 100644 src/butil/time/default_clock.h create mode 100644 src/butil/time/default_tick_clock.cc create mode 100644 src/butil/time/default_tick_clock.h create mode 100644 src/butil/time/tick_clock.cc create mode 100644 src/butil/time/tick_clock.h create mode 100644 src/butil/time/time.cc create mode 100644 src/butil/time/time.h create mode 100644 src/butil/time/time_mac.cc create mode 100644 src/butil/time/time_posix.cc create mode 100644 src/butil/type_traits.h create mode 100644 src/butil/unique_ptr.h create mode 100644 src/butil/unix_socket.cpp create mode 100644 src/butil/unix_socket.h create mode 100644 src/butil/version.cc create mode 100644 src/butil/version.h create mode 100644 src/butil/zero_copy_stream_as_streambuf.cpp create mode 100644 src/butil/zero_copy_stream_as_streambuf.h create mode 100644 src/bvar/bvar.h create mode 100644 src/bvar/collector.cpp create mode 100644 src/bvar/collector.h create mode 100644 src/bvar/default_variables.cpp create mode 100644 src/bvar/detail/agent_group.h create mode 100644 src/bvar/detail/call_op_returning_void.h create mode 100644 src/bvar/detail/combiner.h create mode 100644 src/bvar/detail/is_atomical.h create mode 100644 src/bvar/detail/percentile.cpp create mode 100644 src/bvar/detail/percentile.h create mode 100644 src/bvar/detail/sampler.cpp create mode 100644 src/bvar/detail/sampler.h create mode 100644 src/bvar/detail/series.h create mode 100644 src/bvar/gflag.cpp create mode 100644 src/bvar/gflag.h create mode 100644 src/bvar/latency_recorder.cpp create mode 100644 src/bvar/latency_recorder.h create mode 100644 src/bvar/multi_dimension.h create mode 100644 src/bvar/multi_dimension_inl.h create mode 100644 src/bvar/mvariable.cpp create mode 100644 src/bvar/mvariable.h create mode 100644 src/bvar/passive_status.h create mode 100644 src/bvar/recorder.h create mode 100644 src/bvar/reducer.h create mode 100644 src/bvar/scoped_timer.h create mode 100644 src/bvar/status.h create mode 100644 src/bvar/utils/lock_timer.h create mode 100644 src/bvar/variable.cpp create mode 100644 src/bvar/variable.h create mode 100644 src/bvar/vector.h create mode 100644 src/bvar/window.h create mode 100644 src/idl_options.proto create mode 100644 src/json2pb/encode_decode.cpp create mode 100644 src/json2pb/encode_decode.h create mode 100644 src/json2pb/json_to_pb.cpp create mode 100644 src/json2pb/json_to_pb.h create mode 100644 src/json2pb/pb_to_json.cpp create mode 100644 src/json2pb/pb_to_json.h create mode 100644 src/json2pb/protobuf_map.cpp create mode 100644 src/json2pb/protobuf_map.h create mode 100644 src/json2pb/protobuf_type_resolver.cpp create mode 100644 src/json2pb/protobuf_type_resolver.h create mode 100644 src/json2pb/rapidjson.h create mode 100644 src/json2pb/zero_copy_stream_reader.h create mode 100644 src/json2pb/zero_copy_stream_writer.h create mode 100644 src/mcpack2pb/field_type.cpp create mode 100644 src/mcpack2pb/field_type.h create mode 100644 src/mcpack2pb/generator.cpp create mode 100644 src/mcpack2pb/mcpack2pb.cpp create mode 100644 src/mcpack2pb/mcpack2pb.h create mode 100644 src/mcpack2pb/parser-inl.h create mode 100644 src/mcpack2pb/parser.cpp create mode 100644 src/mcpack2pb/parser.h create mode 100644 src/mcpack2pb/serializer-inl.h create mode 100644 src/mcpack2pb/serializer.cpp create mode 100644 src/mcpack2pb/serializer.h create mode 100644 test/BUILD.bazel create mode 100644 test/CMakeLists.txt create mode 100644 test/README_mysql_auth.md create mode 100644 test/abalist_unittest.cc create mode 100644 test/addressbook.proto create mode 100644 test/addressbook1.proto create mode 100644 test/addressbook_encode_decode.proto create mode 100644 test/addressbook_map.proto create mode 100644 test/aligned_memory_unittest.cc create mode 100644 test/allocator_unittest.cc create mode 100644 test/at_exit_unittest.cc create mode 100644 test/atomicops_unittest.cc create mode 100644 test/baidu_thread_local_unittest.cpp create mode 100644 test/baidu_time_unittest.cpp create mode 100644 test/barrier_closure_unittest.cc create mode 100644 test/base64_unittest.cc create mode 100644 test/base64url_unittest.cc create mode 100644 test/big_endian_unittest.cc create mode 100644 test/bits_unittest.cc create mode 100644 test/bounded_queue_unittest.cc create mode 100644 test/brpc_adaptive_class_unittest.cpp create mode 100644 test/brpc_alpn_protocol_unittest.cpp create mode 100644 test/brpc_auto_concurrency_limiter_unittest.cpp create mode 100644 test/brpc_block_pool_unittest.cpp create mode 100644 test/brpc_builtin_service_unittest.cpp create mode 100644 test/brpc_channel_unittest.cpp create mode 100644 test/brpc_circuit_breaker_unittest.cpp create mode 100644 test/brpc_controller_unittest.cpp create mode 100644 test/brpc_coroutine_unittest.cpp create mode 100644 test/brpc_couchbase_unittest.cpp create mode 100644 test/brpc_esp_protocol_unittest.cpp create mode 100644 test/brpc_event_dispatcher_unittest.cpp create mode 100644 test/brpc_extension_unittest.cpp create mode 100644 test/brpc_grpc_protocol_unittest.cpp create mode 100644 test/brpc_h2_unsent_message_unittest.cpp create mode 100644 test/brpc_hpack_unittest.cpp create mode 100644 test/brpc_http_message_unittest.cpp create mode 100644 test/brpc_http_parser_unittest.cpp create mode 100644 test/brpc_http_rpc_protocol_unittest.cpp create mode 100644 test/brpc_http_status_code_unittest.cpp create mode 100644 test/brpc_hulu_pbrpc_protocol_unittest.cpp create mode 100644 test/brpc_input_messenger_unittest.cpp create mode 100644 test/brpc_interceptor_unittest.cpp create mode 100644 test/brpc_load_balancer_unittest.cpp create mode 100644 test/brpc_memcache_unittest.cpp create mode 100644 test/brpc_mongo_protocol_unittest.cpp create mode 100644 test/brpc_mysql_auth_handshake_unittest.cpp create mode 100644 test/brpc_mysql_auth_packet_unittest.cpp create mode 100644 test/brpc_mysql_auth_scramble_unittest.cpp create mode 100644 test/brpc_mysql_connection_type_unittest.cpp create mode 100644 test/brpc_mysql_pool_concurrency_unittest.cpp create mode 100644 test/brpc_mysql_prepared_integration_unittest.cpp create mode 100644 test/brpc_mysql_txn_integration_unittest.cpp create mode 100644 test/brpc_naming_service_filter_unittest.cpp create mode 100644 test/brpc_naming_service_unittest.cpp create mode 100644 test/brpc_nova_pbrpc_protocol_unittest.cpp create mode 100644 test/brpc_p2c_ewma_load_balancer_unittest.cpp create mode 100644 test/brpc_prometheus_metrics_service_unittest.cpp create mode 100644 test/brpc_prometheus_metrics_unittest.cpp create mode 100644 test/brpc_proto_unittest.cpp create mode 100644 test/brpc_protobuf_json_unittest.cpp create mode 100644 test/brpc_public_pbrpc_protocol_unittest.cpp create mode 100644 test/brpc_rdma_unittest.cpp create mode 100644 test/brpc_redis_cluster_unittest.cpp create mode 100644 test/brpc_redis_unittest.cpp create mode 100644 test/brpc_repeated_field_unittest.cpp create mode 100644 test/brpc_rtmp_unittest.cpp create mode 100644 test/brpc_server_unittest.cpp create mode 100644 test/brpc_snappy_compress_unittest.cpp create mode 100644 test/brpc_socket_map_unittest.cpp create mode 100644 test/brpc_socket_unittest.cpp create mode 100644 test/brpc_sofa_pbrpc_protocol_unittest.cpp create mode 100644 test/brpc_ssl_unittest.cpp create mode 100644 test/brpc_streaming_rpc_unittest.cpp create mode 100644 test/brpc_timeout_concurrency_limiter_unittest.cpp create mode 100644 test/brpc_uri_unittest.cpp create mode 100644 test/bthread_butex_multi_tag_unittest.cpp create mode 100644 test/bthread_butex_unittest.cpp create mode 100644 test/bthread_cond_bug_unittest.cpp create mode 100644 test/bthread_cond_unittest.cpp create mode 100644 test/bthread_countdown_event_unittest.cpp create mode 100644 test/bthread_dispatcher_unittest.cpp create mode 100644 test/bthread_execution_queue_unittest.cpp create mode 100644 test/bthread_fd_unittest.cpp create mode 100644 test/bthread_futex_unittest.cpp create mode 100644 test/bthread_id_unittest.cpp create mode 100644 test/bthread_key_unittest.cpp create mode 100644 test/bthread_list_unittest.cpp create mode 100644 test/bthread_mutex_unittest.cpp create mode 100644 test/bthread_once_unittest.cpp create mode 100644 test/bthread_ping_pong_unittest.cpp create mode 100644 test/bthread_priority_queue_unittest.cpp create mode 100644 test/bthread_rwlock_unittest.cpp create mode 100644 test/bthread_sched_yield_unittest.cpp create mode 100644 test/bthread_semaphore_unittest.cpp create mode 100644 test/bthread_setconcurrency_unittest.cpp create mode 100644 test/bthread_timer_thread_unittest.cpp create mode 100644 test/bthread_unittest.cpp create mode 100644 test/bthread_work_stealing_queue_unittest.cpp create mode 100644 test/butil_unittest_main.cpp create mode 100644 test/bvar_agent_group_unittest.cpp create mode 100644 test/bvar_file_dumper_unittest.cpp create mode 100644 test/bvar_lock_timer_unittest.cpp create mode 100644 test/bvar_multi_dimension_unittest.cpp create mode 100644 test/bvar_mvariable_unittest.cpp create mode 100644 test/bvar_percentile_unittest.cpp create mode 100644 test/bvar_recorder_unittest.cpp create mode 100644 test/bvar_reducer_unittest.cpp create mode 100644 test/bvar_sampler_unittest.cpp create mode 100644 test/bvar_status_unittest.cpp create mode 100644 test/bvar_variable_unittest.cpp create mode 100644 test/bvar_window_unittest.cpp create mode 100644 test/cacheline_unittest.cpp create mode 100644 test/callback_helpers_unittest.cc create mode 100644 test/callback_list_unittest.cc create mode 100644 test/callback_unittest.cc create mode 100644 test/cancelable_callback_unittest.cc create mode 100644 test/cancellation_flag_unittest.cc create mode 100644 test/cert1.crt create mode 100644 test/cert1.key create mode 100644 test/cert2.crt create mode 100644 test/cert2.key create mode 100644 test/class_name_unittest.cpp create mode 100644 test/condition_variable_unittest.cc create mode 100644 test/cpu_unittest.cc create mode 100644 test/crash_logging_unittest.cc create mode 100644 test/crc32c_unittest.cc create mode 100644 test/dir_reader_posix_unittest.cc create mode 100644 test/echo.proto create mode 100644 test/endpoint_unittest.cpp create mode 100644 test/environment_unittest.cc create mode 100644 test/errno_unittest.cpp create mode 100644 test/fd_guard_unittest.cpp create mode 100644 test/file_descriptor_shuffle_unittest.cc create mode 100644 test/file_path_unittest.cc create mode 100644 test/file_unittest.cc create mode 100644 test/file_util_unittest.cc create mode 100644 test/file_watcher_unittest.cpp create mode 100644 test/find_cstr_unittest.cpp create mode 100644 test/flat_map_unittest.cpp create mode 100644 test/fuzzing/fuzz_amf.cpp create mode 100644 test/fuzzing/fuzz_baidu_rpc.cpp create mode 100644 test/fuzzing/fuzz_butil.cpp create mode 100644 test/fuzzing/fuzz_butil_seed_corpus/base64_decoded.txt create mode 100644 test/fuzzing/fuzz_butil_seed_corpus/base64_encoded.txt create mode 100644 test/fuzzing/fuzz_butil_seed_corpus/crc32c.data create mode 100644 test/fuzzing/fuzz_common.h create mode 100644 test/fuzzing/fuzz_couchbase.cpp create mode 100644 test/fuzzing/fuzz_esp.cpp create mode 100644 test/fuzzing/fuzz_hpack.cpp create mode 100644 test/fuzzing/fuzz_hpack_seed_corpus/header_never_indexed.hpack create mode 100644 test/fuzzing/fuzz_hpack_seed_corpus/header_with_indexing.hpack create mode 100644 test/fuzzing/fuzz_hpack_seed_corpus/header_without_indexing.hpack create mode 100644 test/fuzzing/fuzz_hpack_seed_corpus/requests_without_huffman.hpack create mode 100644 test/fuzzing/fuzz_hpack_seed_corpus/responses_without_huffman.hpack create mode 100644 test/fuzzing/fuzz_http.cpp create mode 100644 test/fuzzing/fuzz_http_parser.cpp create mode 100644 test/fuzzing/fuzz_http_seed_corpus/http_request.http create mode 100644 test/fuzzing/fuzz_http_seed_corpus/http_request_v2.http create mode 100644 test/fuzzing/fuzz_hulu.cpp create mode 100644 test/fuzzing/fuzz_json.cpp create mode 100644 test/fuzzing/fuzz_json_seed_corpus/info1.json create mode 100644 test/fuzzing/fuzz_json_seed_corpus/info2.json create mode 100644 test/fuzzing/fuzz_json_seed_corpus/info3.json create mode 100644 test/fuzzing/fuzz_memcache.cpp create mode 100644 test/fuzzing/fuzz_mongo.cpp create mode 100644 test/fuzzing/fuzz_redis.cpp create mode 100644 test/fuzzing/fuzz_redis_seed_corpus/command_parser.redis create mode 100644 test/fuzzing/fuzz_redis_seed_corpus/request.redis create mode 100644 test/fuzzing/fuzz_shead.cpp create mode 100644 test/fuzzing/fuzz_sofa.cpp create mode 100644 test/fuzzing/fuzz_streaming.cpp create mode 100644 test/fuzzing/fuzz_thrift.cpp create mode 100644 test/fuzzing/fuzz_uri.cpp create mode 100644 test/fuzzing/fuzz_uri_seed_corpus/data_1.rtmp create mode 100644 test/fuzzing/fuzz_uri_seed_corpus/data_1.uri create mode 100644 test/fuzzing/fuzz_uri_seed_corpus/data_2.uri create mode 100644 test/fuzzing/oss-fuzz.sh create mode 100644 test/generate_unittests.bzl create mode 100644 test/gperftools_helper.h create mode 100644 test/grpc.proto create mode 100644 test/guid_unittest.cc create mode 100644 test/hash_tables_unittest.cc create mode 100644 test/hash_unittest.cc create mode 100644 test/health_check.proto create mode 100644 test/iobuf.proto create mode 100644 test/iobuf_unittest.cpp create mode 100644 test/lazy_instance_unittest.cc create mode 100644 test/leak_tracker_unittest.cc create mode 100644 test/linked_list_unittest.cc create mode 100644 test/linked_ptr_unittest.cc create mode 100644 test/lock_unittest.cc create mode 100644 test/logging_unittest.cc create mode 100644 test/memory_unittest.cc create mode 100644 test/memory_unittest_mac.h create mode 100644 test/message.proto create mode 100644 test/mpsc_queue_unittest.cc create mode 100644 test/mru_cache_unittest.cc create mode 100644 test/multiprocess_func_list.h create mode 100644 test/non_thread_safe_unittest.cc create mode 100644 test/nullable_string16_unittest.cc create mode 100644 test/object_pool_unittest.cpp create mode 100644 test/observer_list_unittest.cc create mode 100644 test/optional_unittest.cpp create mode 100644 test/platform_thread_unittest.cc create mode 100644 test/popen_unittest.cpp create mode 100644 test/proc_maps_linux_unittest.cc create mode 100644 test/rand_util_unittest.cc create mode 100644 test/recordio_unittest.cpp create mode 100644 test/ref_counted_memory_unittest.cc create mode 100644 test/ref_counted_unittest.cc create mode 100644 test/repeated.proto create mode 100644 test/resource_pool_unittest.cpp create mode 100644 test/root_runfiles.bzl create mode 100755 test/run_tests.sh create mode 100644 test/safe_numerics_unittest.cc create mode 100644 test/safe_sprintf_unittest.cc create mode 100644 test/scope_guard_unittest.cpp create mode 100644 test/scoped_clear_errno_unittest.cc create mode 100644 test/scoped_generic_unittest.cc create mode 100644 test/scoped_locale.cc create mode 100644 test/scoped_locale.h create mode 100644 test/scoped_lock_unittest.cpp create mode 100644 test/scoped_ptr_unittest.cc create mode 100644 test/scoped_temp_dir_unittest.cc create mode 100644 test/scoped_vector_unittest.cc create mode 100644 test/security_unittest.cc create mode 100644 test/sha1_unittest.cc create mode 100644 test/shared_memory_unittest.cc create mode 100644 test/simple_thread_unittest.cc create mode 100644 test/singleton_unittest.cc create mode 100644 test/small_map_unittest.cc create mode 100644 test/snappy_message.proto create mode 100644 test/stack_container_unittest.cc create mode 100644 test/stack_trace_unittest.cc create mode 100644 test/status_unittest.cpp create mode 100644 test/stl_util_unittest.cc create mode 100644 test/string16_unittest.cc create mode 100644 test/string_number_conversions_unittest.cc create mode 100644 test/string_piece_unittest.cc create mode 100644 test/string_printf_unittest.cpp create mode 100644 test/string_split_unittest.cc create mode 100644 test/string_splitter_unittest.cpp create mode 100644 test/string_tokenizer_unittest.cc create mode 100644 test/string_util_unittest.cc create mode 100644 test/stringize_macros_unittest.cc create mode 100644 test/stringprintf_unittest.cc create mode 100644 test/synchronous_event_unittest.cpp create mode 100644 test/sys_info_unittest.cc create mode 100644 test/sys_string_conversions_unittest.cc create mode 100644 test/temp_file_unittest.cpp create mode 100644 test/test_file_util_linux.cc create mode 100644 test/test_switches.cc create mode 100644 test/test_switches.h create mode 100644 test/thread_checker_unittest.cc create mode 100644 test/thread_collision_warner_unittest.cc create mode 100644 test/thread_id_name_manager_unittest.cc create mode 100644 test/thread_key_unittest.cpp create mode 100644 test/thread_local_storage_unittest.cc create mode 100644 test/thread_local_unittest.cc create mode 100644 test/time_unittest.cc create mode 100644 test/type_traits_unittest.cc create mode 100644 test/unique_ptr_unittest.cpp create mode 100644 test/utf_offset_string_conversions_unittest.cc create mode 100644 test/utf_string_conversions_unittest.cc create mode 100644 test/v1.proto create mode 100644 test/v2.proto create mode 100644 test/v3.proto create mode 100644 test/version_unittest.cc create mode 100644 test/waitable_event_unittest.cc create mode 100644 test/watchdog_unittest.cc create mode 100644 test/weak_ptr_unittest.cc create mode 100644 tools/CMakeLists.txt create mode 100644 tools/add_syntax_equal_proto2_to_all.sh create mode 100644 tools/gdb_bthread_stack.py create mode 100755 tools/get_brpc_revision.sh create mode 100644 tools/lldb_bthread_stack.py create mode 100644 tools/parallel_http/CMakeLists.txt create mode 100644 tools/parallel_http/parallel_http.cpp create mode 100755 tools/print_gcc_version.sh create mode 100644 tools/rpc_press/CMakeLists.txt create mode 100644 tools/rpc_press/client.py create mode 100644 tools/rpc_press/info_thread.cpp create mode 100644 tools/rpc_press/info_thread.h create mode 100644 tools/rpc_press/json_loader.cpp create mode 100644 tools/rpc_press/json_loader.h create mode 100644 tools/rpc_press/pb_util.cpp create mode 100644 tools/rpc_press/pb_util.h create mode 100644 tools/rpc_press/rpc_press.cpp create mode 100644 tools/rpc_press/rpc_press_impl.cpp create mode 100644 tools/rpc_press/rpc_press_impl.h create mode 100644 tools/rpc_replay/CMakeLists.txt create mode 100644 tools/rpc_replay/info_thread.cpp create mode 100644 tools/rpc_replay/info_thread.h create mode 100644 tools/rpc_replay/rpc_replay.cpp create mode 100644 tools/rpc_view/CMakeLists.txt create mode 100644 tools/rpc_view/rpc_view.cpp create mode 100644 tools/rpc_view/view.proto create mode 100644 tools/trackme_server/CMakeLists.txt create mode 100644 tools/trackme_server/trackme_server.cpp create mode 100644 tools/wireshark_baidu_std.lua diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..5da60c1 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,62 @@ + + +# Repository Guidelines + +## Project Structure & Module Organization + +Core C++ code lives in `src/`: `src/brpc`, `src/bthread`, +`src/butil`, `src/bvar`, `src/json2pb`, and `src/mcpack2pb`. Tests are in +`test/` and mirror module names. Samples are in `example/`; utilities +are in `tools/`. Documentation is under `docs/en` and `docs/cn`; packaging and +bindings live in `package/`, `homebrew-formula/`, `python/`, and `java/`. + +## Build, Test, and Development Commands + +- `sh config_brpc.sh --headers=/usr/include --libs=/usr/lib && make`: configure and build with Make. +- `cmake -B build && cmake --build build -j6`: configure and build with CMake. +- `cmake -B build -DBUILD_UNIT_TESTS=ON && cmake --build build -j6 && cd build && ctest`: run CMake tests. +- `cd test && make && sh run_tests.sh`: run the Make-based test suite. +- `bazel build //:brpc` and `bazel test //test/...`: build or test with Bazel. +- `cd example/echo_c++ && make && ./echo_server & ./echo_client`: smoke-test an example. + +## Coding Style & Naming Conventions + +Follow Google C++ style with 4-space indentation. Keep feature-specific code in +the relevant protocol or module, not broad files such as `server.cpp` or +`channel.cpp`, unless the behavior is general. Use existing names: +`*_unittest.cpp` or `*_unittest.cc`, module prefixes such as `brpc_`, +`bthread_`, and `bvar_`, and `.proto` files beside related code. + +## Testing Guidelines + +New behavior should include unit tests. Run the smallest relevant test first, +then the broader affected suite. Tests use Google Test and live in `test/`. +Some integration tests require Redis or MySQL and may skip when absent. + +## Commit & Pull Request Guidelines + +Recent history uses short imperative subjects such as `Fix bazel compile error +on macOS`. Keep commits focused, explain behavioral impact when needed, and +link issues. Pull requests should describe the change, list tests run, note +platform or dependency assumptions, and pass GitHub Actions. + +## Security & Configuration Tips + +Read `SECURITY.md` before reporting vulnerabilities. Avoid committing +build directories, local paths, credentials, or machine-specific configuration. +Prefer flags such as `--with-glog`, `--with-thrift`, `--with-asan`, +or the matching CMake/Bazel options. diff --git a/BUILD.bazel b/BUILD.bazel new file mode 100644 index 0000000..b51ee0f --- /dev/null +++ b/BUILD.bazel @@ -0,0 +1,582 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", "objc_library") +load("//bazel/tools:brpc_proto_library.bzl", "brpc_proto_library") + +licenses(["notice"]) # Apache v2 + +exports_files(["LICENSE"]) + +COPTS = [ + "-fno-omit-frame-pointer", +] + select({ + "//bazel/config:brpc_with_asan": ["-fsanitize=address"], + "//conditions:default": [], +}) + +DEFINES = [ + "BTHREAD_USE_FAST_PTHREAD_MUTEX", + "__const__=__unused__", + "_GNU_SOURCE", + "USE_SYMBOLIZE", + "NO_TCMALLOC", + "__STDC_FORMAT_MACROS", + "__STDC_LIMIT_MACROS", + "__STDC_CONSTANT_MACROS", +] + select({ + "//bazel/config:brpc_with_glog": ["BRPC_WITH_GLOG=1"], + "//conditions:default": ["BRPC_WITH_GLOG=0"], + }) + select({ + "//bazel/config:brpc_with_mesalink": ["USE_MESALINK"], + "//conditions:default": [], + }) + select({ + "//bazel/config:brpc_with_thrift": ["ENABLE_THRIFT_FRAMED_PROTOCOL=1"], + "//conditions:default": [], + }) + select({ + "//bazel/config:brpc_with_thrift_legacy_version": [], + "//conditions:default": ["THRIFT_STDCXX=std"], + }) + select({ + "//bazel/config:brpc_with_rdma": ["BRPC_WITH_RDMA=1"], + "//conditions:default": [], + }) + select({ + "//bazel/config:brpc_with_debug_bthread_sche_safety": ["BRPC_DEBUG_BTHREAD_SCHE_SAFETY=1"], + "//conditions:default": ["BRPC_DEBUG_BTHREAD_SCHE_SAFETY=0"], + }) + select({ + "//bazel/config:brpc_with_debug_lock": ["BRPC_DEBUG_LOCK=1"], + "//conditions:default": ["BRPC_DEBUG_LOCK=0"], + }) + select({ + "//bazel/config:brpc_with_no_pthread_mutex_hook": ["NO_PTHREAD_MUTEX_HOOK"], + "//conditions:default": [], + }) + +LINKOPTS = [ + "-pthread", + "-ldl", +] + select({ + "@bazel_tools//src/conditions:darwin": [ + "-framework CoreFoundation", + "-framework CoreGraphics", + "-framework CoreData", + "-framework CoreText", + "-framework Security", + "-framework Foundation", + "-Wl,-U,_MallocExtension_ReleaseFreeMemory", + "-Wl,-U,_ProfilerStart", + "-Wl,-U,_ProfilerStop", + "-Wl,-U,__Z13GetStackTracePPvii", + "-Wl,-U,_RegisterThriftProtocol", + "-Wl,-U,_mallctl", + "-Wl,-U,_malloc_stats_print", + ], + "//conditions:default": [ + "-lrt", + ], +}) + select({ + "//bazel/config:brpc_with_mesalink": [ + "-lmesalink", + ], + "//conditions:default": [], +}) + select({ + "//bazel/config:brpc_with_rdma": [ + "-libverbs", + ], + "//conditions:default": [], +}) + select({ + "//bazel/config:brpc_with_asan": ["-fsanitize=address"], + "//conditions:default": [], + }) + +genrule( + name = "config_h", + outs = [ + "src/butil/config.h", + ], + cmd = """cat << EOF >$@""" + """ +// This file is auto-generated. +#ifndef BUTIL_CONFIG_H +#define BUTIL_CONFIG_H +#ifdef BRPC_WITH_GLOG +#undef BRPC_WITH_GLOG +#endif +#define BRPC_WITH_GLOG """ + select({ + "//bazel/config:brpc_with_glog": "1", + "//conditions:default": "0", + }) + + """ +#endif // BUTIL_CONFIG_H +EOF + """, +) + +BUTIL_SRCS = [ + "src/butil/third_party/dmg_fp/g_fmt.cc", + "src/butil/third_party/dmg_fp/dtoa_wrapper.cc", + "src/butil/third_party/dynamic_annotations/dynamic_annotations.c", + "src/butil/third_party/icu/icu_utf.cc", + "src/butil/third_party/superfasthash/superfasthash.c", + "src/butil/third_party/modp_b64/modp_b64.cc", + "src/butil/third_party/symbolize/demangle.cc", + "src/butil/third_party/symbolize/symbolize.cc", + "src/butil/third_party/snappy/snappy-sinksource.cc", + "src/butil/third_party/snappy/snappy-stubs-internal.cc", + "src/butil/third_party/snappy/snappy.cc", + "src/butil/third_party/murmurhash3/murmurhash3.cpp", + "src/butil/arena.cpp", + "src/butil/at_exit.cc", + "src/butil/atomicops_internals_x86_gcc.cc", + "src/butil/base64.cc", + "src/butil/base64url.cc", + "src/butil/big_endian.cc", + "src/butil/cpu.cc", + "src/butil/debug/alias.cc", + "src/butil/debug/asan_invalid_access.cc", + "src/butil/debug/crash_logging.cc", + "src/butil/debug/debugger.cc", + "src/butil/debug/debugger_posix.cc", + "src/butil/debug/dump_without_crashing.cc", + "src/butil/debug/proc_maps_linux.cc", + "src/butil/debug/stack_trace.cc", + "src/butil/debug/stack_trace_posix.cc", + "src/butil/environment.cc", + "src/butil/files/file.cc", + "src/butil/files/file_posix.cc", + "src/butil/files/file_enumerator.cc", + "src/butil/files/file_enumerator_posix.cc", + "src/butil/files/file_path.cc", + "src/butil/files/file_path_constants.cc", + "src/butil/files/memory_mapped_file.cc", + "src/butil/files/memory_mapped_file_posix.cc", + "src/butil/files/scoped_file.cc", + "src/butil/files/scoped_temp_dir.cc", + "src/butil/file_util.cc", + "src/butil/file_util_posix.cc", + "src/butil/guid.cc", + "src/butil/guid_posix.cc", + "src/butil/hash.cc", + "src/butil/lazy_instance.cc", + "src/butil/location.cc", + "src/butil/memory/aligned_memory.cc", + "src/butil/memory/ref_counted.cc", + "src/butil/memory/ref_counted_memory.cc", + "src/butil/memory/singleton.cc", + "src/butil/memory/weak_ptr.cc", + "src/butil/posix/file_descriptor_shuffle.cc", + "src/butil/posix/global_descriptors.cc", + "src/butil/process_util.cc", + "src/butil/rand_util.cc", + "src/butil/rand_util_posix.cc", + "src/butil/fast_rand.cpp", + "src/butil/safe_strerror_posix.cc", + "src/butil/sha1_portable.cc", + "src/butil/strings/latin1_string_conversions.cc", + "src/butil/strings/nullable_string16.cc", + "src/butil/strings/safe_sprintf.cc", + "src/butil/strings/string16.cc", + "src/butil/strings/string_number_conversions.cc", + "src/butil/strings/string_split.cc", + "src/butil/strings/string_piece.cc", + "src/butil/strings/string_util.cc", + "src/butil/strings/string_util_constants.cc", + "src/butil/strings/stringprintf.cc", + "src/butil/strings/utf_offset_string_conversions.cc", + "src/butil/strings/utf_string_conversion_utils.cc", + "src/butil/strings/utf_string_conversions.cc", + "src/butil/synchronization/cancellation_flag.cc", + "src/butil/synchronization/condition_variable_posix.cc", + "src/butil/synchronization/waitable_event_posix.cc", + "src/butil/threading/non_thread_safe_impl.cc", + "src/butil/threading/platform_thread_posix.cc", + "src/butil/threading/simple_thread.cc", + "src/butil/threading/thread_checker_impl.cc", + "src/butil/threading/thread_collision_warner.cc", + "src/butil/threading/thread_id_name_manager.cc", + "src/butil/threading/thread_local_posix.cc", + "src/butil/threading/thread_local_storage.cc", + "src/butil/threading/thread_local_storage_posix.cc", + "src/butil/threading/thread_restrictions.cc", + "src/butil/threading/watchdog.cc", + "src/butil/time/clock.cc", + "src/butil/time/default_clock.cc", + "src/butil/time/default_tick_clock.cc", + "src/butil/time/tick_clock.cc", + "src/butil/time/time.cc", + "src/butil/time/time_posix.cc", + "src/butil/version.cc", + "src/butil/logging.cc", + "src/butil/class_name.cpp", + "src/butil/errno.cpp", + "src/butil/find_cstr.cpp", + "src/butil/status.cpp", + "src/butil/string_printf.cpp", + "src/butil/thread_local.cpp", + "src/butil/thread_key.cpp", + "src/butil/unix_socket.cpp", + "src/butil/endpoint.cpp", + "src/butil/fd_utility.cpp", + "src/butil/files/temp_file.cpp", + "src/butil/files/file_watcher.cpp", + "src/butil/time.cpp", + "src/butil/zero_copy_stream_as_streambuf.cpp", + "src/butil/crc32c.cc", + "src/butil/containers/case_ignored_flat_map.cpp", + "src/butil/iobuf.cpp", + "src/butil/single_iobuf.cpp", + "src/butil/iobuf_profiler.cpp", + "src/butil/binary_printer.cpp", + "src/butil/recordio.cc", + "src/butil/popen.cpp", +] + select({ + "@bazel_tools//src/conditions:darwin": [ + "src/butil/time/time_mac.cc", + "src/butil/mac/scoped_mach_port.cc", + ], + "//conditions:default": [ + "src/butil/file_util_linux.cc", + "src/butil/threading/platform_thread_linux.cc", + "src/butil/strings/sys_string_conversions_posix.cc", + ], +}) + +objc_library( + name = "macos_lib", + hdrs = [ + "src/butil/atomicops.h", + "src/butil/atomicops_internals_atomicword_compat.h", + "src/butil/atomicops_internals_mac.h", + "src/butil/base_export.h", + "src/butil/basictypes.h", + "src/butil/build_config.h", + "src/butil/compat.h", + "src/butil/compiler_specific.h", + "src/butil/containers/hash_tables.h", + "src/butil/debug/debugger.h", + "src/butil/debug/leak_annotations.h", + "src/butil/file_descriptor_posix.h", + "src/butil/file_util.h", + "src/butil/files/file.h", + "src/butil/files/file_path.h", + "src/butil/files/scoped_file.h", + "src/butil/lazy_instance.h", + "src/butil/logging.h", + "src/butil/mac/bundle_locations.h", + "src/butil/mac/foundation_util.h", + "src/butil/mac/scoped_cftyperef.h", + "src/butil/mac/scoped_typeref.h", + "src/butil/macros.h", + "src/butil/string_printf.h", + "src/butil/memory/aligned_memory.h", + "src/butil/memory/scoped_policy.h", + "src/butil/memory/scoped_ptr.h", + "src/butil/move.h", + "src/butil/port.h", + "src/butil/posix/eintr_wrapper.h", + "src/butil/scoped_generic.h", + "src/butil/strings/string16.h", + "src/butil/strings/string_piece.h", + "src/butil/strings/string_util.h", + "src/butil/strings/string_util_posix.h", + "src/butil/strings/sys_string_conversions.h", + "src/butil/synchronization/lock.h", + "src/butil/third_party/dynamic_annotations/dynamic_annotations.h", + "src/butil/third_party/murmurhash3/murmurhash3.h", + "src/butil/threading/platform_thread.h", + "src/butil/threading/thread_id_name_manager.h", + "src/butil/threading/thread_restrictions.h", + "src/butil/time.h", + "src/butil/time/time.h", + "src/butil/type_traits.h", + ":config_h", + ], + enable_modules = True, + includes = ["src/"], + non_arc_srcs = [ + "src/butil/mac/bundle_locations.mm", + "src/butil/mac/foundation_util.mm", + "src/butil/file_util_mac.mm", + "src/butil/threading/platform_thread_mac.mm", + "src/butil/strings/sys_string_conversions_mac.mm", + ], + tags = ["manual"], + deps = [ + "@com_github_gflags_gflags//:gflags", + ] + select({ + "//bazel/config:brpc_with_glog": ["@com_github_google_glog//:glog"], + "//conditions:default": [], + }), +) + +cc_library( + name = "butil", + srcs = BUTIL_SRCS, + hdrs = glob([ + "src/butil/*.h", + "src/butil/*.hpp", + "src/butil/**/*.h", + "src/butil/**/*.hpp", + "src/butil/**/**/*.h", + "src/butil/**/**/*.hpp", + "src/butil/**/**/**/*.h", + "src/butil/**/**/**/*.hpp", + ]) + [ + "src/butil/third_party/dmg_fp/dtoa.cc", + ":config_h", + ], + defines = DEFINES + select({ + "//bazel/config:brpc_build_for_unittest": [ + "UNIT_TEST", + ], + "//conditions:default": [], + }), + copts = COPTS, + includes = [ + "src/", + ], + linkopts = LINKOPTS, + visibility = ["//visibility:public"], + deps = [ + "@com_github_gflags_gflags//:gflags", + "@com_github_madler_zlib//:zlib", + "@com_google_protobuf//:protobuf", + ] + select({ + "//bazel/config:brpc_with_glog": ["@com_github_google_glog//:glog"], + "//conditions:default": [], + }) + select({ + "@bazel_tools//src/conditions:darwin": [":macos_lib"], + "//conditions:default": [], + }) + select({ + "//bazel/config:brpc_with_boringssl": [ + "@boringssl//:ssl", + "@boringssl//:crypto" + ], + "//conditions:default": [ + "@openssl//:ssl", + "@openssl//:crypto" + ], + }), +) + +cc_library( + name = "bvar", + srcs = glob( + [ + "src/bvar/*.cpp", + "src/bvar/detail/*.cpp", + ], + exclude = [ + "src/bvar/default_variables.cpp", + ], + ) + select({ + "//bazel/config:brpc_build_for_unittest": [], + "//conditions:default": ["src/bvar/default_variables.cpp"], + }), + hdrs = glob([ + "src/bvar/*.h", + "src/bvar/utils/*.h", + "src/bvar/detail/*.h", + ]), + defines = [] + select({ + "//bazel/config:with_babylon_counter": ["WITH_BABYLON_COUNTER=1"], + "//conditions:default": [], + }) + select({ + "//bazel/config:brpc_build_for_unittest": [ + "BVAR_NOT_LINK_DEFAULT_VARIABLES", + ], + "//conditions:default": [], + }), + copts = COPTS, + includes = [ + "src/", + ], + linkopts = LINKOPTS, + visibility = ["//visibility:public"], + deps = [ + ":butil", + ] + select({ + "//bazel/config:with_babylon_counter": ["@babylon//:concurrent_counter"], + "//conditions:default": [], + }), +) + +cc_library( + name = "bthread", + srcs = glob([ + "src/bthread/*.cpp", + ]), + hdrs = glob([ + "src/bthread/*.h", + "src/bthread/*.list", + ]), + defines = [] + select({ + "//bazel/config:brpc_with_bthread_tracer": [ + "BRPC_BTHREAD_TRACER", + ], + "//conditions:default": [], + }), + copts = COPTS, + includes = [ + "src/", + ], + linkopts = LINKOPTS, + visibility = ["//visibility:public"], + deps = [ + ":butil", + ":bvar", + ] + select({ + "//bazel/config:brpc_with_bthread_tracer": [ + "@com_github_libunwind_libunwind//:libunwind", + "@com_google_absl//absl/debugging:stacktrace", + "@com_google_absl//absl/debugging:symbolize", + ], + "//conditions:default": [], + }), +) + +cc_library( + name = "json2pb", + srcs = glob([ + "src/json2pb/*.cpp", + ]), + hdrs = glob([ + "src/json2pb/*.h", + ]), + copts = COPTS, + includes = [ + "src/", + ], + linkopts = LINKOPTS, + visibility = ["//visibility:public"], + deps = [ + ":butil", + ], +) + +cc_library( + name = "mcpack2pb", + srcs = [ + "src/mcpack2pb/field_type.cpp", + "src/mcpack2pb/mcpack2pb.cpp", + "src/mcpack2pb/parser.cpp", + "src/mcpack2pb/serializer.cpp", + ], + hdrs = glob([ + "src/mcpack2pb/*.h", + ]), + copts = COPTS, + includes = [ + "src/", + ], + linkopts = LINKOPTS, + visibility = ["//visibility:public"], + deps = [ + ":brpc_idl_options_cc_proto", + ":butil", + ], +) + +filegroup( + name = "brpc_idl_options_proto_srcs", + srcs = [ + "src/idl_options.proto", + ], + visibility = ["//visibility:public"], +) + +brpc_proto_library( + name = "brpc_idl_options_cc_proto", + srcs = [":brpc_idl_options_proto_srcs"], + include = "src", + visibility = ["//visibility:public"], +) + +filegroup( + name = "brpc_internal_proto_srcs", + srcs = glob([ + "src/brpc/*.proto", + "src/brpc/policy/*.proto", + "src/brpc/rdma/*.proto", + ]), + visibility = ["//visibility:public"], +) + +brpc_proto_library( + name = "brpc_internal_cc_proto", + srcs = [":brpc_internal_proto_srcs"], + include = "src", + deps = [":brpc_idl_options_cc_proto"], + visibility = ["//visibility:public"], +) + +cc_library( + name = "brpc", + srcs = glob([ + "src/brpc/*.cpp", + "src/brpc/**/*.cpp", + ], + exclude = [ + "src/brpc/thrift_service.cpp", + "src/brpc/thrift_message.cpp", + "src/brpc/policy/thrift_protocol.cpp", + "src/brpc/event_dispatcher_epoll.cpp", + "src/brpc/event_dispatcher_kqueue.cpp", + ]) + select({ + "//bazel/config:brpc_with_thrift": glob([ + "src/brpc/thrift*.cpp", + "src/brpc/**/thrift*.cpp", + ]), + "//conditions:default": [], + }), + hdrs = glob([ + "src/brpc/*.h", + "src/brpc/**/*.h", + "src/brpc/event_dispatcher_epoll.cpp", + "src/brpc/event_dispatcher_kqueue.cpp", + ]), + copts = COPTS, + includes = [ + "src/", + ], + linkopts = LINKOPTS, + visibility = ["//visibility:public"], + deps = [ + ":brpc_internal_cc_proto", + ":bthread", + ":butil", + ":bvar", + ":json2pb", + ":mcpack2pb", + "@com_github_google_leveldb//:leveldb", + ] + select({ + "//bazel/config:brpc_with_thrift": [ + "@org_apache_thrift//:thrift", + ], + "//conditions:default": [], + }), +) + +cc_binary( + name = "protoc-gen-mcpack", + srcs = [ + "src/mcpack2pb/generator.cpp", + ], + copts = COPTS, + linkopts = LINKOPTS, + visibility = ["//visibility:public"], + deps = [ + ":brpc", + ":brpc_idl_options_cc_proto", + "@com_google_protobuf//:protoc_lib", + ], +) diff --git a/CHANGES.md b/CHANGES.md new file mode 100644 index 0000000..41acb2e --- /dev/null +++ b/CHANGES.md @@ -0,0 +1,61 @@ + + +# Table of Contents + +- [0.9.7](#0.9.7) +- [0.9.6](#0.9.6) +- [0.9.5](#0.9.5) +- [0.9.0](#0.9.0) + +## 0.9.7 +* Add DISCLAIMER-WIP as license issues are not all resolved +* Fix many license related issues +* Ignore flow control in h2 when sending first request +* Add flame graph view for profiling builtin service +* Fix bug that _avg_latency maybe zero in lalb +* Fix bug that logging namespace conflicts with others +* Add gdb_bthread_stack.py to read bthread stack +* Adapt to Arm64 +* Support redis server protocol +* Enable circuit breaker for backup request +* Support zone for bilibili discovery naming service when fetching server nodes +* Add brpc revision in release version + +## 0.9.6 +* Health (of a connection) can be checked at rpc-level +* Fix SSL-related compilation issues on Mac +* Support SSL-replacement lib MesaLink +* Support consistent hashing with ketama algo. +* bvar variables can be exported for prometheus services +* String[Multi]Splitter supports '\0' as separator +* Support for bilibili discovery service +* Improved CircuitBreaker +* grpc impl. supports timeout + +## 0.9.5 +* h2c/grpc are supported now, h2(encrypted) is not included. +* thrift support. +* Mac build support +* Extend ConcurrencyLimiter to control max-concurrency dynamically and an "auto" CL is supported by default +* CircuitBreaker support to isolate abnormal servers more effectively + +## 0.9.0 +* Contains major features of brpc, OK for production usages. +* No h2/h2c/rdma support, Mac/Windows ports are not ready yet. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..5617963 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,123 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Overview + +Apache bRPC is an industrial-grade C++ RPC framework supporting multiple protocols (baidu_std, HTTP/H2, gRPC, thrift, redis, memcached, RTMP, RDMA) on the same port. Used in high-performance systems: search, storage, ML, ads, recommendations. Current version: 1.17.0. + +## Build Commands + +### Make (primary) + +```bash +# Generate config (required before first build) +./config_brpc.sh --headers=/usr/include --libs=/usr/lib + +# Build library (produces libbrpc.a and libbrpc.so/dylib) +make -j$(nproc) + +# Build debug version (with UNIT_TEST flag, no NDEBUG) +make debug +``` + +Config options: `--with-glog`, `--with-thrift`, `--with-rdma`, `--with-asan`, `--werror` + +### CMake + +```bash +mkdir build && cd build +cmake .. -DCMAKE_BUILD_TYPE=Release +make -j$(nproc) +``` + +Key CMake options: `-DWITH_GLOG=ON`, `-DWITH_THRIFT=ON`, `-DWITH_RDMA=ON`, `-DWITH_ASAN=ON`, `-DBUILD_UNIT_TESTS=ON`, `-DDOWNLOAD_GTEST=ON` + +### Bazel + +```bash +bazel build -- //... -//example/... +``` + +## Running Tests + +Tests use Google Test. Build and run with Make: + +```bash +cd test +make -j$(nproc) +./run_tests.sh # runs all: test_butil, test_bvar, bthread_*unittest, brpc_*unittest +``` + +Run a single test binary: + +```bash +cd test +./ # e.g. ./test_butil +./ --gtest_filter='TestSuite.TestName' # single test case +``` + +With CMake: + +```bash +cmake .. -DBUILD_UNIT_TESTS=ON -DDOWNLOAD_GTEST=ON +make -j$(nproc) && ctest +``` + +ASAN is used in CI: `ASAN_OPTIONS="detect_leaks=0:detect_stack_use_after_return=1" ./` + +## Architecture + +### Core Libraries (under `src/`) + +- **brpc/** — The RPC framework. Three core abstractions: + - `Server` — listens on a port, dispatches requests to registered services. Supports multiple protocols on the same port via protocol detection. + - `Channel` — client-side stub for sending RPCs. Configured with naming service, load balancer, timeout, retry policies via `ChannelOptions`. + - `Controller` — per-RPC context carrying request metadata, error state, timeout, attachments. Extends `google::protobuf::RpcController`. + - `Socket` (`socket.h`) — low-level connection abstraction managing fd lifecycle, SSL, and write buffering. Uses `VersionedRefWithId` for safe concurrent access. + +- **bthread/** — M:N user-level threading (the concurrency foundation of brpc) + - `TaskControl` manages a pool of worker pthreads, each running a `TaskGroup` + - `TaskGroup` owns a local run queue + work-stealing queue (`work_stealing_queue.h`, lock-free CAS-based) + - `bthread_start_urgent()` runs task immediately on current worker; `bthread_start_background()` enqueues for later scheduling + - Most brpc callbacks execute in bthreads, not pthreads + +- **butil/** — Base utility library (originally forked from Chromium) + - `IOBuf` (`iobuf.h`) — zero-copy buffer using reference-counted blocks with SmallView (2 inline BlockRefs) / BigView (heap) optimization. Core data structure for network I/O. + - Also: FlatMap, logging, string utils, time, files, containers + - `third_party/` — Bundled snappy, murmurhash3, symbolize, etc. + +- **bvar/** — Multi-dimensional statistics variables + - Thread-local aggregation via `AgentCombiner` for lock-free counters + - Types: `Adder`, `Recorder`, `LatencyRecorder`, `PassiveStatus` + - Composable windows: `PerSecond>`, `Window<>` + - Auto-exposed via builtin `/vars` endpoint + +- **json2pb/** — Bidirectional JSON <-> Protobuf conversion + +- **mcpack2pb/** — MCPack format <-> Protobuf conversion (Baidu legacy) + +### Key Design Patterns + +- **Protocol plugins** (`src/brpc/policy/`): Each protocol implements the `Protocol` struct (function pointers for Parse/Serialize/Pack/Process/Verify in `protocol.h`), registered via `RegisterProtocol()`. 18 protocols implemented. Adding a new protocol does not touch core files — see `docs/en/new_protocol.md`. +- **Naming services / Load balancers**: Pluggable via `NamingService` and `LoadBalancer` interfaces (DNS, ZK, etcd, round-robin, consistent hashing, locality-aware, etc.) +- **Builtin services** (`src/brpc/builtin/`): Every brpc server auto-exposes debug endpoints — `/status`, `/vars`, `/flags`, `/rpcz`, `/hotspots` (cpu/heap/contention profilers). +- **Error model**: Functions return 0/-1 with errno; `Controller::SetFailed()` for RPC-level errors; custom error codes defined in `errno.proto`. +- **Memory patterns**: `ResourcePool` / `ObjectPool` for socket and bthread recycling; `butil::intrusive_ptr` for hot-path reference counting; IOBuf for zero-copy I/O. + +## Code Style + +- Google C++ Style Guide with **4-space indentation** +- Protocol-specific code goes in `src/brpc/policy/`, not in core files like `server.cpp` or `channel.cpp` +- General modifications should not be hidden inside protocol-specific files +- All changes require unit tests +- CI runs on GitHub Actions (Linux gcc/clang, macOS) — must pass before merge +- Uses C++11 minimum; some C++17 features with compiler guards. Legacy patterns (`DISALLOW_COPY_AND_ASSIGN` macro) still prevalent. + +## Dependencies + +Required: protobuf (3.x–21.x), gflags, leveldb, openssl. Optional: glog, thrift, gperftools (tcmalloc/profiler), gtest (for tests), libunwind, abseil-cpp, BoringSSL (alternative to openssl). + +## Examples + +30+ examples in `example/` covering echo, HTTP, gRPC, streaming, redis, memcache, thrift, RDMA, coroutine, etc. Each has its own Makefile/CMakeLists.txt/BUILD. diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..130860a --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,654 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +cmake_minimum_required(VERSION 3.16...3.28) +project(brpc C CXX) + +option(WITH_GLOG "With glog" OFF) +option(WITH_MESALINK "With MesaLink" OFF) +option(WITH_BORINGSSL "With BoringSSL" OFF) +option(DEBUG "Print debug logs" OFF) +option(WITH_DEBUG_SYMBOLS "With debug symbols" ON) +option(WITH_THRIFT "With thrift framed protocol supported" OFF) +option(WITH_BTHREAD_TRACER "With bthread tracer supported" OFF) +option(WITH_SNAPPY "With snappy" OFF) +option(WITH_RDMA "With RDMA" OFF) +option(WITH_DEBUG_BTHREAD_SCHE_SAFETY "With debugging bthread sche safety" OFF) +option(WITH_DEBUG_LOCK "With debugging lock" OFF) +option(WITH_ASAN "With AddressSanitizer" OFF) +option(BUILD_UNIT_TESTS "Whether to build unit tests" OFF) +option(BUILD_FUZZ_TESTS "Whether to build fuzz tests" OFF) +option(BUILD_BRPC_TOOLS "Whether to build brpc tools" ON) +option(DOWNLOAD_GTEST "Download and build a fresh copy of googletest. Requires Internet access." ON) + +# Enable MACOSX_RPATH. Run "cmake --help-policy CMP0042" for policy details. +if(POLICY CMP0042) + cmake_policy(SET CMP0042 NEW) +endif() + +set(BRPC_VERSION 1.17.0) + +SET(CPACK_GENERATOR "DEB") +SET(CPACK_DEBIAN_PACKAGE_MAINTAINER "brpc authors") +INCLUDE(CPack) + +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + # require at least gcc 4.8 + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) + message(FATAL_ERROR "GCC is too old, please install a newer version supporting C++11") + endif() +elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + # require at least clang 3.3 + if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.3) + message(FATAL_ERROR "Clang is too old, please install a newer version supporting C++11") + endif() +else() + message(WARNING "You are using an unsupported compiler! Compilation has only been tested with Clang and GCC.") +endif() + +set(BRPC_COMMON_COMPILE_OPTIONS) +set(BRPC_COMMON_DEFINITIONS) +set(BRPC_COMMON_INCLUDE_DIRS + ${PROJECT_SOURCE_DIR}/src + ${CMAKE_CURRENT_BINARY_DIR} +) +set(BRPC_COMMON_LINK_OPTIONS) +set(BRPC_CXX_STANDARD 11) + +set(WITH_GLOG_VAL "0") +if(WITH_GLOG) + set(WITH_GLOG_VAL "1") + set(BRPC_WITH_GLOG 1) +endif() + +if(WITH_DEBUG_SYMBOLS) + list(APPEND BRPC_COMMON_COMPILE_OPTIONS -g) +endif() + +set(WITH_DEBUG_LOCK_VAL "0") +if(WITH_DEBUG_LOCK) + set(WITH_DEBUG_LOCK_VAL "1") +endif() + +if(WITH_THRIFT) + list(APPEND BRPC_COMMON_DEFINITIONS ENABLE_THRIFT_FRAMED_PROTOCOL) + find_library(THRIFT_LIB NAMES thrift) + if (NOT THRIFT_LIB) + message(FATAL_ERROR "Fail to find Thrift") + endif() +endif() + +if (WITH_BTHREAD_TRACER) + if (NOT (CMAKE_SYSTEM_NAME STREQUAL "Linux") OR NOT (CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64")) + message(FATAL_ERROR "bthread tracer is only supported on Linux x86_64 platform") + endif() + find_path(LIBUNWIND_INCLUDE_PATH NAMES libunwind.h) + find_library(LIBUNWIND_LIB NAMES unwind) + find_library(LIBUNWIND_X86_64_LIB NAMES unwind-x86_64) + if (NOT LIBUNWIND_INCLUDE_PATH OR NOT LIBUNWIND_LIB) + message(FATAL_ERROR "Fail to find libunwind, which is needed by bthread tracer") + endif() + find_package(absl REQUIRED CONFIG) + set(bthread_tracer_ABSL_USED_TARGETS absl::base absl::stacktrace absl::symbolize) + list(APPEND BRPC_COMMON_DEFINITIONS BRPC_BTHREAD_TRACER) + list(APPEND BRPC_COMMON_INCLUDE_DIRS ${LIBUNWIND_INCLUDE_PATH}) +endif () + +set(WITH_RDMA_VAL "0") +if(WITH_RDMA) + set(WITH_RDMA_VAL "1") +endif() + +set(WITH_DEBUG_BTHREAD_SCHE_SAFETY_VAL "0") +if(WITH_DEBUG_BTHREAD_SCHE_SAFETY) + set(WITH_DEBUG_BTHREAD_SCHE_SAFETY_VAL "1") +endif() + +include(GNUInstallDirs) + +configure_file(${PROJECT_SOURCE_DIR}/config.h.in ${PROJECT_SOURCE_DIR}/src/butil/config.h @ONLY) + +list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake") + +find_package(GFLAGS REQUIRED) + +execute_process( + COMMAND bash -c "${PROJECT_SOURCE_DIR}/tools/get_brpc_revision.sh ${PROJECT_SOURCE_DIR} | tr -d '\n'" + OUTPUT_VARIABLE BRPC_REVISION +) +string(REPLACE "\\|" "|" BRPC_REVISION "${BRPC_REVISION}") + +if(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + include(CheckFunctionExists) + CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME) + if(NOT HAVE_CLOCK_GETTIME) + list(APPEND BRPC_COMMON_DEFINITIONS NO_CLOCK_GETTIME_IN_MAC) + endif() + list(APPEND BRPC_COMMON_COMPILE_OPTIONS + -Wno-deprecated-declarations + -Wno-inconsistent-missing-override + ) +endif() + +list(APPEND BRPC_COMMON_DEFINITIONS + BRPC_WITH_GLOG=${WITH_GLOG_VAL} + BRPC_WITH_RDMA=${WITH_RDMA_VAL} + BRPC_DEBUG_BTHREAD_SCHE_SAFETY=${WITH_DEBUG_BTHREAD_SCHE_SAFETY_VAL} + BRPC_DEBUG_LOCK=${WITH_DEBUG_LOCK_VAL} + BTHREAD_USE_FAST_PTHREAD_MUTEX + __const__=__unused__ + _GNU_SOURCE + USE_SYMBOLIZE + NO_TCMALLOC + __STDC_FORMAT_MACROS + __STDC_LIMIT_MACROS + __STDC_CONSTANT_MACROS + __STRICT_ANSI__ +) +if(NOT DEBUG) + list(APPEND BRPC_COMMON_DEFINITIONS NDEBUG) +endif() +if(WITH_ASAN) + list(APPEND BRPC_COMMON_COMPILE_OPTIONS -fsanitize=address) + list(APPEND BRPC_COMMON_LINK_OPTIONS -fsanitize=address) +endif() +if(WITH_MESALINK) + list(APPEND BRPC_COMMON_DEFINITIONS USE_MESALINK) +endif() + +list(APPEND BRPC_COMMON_COMPILE_OPTIONS + -O2 + -pipe + -Wall + -W + -fPIC + -fstrict-aliasing + -Wno-unused-parameter + -fno-omit-frame-pointer + "-DBRPC_REVISION=\"${BRPC_REVISION}\"" + $<$:-Wno-invalid-offsetof> +) + +if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") + #required by butil/crc32.cc to boost performance for 10x + if((CMAKE_SYSTEM_PROCESSOR MATCHES "(x86)|(X86)|(amd64)|(AMD64)") AND NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.4)) + list(APPEND BRPC_COMMON_COMPILE_OPTIONS + $<$:-msse4> + $<$:-msse4.2> + ) + elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")) + # segmentation fault in libcontext + list(APPEND BRPC_COMMON_COMPILE_OPTIONS $<$:-fno-gcse>) + elseif((CMAKE_SYSTEM_PROCESSOR MATCHES "riscv64")) + # RISC-V specific optimizations + option(WITH_RISCV_ZBC "Enable RISC-V Zbc carry-less multiplication for CRC32C acceleration" OFF) + option(WITH_RISCV_ZVBC "Enable RISC-V Zvbc vector carry-less multiplication for CRC32C acceleration" OFF) + if(WITH_RISCV_ZVBC) + list(APPEND BRPC_COMMON_COMPILE_OPTIONS $<$:-march=rv64gcv_zbc_zvbc>) + elseif(WITH_RISCV_ZBC) + list(APPEND BRPC_COMMON_COMPILE_OPTIONS $<$:-march=rv64gc_zbc>) + else() + list(APPEND BRPC_COMMON_COMPILE_OPTIONS $<$:-march=rv64gc>) + endif() + endif() + if(NOT (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0)) + list(APPEND BRPC_COMMON_COMPILE_OPTIONS $<$:-Wno-aligned-new>) + endif() +endif() + +find_package(Protobuf REQUIRED) +if(Protobuf_VERSION VERSION_GREATER 4.21) + # required by absl + set(BRPC_CXX_STANDARD 17) + + find_package(absl REQUIRED CONFIG) + set(protobuf_ABSL_USED_TARGETS + absl::absl_check + absl::absl_log + absl::algorithm + absl::base + absl::bind_front + absl::bits + absl::btree + absl::cleanup + absl::cord + absl::core_headers + absl::debugging + absl::die_if_null + absl::dynamic_annotations + absl::flags + absl::flat_hash_map + absl::flat_hash_set + absl::function_ref + absl::hash + absl::layout + absl::log_initialize + absl::log_globals + absl::log_severity + absl::memory + absl::node_hash_map + absl::node_hash_set + absl::random_distributions + absl::random_random + absl::span + absl::status + absl::statusor + absl::strings + absl::synchronization + absl::time + absl::type_traits + absl::utility + absl::variant + ) +endif() +find_package(Threads REQUIRED) + +find_path(LEVELDB_INCLUDE_PATH NAMES leveldb/db.h) +find_library(LEVELDB_LIB NAMES leveldb) +if ((NOT LEVELDB_INCLUDE_PATH) OR (NOT LEVELDB_LIB)) + message(FATAL_ERROR "Fail to find leveldb") +endif() + +if(WITH_SNAPPY) + find_path(SNAPPY_INCLUDE_PATH NAMES snappy.h) + find_library(SNAPPY_LIB NAMES snappy) + if ((NOT SNAPPY_INCLUDE_PATH) OR (NOT SNAPPY_LIB)) + message(FATAL_ERROR "Fail to find snappy") + endif() + list(APPEND BRPC_COMMON_INCLUDE_DIRS ${SNAPPY_INCLUDE_PATH}) +endif() + +if(WITH_GLOG) + find_path(GLOG_INCLUDE_PATH NAMES glog/logging.h) + find_library(GLOG_LIB NAMES glog) + if((NOT GLOG_INCLUDE_PATH) OR (NOT GLOG_LIB)) + message(FATAL_ERROR "Fail to find glog") + endif() + list(APPEND BRPC_COMMON_INCLUDE_DIRS ${GLOG_INCLUDE_PATH}) +endif() + +if(WITH_MESALINK) + find_path(MESALINK_INCLUDE_PATH NAMES mesalink/openssl/ssl.h) + find_library(MESALINK_LIB NAMES mesalink) + if((NOT MESALINK_INCLUDE_PATH) OR (NOT MESALINK_LIB)) + message(FATAL_ERROR "Fail to find MesaLink") + else() + message(STATUS "Found MesaLink: ${MESALINK_LIB}") + endif() + list(APPEND BRPC_COMMON_INCLUDE_DIRS ${MESALINK_INCLUDE_PATH}) +endif() + +if(WITH_RDMA) + message("brpc compile with rdma") + find_path(RDMA_INCLUDE_PATH NAMES infiniband/verbs.h) + find_library(RDMA_LIB NAMES ibverbs) + if((NOT RDMA_INCLUDE_PATH) OR (NOT RDMA_LIB)) + message(FATAL_ERROR "Fail to find ibverbs") + endif() + list(APPEND BRPC_COMMON_INCLUDE_DIRS ${RDMA_INCLUDE_PATH}) +endif() + +find_library(PROTOC_LIB NAMES protoc) +if(NOT PROTOC_LIB) + message(FATAL_ERROR "Fail to find protoc lib") +endif() + +if(WITH_BORINGSSL) + find_package(BoringSSL) + list(APPEND BRPC_COMMON_INCLUDE_DIRS ${BORINGSSL_INCLUDE_DIR}) +else() + if(CMAKE_SYSTEM_NAME STREQUAL "Darwin" AND NOT OPENSSL_ROOT_DIR) + set(OPENSSL_ROOT_DIR + "/usr/local/opt/openssl" # Homebrew installed OpenSSL + ) + endif() + + find_package(OpenSSL REQUIRED) + list(APPEND BRPC_COMMON_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR}) +endif() + +list(APPEND BRPC_COMMON_INCLUDE_DIRS + ${GFLAGS_INCLUDE_PATH} + ${PROTOBUF_INCLUDE_DIRS} + ${LEVELDB_INCLUDE_PATH} +) + +set(DYNAMIC_LIB + ${GFLAGS_LIBRARY} + ${PROTOBUF_LIBRARIES} ${protobuf_ABSL_USED_TARGETS} + ${LEVELDB_LIB} + ${PROTOC_LIB} + ${CMAKE_THREAD_LIBS_INIT} + ${THRIFT_LIB} + dl + z) + +if(WITH_BORINGSSL) + list(APPEND DYNAMIC_LIB ${BORINGSSL_SSL_LIBRARY}) + list(APPEND DYNAMIC_LIB ${BORINGSSL_CRYPTO_LIBRARY}) +else() + if(WITH_MESALINK) + list(APPEND DYNAMIC_LIB ${OPENSSL_CRYPTO_LIBRARY}) + list(APPEND DYNAMIC_LIB ${MESALINK_LIB}) + else() + list(APPEND DYNAMIC_LIB ${OPENSSL_SSL_LIBRARY}) + list(APPEND DYNAMIC_LIB ${OPENSSL_CRYPTO_LIBRARY}) + endif() +endif() + +if(WITH_RDMA) + list(APPEND DYNAMIC_LIB ${RDMA_LIB}) +endif() + +set(BRPC_PRIVATE_LIBS "-lgflags -lprotobuf -lleveldb -lprotoc -lssl -lcrypto -ldl -lz") + +if(WITH_GLOG) + set(DYNAMIC_LIB ${GLOG_LIB} ${DYNAMIC_LIB}) + set(BRPC_PRIVATE_LIBS "-lglog ${BRPC_PRIVATE_LIBS}") +endif() + +if(WITH_SNAPPY) + set(DYNAMIC_LIB ${DYNAMIC_LIB} ${SNAPPY_LIB}) + set(BRPC_PRIVATE_LIBS "${BRPC_PRIVATE_LIBS} -lsnappy") +endif() + +if (WITH_BTHREAD_TRACER) + set(DYNAMIC_LIB ${DYNAMIC_LIB} ${LIBUNWIND_LIB} ${LIBUNWIND_X86_64_LIB} ${bthread_tracer_ABSL_USED_TARGETS}) + set(BRPC_PRIVATE_LIBS "${BRPC_PRIVATE_LIBS} -lunwind -lunwind-x86_64 -labsl_stacktrace -labsl_symbolize -labsl_debugging_internal -labsl_demangle_internal -labsl_malloc_internal -labsl_raw_logging_internal -labsl_spinlock_wait -labsl_base") +endif() + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(DYNAMIC_LIB ${DYNAMIC_LIB} rt) + set(BRPC_PRIVATE_LIBS "${BRPC_PRIVATE_LIBS} -lrt") +elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(DYNAMIC_LIB ${DYNAMIC_LIB} + pthread + "-framework CoreFoundation" + "-framework CoreGraphics" + "-framework CoreData" + "-framework CoreText" + "-framework Security" + "-framework Foundation" + "-Wl,-U,_MallocExtension_ReleaseFreeMemory" + "-Wl,-U,_ProfilerStart" + "-Wl,-U,_ProfilerStop" + "-Wl,-U,__Z13GetStackTracePPvii" + "-Wl,-U,_mallctl" + "-Wl,-U,_malloc_stats_print" + ) +endif() + +list(REMOVE_DUPLICATES BRPC_COMMON_INCLUDE_DIRS) + +add_library(brpc_common_config INTERFACE) +target_include_directories(brpc_common_config INTERFACE ${BRPC_COMMON_INCLUDE_DIRS}) +target_compile_definitions(brpc_common_config INTERFACE ${BRPC_COMMON_DEFINITIONS}) +target_compile_options(brpc_common_config INTERFACE ${BRPC_COMMON_COMPILE_OPTIONS}) +target_compile_features(brpc_common_config INTERFACE cxx_std_${BRPC_CXX_STANDARD}) +if(BRPC_COMMON_LINK_OPTIONS) + target_link_options(brpc_common_config INTERFACE ${BRPC_COMMON_LINK_OPTIONS}) +endif() + +# for *.so +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/output/lib) +# for *.a +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/output/lib) + +# the reason why not using file(GLOB_RECURSE...) is that we want to +# include different files on different platforms. +set(BUTIL_SOURCES + ${PROJECT_SOURCE_DIR}/src/butil/third_party/dmg_fp/g_fmt.cc + ${PROJECT_SOURCE_DIR}/src/butil/third_party/dmg_fp/dtoa_wrapper.cc + ${PROJECT_SOURCE_DIR}/src/butil/third_party/dynamic_annotations/dynamic_annotations.c + ${PROJECT_SOURCE_DIR}/src/butil/third_party/icu/icu_utf.cc + ${PROJECT_SOURCE_DIR}/src/butil/third_party/superfasthash/superfasthash.c + ${PROJECT_SOURCE_DIR}/src/butil/third_party/modp_b64/modp_b64.cc + ${PROJECT_SOURCE_DIR}/src/butil/third_party/symbolize/demangle.cc + ${PROJECT_SOURCE_DIR}/src/butil/third_party/symbolize/symbolize.cc + ${PROJECT_SOURCE_DIR}/src/butil/third_party/snappy/snappy-sinksource.cc + ${PROJECT_SOURCE_DIR}/src/butil/third_party/snappy/snappy-stubs-internal.cc + ${PROJECT_SOURCE_DIR}/src/butil/third_party/snappy/snappy.cc + ${PROJECT_SOURCE_DIR}/src/butil/third_party/murmurhash3/murmurhash3.cpp + ${PROJECT_SOURCE_DIR}/src/butil/arena.cpp + ${PROJECT_SOURCE_DIR}/src/butil/at_exit.cc + ${PROJECT_SOURCE_DIR}/src/butil/atomicops_internals_x86_gcc.cc + ${PROJECT_SOURCE_DIR}/src/butil/base64.cc + ${PROJECT_SOURCE_DIR}/src/butil/base64url.cc + ${PROJECT_SOURCE_DIR}/src/butil/big_endian.cc + ${PROJECT_SOURCE_DIR}/src/butil/cpu.cc + ${PROJECT_SOURCE_DIR}/src/butil/debug/alias.cc + ${PROJECT_SOURCE_DIR}/src/butil/debug/asan_invalid_access.cc + ${PROJECT_SOURCE_DIR}/src/butil/debug/crash_logging.cc + ${PROJECT_SOURCE_DIR}/src/butil/debug/debugger.cc + ${PROJECT_SOURCE_DIR}/src/butil/debug/debugger_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/debug/dump_without_crashing.cc + ${PROJECT_SOURCE_DIR}/src/butil/debug/proc_maps_linux.cc + ${PROJECT_SOURCE_DIR}/src/butil/debug/stack_trace.cc + ${PROJECT_SOURCE_DIR}/src/butil/debug/stack_trace_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/environment.cc + ${PROJECT_SOURCE_DIR}/src/butil/files/file.cc + ${PROJECT_SOURCE_DIR}/src/butil/files/file_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/files/file_enumerator.cc + ${PROJECT_SOURCE_DIR}/src/butil/files/file_enumerator_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/files/file_path.cc + ${PROJECT_SOURCE_DIR}/src/butil/files/file_path_constants.cc + ${PROJECT_SOURCE_DIR}/src/butil/files/memory_mapped_file.cc + ${PROJECT_SOURCE_DIR}/src/butil/files/memory_mapped_file_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/files/scoped_file.cc + ${PROJECT_SOURCE_DIR}/src/butil/files/scoped_temp_dir.cc + ${PROJECT_SOURCE_DIR}/src/butil/file_util.cc + ${PROJECT_SOURCE_DIR}/src/butil/file_util_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/guid.cc + ${PROJECT_SOURCE_DIR}/src/butil/guid_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/hash.cc + ${PROJECT_SOURCE_DIR}/src/butil/lazy_instance.cc + ${PROJECT_SOURCE_DIR}/src/butil/location.cc + ${PROJECT_SOURCE_DIR}/src/butil/memory/aligned_memory.cc + ${PROJECT_SOURCE_DIR}/src/butil/memory/ref_counted.cc + ${PROJECT_SOURCE_DIR}/src/butil/memory/ref_counted_memory.cc + ${PROJECT_SOURCE_DIR}/src/butil/memory/singleton.cc + ${PROJECT_SOURCE_DIR}/src/butil/memory/weak_ptr.cc + ${PROJECT_SOURCE_DIR}/src/butil/posix/file_descriptor_shuffle.cc + ${PROJECT_SOURCE_DIR}/src/butil/posix/global_descriptors.cc + ${PROJECT_SOURCE_DIR}/src/butil/process_util.cc + ${PROJECT_SOURCE_DIR}/src/butil/rand_util.cc + ${PROJECT_SOURCE_DIR}/src/butil/rand_util_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/fast_rand.cpp + ${PROJECT_SOURCE_DIR}/src/butil/safe_strerror_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/sha1_portable.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/latin1_string_conversions.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/nullable_string16.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/safe_sprintf.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/string16.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/string_number_conversions.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/string_split.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/string_piece.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/string_util.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/string_util_constants.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/stringprintf.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/utf_offset_string_conversions.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/utf_string_conversion_utils.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/utf_string_conversions.cc + ${PROJECT_SOURCE_DIR}/src/butil/synchronization/cancellation_flag.cc + ${PROJECT_SOURCE_DIR}/src/butil/synchronization/condition_variable_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/synchronization/waitable_event_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/non_thread_safe_impl.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/platform_thread_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/simple_thread.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_checker_impl.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_collision_warner.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_id_name_manager.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_local_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_local_storage.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_local_storage_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/thread_restrictions.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/watchdog.cc + ${PROJECT_SOURCE_DIR}/src/butil/time/clock.cc + ${PROJECT_SOURCE_DIR}/src/butil/time/default_clock.cc + ${PROJECT_SOURCE_DIR}/src/butil/time/default_tick_clock.cc + ${PROJECT_SOURCE_DIR}/src/butil/time/tick_clock.cc + ${PROJECT_SOURCE_DIR}/src/butil/time/time.cc + ${PROJECT_SOURCE_DIR}/src/butil/time/time_posix.cc + ${PROJECT_SOURCE_DIR}/src/butil/version.cc + ${PROJECT_SOURCE_DIR}/src/butil/logging.cc + ${PROJECT_SOURCE_DIR}/src/butil/class_name.cpp + ${PROJECT_SOURCE_DIR}/src/butil/errno.cpp + ${PROJECT_SOURCE_DIR}/src/butil/find_cstr.cpp + ${PROJECT_SOURCE_DIR}/src/butil/status.cpp + ${PROJECT_SOURCE_DIR}/src/butil/string_printf.cpp + ${PROJECT_SOURCE_DIR}/src/butil/thread_local.cpp + ${PROJECT_SOURCE_DIR}/src/butil/thread_key.cpp + ${PROJECT_SOURCE_DIR}/src/butil/unix_socket.cpp + ${PROJECT_SOURCE_DIR}/src/butil/endpoint.cpp + ${PROJECT_SOURCE_DIR}/src/butil/fd_utility.cpp + ${PROJECT_SOURCE_DIR}/src/butil/files/temp_file.cpp + ${PROJECT_SOURCE_DIR}/src/butil/files/file_watcher.cpp + ${PROJECT_SOURCE_DIR}/src/butil/time.cpp + ${PROJECT_SOURCE_DIR}/src/butil/zero_copy_stream_as_streambuf.cpp + ${PROJECT_SOURCE_DIR}/src/butil/crc32c.cc + ${PROJECT_SOURCE_DIR}/src/butil/containers/case_ignored_flat_map.cpp + ${PROJECT_SOURCE_DIR}/src/butil/iobuf.cpp + ${PROJECT_SOURCE_DIR}/src/butil/single_iobuf.cpp + ${PROJECT_SOURCE_DIR}/src/butil/iobuf_profiler.cpp + ${PROJECT_SOURCE_DIR}/src/butil/binary_printer.cpp + ${PROJECT_SOURCE_DIR}/src/butil/recordio.cc + ${PROJECT_SOURCE_DIR}/src/butil/popen.cpp + ) + +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + set(BUTIL_SOURCES ${BUTIL_SOURCES} + ${PROJECT_SOURCE_DIR}/src/butil/file_util_linux.cc + ${PROJECT_SOURCE_DIR}/src/butil/threading/platform_thread_linux.cc + ${PROJECT_SOURCE_DIR}/src/butil/strings/sys_string_conversions_posix.cc) +elseif(CMAKE_SYSTEM_NAME STREQUAL "Darwin") + set(BUTIL_SOURCES ${BUTIL_SOURCES} + ${PROJECT_SOURCE_DIR}/src/butil/mac/bundle_locations.mm + ${PROJECT_SOURCE_DIR}/src/butil/mac/foundation_util.mm + ${PROJECT_SOURCE_DIR}/src/butil/file_util_mac.mm + ${PROJECT_SOURCE_DIR}/src/butil/threading/platform_thread_mac.mm + ${PROJECT_SOURCE_DIR}/src/butil/strings/sys_string_conversions_mac.mm + ${PROJECT_SOURCE_DIR}/src/butil/time/time_mac.cc + ${PROJECT_SOURCE_DIR}/src/butil/mac/scoped_mach_port.cc) +endif() + +file(GLOB_RECURSE BVAR_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/bvar/*.cpp") +file(GLOB_RECURSE BTHREAD_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/bthread/*.cpp") +file(GLOB_RECURSE JSON2PB_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/json2pb/*.cpp") +file(GLOB_RECURSE BRPC_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/brpc/*.cpp") +file(GLOB_RECURSE THRIFT_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/brpc/thrift*.cpp") +file(GLOB_RECURSE EXCLUDE_SOURCES CONFIGURE_DEPENDS "${PROJECT_SOURCE_DIR}/src/brpc/event_dispatcher_*.cpp") + +if(WITH_THRIFT) + message("brpc compile with thrift protocol") +else() + # Remove thrift sources + foreach(v ${THRIFT_SOURCES}) + list(REMOVE_ITEM BRPC_SOURCES ${v}) + endforeach() + set(THRIFT_SOURCES "") +endif() + +foreach(v ${EXCLUDE_SOURCES}) + list(REMOVE_ITEM BRPC_SOURCES ${v}) +endforeach() + +set(MCPACK2PB_SOURCES + ${PROJECT_SOURCE_DIR}/src/mcpack2pb/field_type.cpp + ${PROJECT_SOURCE_DIR}/src/mcpack2pb/mcpack2pb.cpp + ${PROJECT_SOURCE_DIR}/src/mcpack2pb/parser.cpp + ${PROJECT_SOURCE_DIR}/src/mcpack2pb/serializer.cpp) + +include(CompileProto) +set(PROTO_FILES idl_options.proto + brpc/rtmp.proto + brpc/rpc_dump.proto + brpc/get_favicon.proto + brpc/span.proto + brpc/builtin_service.proto + brpc/grpc_health_check.proto + brpc/get_js.proto + brpc/errno.proto + brpc/nshead_meta.proto + brpc/options.proto + brpc/policy/baidu_rpc_meta.proto + brpc/policy/hulu_pbrpc_meta.proto + brpc/policy/public_pbrpc_meta.proto + brpc/policy/sofa_pbrpc_meta.proto + brpc/policy/mongo.proto + brpc/trackme.proto + brpc/streaming_rpc_meta.proto + brpc/proto_base.proto + brpc/rdma/rdma_handshake.proto) +file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/output/include/brpc) +set(PROTOC_FLAGS ${PROTOC_FLAGS} -I${PROTOBUF_INCLUDE_DIR}) +compile_proto(PROTO_HDRS PROTO_SRCS ${PROJECT_BINARY_DIR} + ${PROJECT_BINARY_DIR}/output/include + ${PROJECT_SOURCE_DIR}/src + "${PROTO_FILES}") +add_library(PROTO_LIB OBJECT ${PROTO_SRCS} ${PROTO_HDRS}) +target_link_libraries(PROTO_LIB PRIVATE brpc_common_config) + +set(SOURCES + ${BVAR_SOURCES} + ${BTHREAD_SOURCES} + ${JSON2PB_SOURCES} + ${MCPACK2PB_SOURCES} + ${BRPC_SOURCES} + ${THRIFT_SOURCES} + ) + +add_subdirectory(src) +if(BUILD_UNIT_TESTS) + enable_testing() + add_subdirectory(test) +endif() + +if(BUILD_FUZZ_TESTS) + if(NOT CMAKE_CXX_COMPILER_ID MATCHES "Clang") + message(FATAL_ERROR "Fuzzing is only supported with clang") + endif() + if(NOT BUILD_UNIT_TESTS) + message(FATAL_ERROR "BUILD_UNIT_TESTS must be enabled to build fuzz tests") + endif() +endif() + +if(BUILD_BRPC_TOOLS) + add_subdirectory(tools) +endif() + +file(COPY ${CMAKE_CURRENT_BINARY_DIR}/brpc/ + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/output/include/brpc/ + FILES_MATCHING + PATTERN "*.h" + PATTERN "*.hpp" + ) +file(COPY ${PROJECT_SOURCE_DIR}/src/ + DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/output/include/ + FILES_MATCHING + PATTERN "*.h" + PATTERN "*.hpp" + ) +install(DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/output/include/ + DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} + FILES_MATCHING + PATTERN "*.h" + PATTERN "*.hpp" + ) + +# Install pkgconfig +configure_file(cmake/brpc.pc.in ${PROJECT_BINARY_DIR}/brpc.pc @ONLY) +install(FILES ${PROJECT_BINARY_DIR}/brpc.pc DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..b7afd17 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at dev@brpc.apache.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..a458f38 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,29 @@ +If you meet any problem or request a new feature, you're welcome to [create an issue](https://github.com/apache/brpc/issues/new/choose). + +If you can solve any of [the issues](https://github.com/apache/brpc/issues), you're welcome to send the PR to us. + +Before the PR: + +* Make sure your code style conforms to [google C++ coding style](https://google.github.io/styleguide/cppguide.html). Indentation is preferred to be 4 spaces. +* The code appears where it should be. For example the code to support an extra protocol should not be put in general classes like server.cpp, channel.cpp, while a general modification would better not be hidden inside a very specific protocol. +* Has unittests. + +After the PR: + +* Make sure the [GitHub Actions](https://github.com/apache/brpc/actions) passed. + +# Chinese version + +如果你é‡åˆ°é—®é¢˜æˆ–éœ€è¦æ–°åŠŸèƒ½ï¼Œæ¬¢è¿Ž[创建issue](https://github.com/apache/brpc/issues/new/choose)。 + +如果你å¯ä»¥è§£å†³æŸä¸ª[issue](https://github.com/apache/brpc/issues), 欢迎å‘é€PR。 + +å‘é€PRå‰è¯·ç¡®è®¤ï¼š + +* 你的代ç ç¬¦åˆ[google C++代ç è§„范](https://google.github.io/styleguide/cppguide.html)。缩进最好为4个空格。 +* 代ç å‡ºçŽ°çš„ä½ç½®å’Œå…¶å®šä½ç›¸ç¬¦ã€‚比如对于æŸç‰¹å®šå议的扩展代ç ä¸è¯¥å‡ºçŽ°åœ¨server.cpp, channel.cpp这些较为通用的类中,而一些éžå¸¸é€šç”¨çš„æ”¹åŠ¨ä¹Ÿä¸è¯¥æ·±è—在æŸä¸ªç‰¹å®šå议的cpp中。 +* æœ‰å¯¹åº”çš„å•æµ‹ä»£ç ã€‚ + +æäº¤PRåŽè¯·ç¡®è®¤ï¼š + +* [GitHub Actions](https://github.com/apache/brpc/actions)æˆåŠŸé€šè¿‡ã€‚ diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 0000000..6f7b01a --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,54 @@ +module( + name = 'brpc', + version = '1.17.0', + compatibility_level = 1, +) + +# --registry=https://bcr.bazel.build +bazel_dep(name = 'abseil-cpp', version = '20210324.2', repo_name = 'com_google_absl') +bazel_dep(name = 'bazel_skylib', version = '1.0.3') +bazel_dep(name = 'boringssl', version = '0.0.0-20211025-d4f1ab9') +bazel_dep(name = 'protobuf', version = '27.3', repo_name = 'com_google_protobuf') +bazel_dep(name = 'gflags', version = '2.2.2', repo_name = 'com_github_gflags_gflags') +bazel_dep(name = 'glog', version = '0.5.0', repo_name = 'com_github_google_glog') +bazel_dep(name = 'platforms', version = '0.0.4') +bazel_dep(name = "apple_support", version = "1.22.1") +bazel_dep(name = 'rules_cc', version = '0.0.1') +bazel_dep(name = 'rules_proto', version = '4.0.0') +bazel_dep(name = 'zlib', version = '1.3.1.bcr.5', repo_name = 'com_github_madler_zlib') +bazel_dep(name = 'babylon', version = '1.4.4') +# --registry=https://raw.githubusercontent.com/apache/brpc/master/registry +# `registry/modules/libunwind/` (see the `--registry=https://raw.githubusercontent.com/apache/brpc/master/registry` +# entry at the top of `.bazelrc`). The version suffix `.brpc-no-unwind` marks +# this as brpc's self-maintained variant whose `src/unwind/*.c` (the GCC +# `_Unwind_*` ABI compatibility layer) is gated by the +# `--define=libunwind_hide_unwind_symbols=true` switch. Hiding those +# `_Unwind_*` symbols is required for `--define=with_bthread_tracer=true` +# to work without crashing in pthread_exit / exception unwinding. +# See docs/cn/bthread_tracer.md for background. +bazel_dep(name = 'libunwind', version = '1.8.1.brpc-no-unwind', repo_name = 'com_github_libunwind_libunwind') + +# --registry=https://baidu.github.io/babylon/registry +bazel_dep(name = 'leveldb', version = '1.23', repo_name = 'com_github_google_leveldb') +single_version_override( + module_name = "leveldb", + registry = "https://raw.githubusercontent.com/secretflow/bazel-registry/main", +) +bazel_dep(name = 'openssl', version = '3.3.2') +single_version_override( + module_name = "openssl", + version = "3.3.2.bcr.1", + registry = "https://raw.githubusercontent.com/secretflow/bazel-registry/main", +) +bazel_dep(name = 'thrift', version = '0.21.0', repo_name = 'org_apache_thrift') + +# test only +bazel_dep(name = "gperftools", version = "2.18.1", dev_dependency = True) +bazel_dep(name = "nlohmann_json", version = "3.12.0", dev_dependency = True) +bazel_dep(name = 'googletest', version = '1.14.0.bcr.1', repo_name = 'com_google_googletest', dev_dependency = True) +bazel_dep(name = 'hedron_compile_commands', dev_dependency = True) +git_override( + module_name = 'hedron_compile_commands', + remote = 'https://github.com/hedronvision/bazel-compile-commands-extractor.git', + commit = '1e08f8e0507b6b6b1f4416a9a22cf5c28beaba93', # Jun 28, 2024 +) diff --git a/README.md b/README.md new file mode 100644 index 0000000..1c4f785 --- /dev/null +++ b/README.md @@ -0,0 +1,117 @@ +[中文版](README_cn.md) + +[![Linux Build Status](https://github.com/apache/brpc/actions/workflows/ci-linux.yml/badge.svg)](https://github.com/apache/brpc/actions/workflows/ci-linux.yml) +[![MacOs Build Status](https://github.com/apache/brpc/actions/workflows/ci-macos.yml/badge.svg)](https://github.com/apache/brpc/actions/workflows/ci-macos.yml) + +![brpc logo (light)](docs/images/logo.png#gh-light-mode-only) +![brpc logo (dark)](docs/images/logo-white.png#gh-dark-mode-only) + +[bRPC](https://brpc.apache.org/) is an Industrial-grade RPC framework using C++ Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. + +### "bRPC" means "better RPC". + +You can use it to: +* Build a server that can talk in multiple protocols (**on same port**), or access all sorts of services + * restful http/https, [h2](https://httpwg.org/specs/rfc9113.html)/[gRPC](https://grpc.io). using http/h2 in bRPC is much more friendly than [libcurl](https://curl.haxx.se/libcurl/). Access protobuf-based protocols with HTTP/h2+json, probably from another language. + * [redis](docs/en/redis_client.md) and [memcached](docs/en/memcache_client.md), thread-safe, more friendly and performant than the official clients. + * [rtmp](https://github.com/apache/brpc/blob/master/src/brpc/rtmp.h)/[flv](https://en.wikipedia.org/wiki/Flash_Video)/[hls](https://en.wikipedia.org/wiki/HTTP_Live_Streaming), for building [streaming services](https://github.com/brpc/media-server). + * hadoop_rpc (may be opensourced) + * [rdma](https://en.wikipedia.org/wiki/Remote_direct_memory_access) support + * [thrift](docs/en/thrift.md) support, thread-safe, more friendly and performant than the official clients. + * all sorts of protocols used in Baidu: [baidu_std](docs/en/baidu_std.md), [streaming_rpc](docs/en/streaming_rpc.md), hulu_pbrpc, [sofa_pbrpc](https://github.com/baidu/sofa-pbrpc), nova_pbrpc, public_pbrpc, ubrpc and nshead-based ones. + * Build [HA](https://en.wikipedia.org/wiki/High_availability) distributed services using an industrial-grade implementation of [RAFT consensus algorithm](https://raft.github.io) which is opensourced at [braft](https://github.com/brpc/braft) +* Servers can handle requests [synchronously](docs/en/server.md) or [asynchronously](docs/en/server.md#asynchronous-service). +* Clients can access servers [synchronously](docs/en/client.md#synchronus-call), [asynchronously](docs/en/client.md#asynchronous-call), [semi-synchronously](docs/en/client.md#semi-synchronous-call), or use [combo channels](docs/en/combo_channel.md) to simplify sharded or parallel accesses declaratively. +* Debug services [via http](docs/en/builtin_service.md), and run [cpu](docs/en/cpu_profiler.md), [heap](docs/en/heap_profiler.md) and [contention](docs/en/contention_profiler.md) profilers. +* Get [better latency and throughput](docs/en/overview.md#better-latency-and-throughput). +* [Extend bRPC](docs/en/new_protocol.md) with the protocols used in your organization quickly, or customize components, including [naming services](docs/en/load_balancing.md) (dns, zk, etcd), [load balancers](docs/en/load_balancing.md) (rr, random, consistent hashing) + +# Try it! + +* Read [overview](docs/en/overview.md) to know where bRPC can be used and its advantages. +* Read [getting started](docs/en/getting_started.md) for building steps and play with [examples](https://github.com/apache/brpc/tree/master/example/). +* Docs: + * [Performance benchmark](docs/en/benchmark.md) + * [bvar](docs/en/bvar.md) + * [bvar_c++](docs/en/bvar_c++.md) + * [bthread](docs/en/bthread.md) + * [bthread or not](docs/en/bthread_or_not.md) + * [thread-local](docs/en/thread_local.md) + * [Execution Queue](docs/en/execution_queue.md) + * [bthread tracer](docs/en/bthread_tracer.md) + * [bthread tagged task group](docs/en/bthread_tagged_task_group.md) + * Client + * [Basics](docs/en/client.md) + * [Error code](docs/en/error_code.md) + * [Combo channels](docs/en/combo_channel.md) + * [Access http/h2](docs/en/http_client.md) + * [Access gRPC](docs/en/http_derivatives.md#h2grpc) + * [Access thrift](docs/en/thrift.md#client-accesses-thrift-server) + * [Access UB](docs/en/ub_client.md) + * [Streaming RPC](docs/en/streaming_rpc.md) + * [Access redis](docs/en/redis_client.md) + * [Access memcached](docs/en/memcache_client.md) + * [Backup request](docs/en/backup_request.md) + * [Dummy server](docs/en/dummy_server.md) + * Server + * [Basics](docs/en/server.md) + * [Serve http/h2](docs/en/http_service.md) + * [Serve gRPC](docs/en/http_derivatives.md#h2grpc) + * [Serve thrift](docs/en/thrift.md#server-processes-thrift-requests) + * [Serve Nshead](docs/en/nshead_service.md) + * [Debug server issues](docs/en/server_debugging.md) + * [Server push](docs/en/server_push.md) + * [Avalanche](docs/en/avalanche.md) + * [Auto ConcurrencyLimiter](docs/en/auto_concurrency_limiter.md) + * [Media Server](https://github.com/brpc/media-server) + * [json2pb](docs/en/json2pb.md) + * [Builtin Services](docs/en/builtin_service.md) + * [status](docs/en/status.md) + * [vars](docs/en/vars.md) + * [connections](docs/en/connections.md) + * [flags](docs/en/flags.md) + * [rpcz](docs/en/rpcz.md) + * [cpu_profiler](docs/en/cpu_profiler.md) + * [heap_profiler](docs/en/heap_profiler.md) + * [contention_profiler](docs/en/contention_profiler.md) + * Tools + * [rpc_press](docs/en/rpc_press.md) + * [rpc_replay](docs/en/rpc_replay.md) + * [rpc_view](docs/en/rpc_view.md) + * [benchmark_http](docs/en/benchmark_http.md) + * [parallel_http](docs/en/parallel_http.md) + * Others + * [IOBuf](docs/en/iobuf.md) + * [Streaming Log](docs/en/streaming_log.md) + * [FlatMap](docs/en/flatmap.md) + * [Coroutine](docs/en/coroutine.md) + * [Circuit Breaker](docs/en/circuit_breaker.md) + * [RDMA](docs/en/rdma.md) + * [Bazel Support](docs/en/bazel_support.md) + * [Wireshark baidu_std dissector plugin](docs/en/wireshark_baidu_std.md) + * [bRPC introduction](docs/cn/brpc_intro.pptx)(training material) + * [A tutorial on building large-scale services](docs/en/tutorial_on_building_services.pptx)(training material) + * [bRPC internal](docs/en/brpc_internal.pptx)(training material) + * RPC in depth + * [New Protocol](docs/en/new_protocol.md) + * [Atomic instructions](docs/en/atomic_instructions.md) + * [IO](docs/en/io.md) + * [Threading Overview](docs/en/threading_overview.md) + * [Load Balancing](docs/en/load_balancing.md) + * [Locality-aware](docs/en/lalb.md) + * [Consistent Hashing](docs/en/consistent_hashing.md) + * [Memory Management](docs/en/memory_management.md) + * [Timer keeping](docs/en/timer_keeping.md) + * [bthread_id](docs/en/bthread_id.md) + * Use cases + * [User cases](community/cases.md) + +# Contribute code +Please refer to [here](CONTRIBUTING.md). + +# Feedback and Getting involved +* Report bugs, ask questions or give suggestions by [Github Issues](https://github.com/apache/brpc/issues) +* Subscribe to the mailing list(dev-subscribe@brpc.apache.org) to get updated with the project + +# Code of Conduct +We follow the code of conduct from Apache Software Foundation, please refer it here [Link](https://www.apache.org/foundation/policies/conduct) diff --git a/README.wehub.md b/README.wehub.md new file mode 100644 index 0000000..bad5b24 --- /dev/null +++ b/README.wehub.md @@ -0,0 +1,7 @@ +# WeHub æ¥æºè¯´æ˜Ž + +- 原始项目:`apache/brpc` +- 原始仓库:https://github.com/apache/brpc +- 导入方å¼ï¼šä¸Šæ¸¸é»˜è®¤åˆ†æ”¯çš„æœ€æ–°å¿«ç…§ +- 原作者ã€ç‰ˆæƒå’Œè®¸å¯è¯ä¿¡æ¯ä»¥åŽŸå§‹ä»“åº“åŠæœ¬ä»“库 LICENSE 为准 +- æœ¬æ–‡ä»¶ä»…ç”¨äºŽè®°å½•æ¥æºï¼Œä¸ä»£è¡¨ WeHub 是原项目作者 diff --git a/README_cn.md b/README_cn.md new file mode 100644 index 0000000..6413f83 --- /dev/null +++ b/README_cn.md @@ -0,0 +1,124 @@ +[English version](README.md) + +[![Linux Build Status](https://github.com/apache/brpc/actions/workflows/ci-linux.yml/badge.svg)](https://github.com/apache/brpc/actions/workflows/ci-linux.yml) +[![MacOs Build Status](https://github.com/apache/brpc/actions/workflows/ci-macos.yml/badge.svg)](https://github.com/apache/brpc/actions/workflows/ci-macos.yml) + +![brpc logo (light)](docs/images/logo.png#gh-light-mode-only) +![brpc logo (dark)](docs/images/logo-white.png#gh-dark-mode-only) + +[bRPC](https://brpc.apache.org/)是用C++语言编写的工业级RPC框架,常用于æœç´¢ã€å­˜å‚¨ã€æœºå™¨å­¦ä¹ ã€å¹¿å‘Šã€æŽ¨è等高性能系统。 + +### "bRPC"çš„å«ä¹‰æ˜¯"better RPC" + +ä½ å¯ä»¥ä½¿ç”¨å®ƒï¼š + +* æ­å»ºèƒ½åœ¨**一个端å£**支æŒå¤šå议的æœåŠ¡, 或访问å„ç§æœåŠ¡ + * restful http/https, [h2](https://httpwg.org/specs/rfc9113.html)/[gRPC](https://grpc.io)。使用bRPCçš„http实现比[libcurl](https://curl.haxx.se/libcurl/)方便多了。从其他语言通过HTTP/h2+json访问基于protobufçš„åè®®. + * [redis](docs/cn/redis_client.md)å’Œ[memcached](docs/cn/memcache_client.md), 线程安全,比官方client更方便。 + * [rtmp](https://github.com/apache/brpc/blob/master/src/brpc/rtmp.h)/[flv](https://en.wikipedia.org/wiki/Flash_Video)/[hls](https://en.wikipedia.org/wiki/HTTP_Live_Streaming), å¯ç”¨äºŽæ­å»º[æµåª’体æœåŠ¡](https://github.com/brpc/media-server). + * hadoop_rpc(å¯èƒ½å¼€æº) + * 支æŒ[rdma](https://en.wikipedia.org/wiki/Remote_direct_memory_access) + * 支æŒ[thrift](docs/cn/thrift.md) , 线程安全,比官方client更方便 + * å„ç§ç™¾åº¦å†…使用的åè®®: [baidu_std](docs/cn/baidu_std.md), [streaming_rpc](docs/cn/streaming_rpc.md), hulu_pbrpc, [sofa_pbrpc](https://github.com/baidu/sofa-pbrpc), nova_pbrpc, public_pbrpc, ubrpc和使用nsheadçš„å„ç§åè®®. + * 基于工业级的[RAFT算法](https://raft.github.io)实现æ­å»º[高å¯ç”¨](https://en.wikipedia.org/wiki/High_availability)分布å¼ç³»ç»Ÿï¼Œå·²åœ¨[braft](https://github.com/brpc/braft)å¼€æºã€‚ +* Server能[åŒæ­¥](docs/cn/server.md)或[异步](docs/cn/server.md#异步service)处ç†è¯·æ±‚。 +* Client支æŒ[åŒæ­¥](docs/cn/client.md#åŒæ­¥è®¿é—®)ã€[异步](docs/cn/client.md#异步访问)ã€[åŠåŒæ­¥](docs/cn/client.md#åŠåŒæ­¥),或使用[组åˆchannels](docs/cn/combo_channel.md)ç®€åŒ–å¤æ‚的分库或并å‘访问。 +* [通过http界é¢](docs/cn/builtin_service.md)调试æœåŠ¡, 使用[cpu](docs/cn/cpu_profiler.md), [heap](docs/cn/heap_profiler.md), [contention](docs/cn/contention_profiler.md) profilers. +* 获得[更好的延时和åžå](docs/cn/overview.md#更好的延时和åžå). +* 把你组织中使用的å议快速地[加入bRPC](docs/cn/new_protocol.md),或定制å„类组件, 包括[å‘½åæœåŠ¡](docs/cn/load_balancing.md#å‘½åæœåŠ¡) (dns, zk, etcd), [è´Ÿè½½å‡è¡¡](docs/cn/load_balancing.md#è´Ÿè½½å‡è¡¡) (rr, random, consistent hashing) + +# 试一下! + +* 通过[概述](docs/cn/overview.md)了解哪里å¯ä»¥ç”¨bRPCåŠå…¶ä¼˜åŠ¿ã€‚ +* 阅读[编译步骤](docs/cn/getting_started.md)了解如何开始使用, 之åŽå¯ä»¥è¿è¡Œä¸€ä¸‹[示例程åº](https://github.com/apache/brpc/tree/master/example/). +* 文档: + * [性能测试](docs/cn/benchmark.md) + * [bvar](docs/cn/bvar.md) + * [bvar_c++](docs/cn/bvar_c++.md) + * [bthread](docs/cn/bthread.md) + * [bthread or not](docs/cn/bthread_or_not.md) + * [thread-local](docs/cn/thread_local.md) + * [Execution Queue](docs/cn/execution_queue.md) + * [bthread tracer](docs/cn/bthread_tracer.md) + * [bthread tagged task group](docs/cn/bthread_tagged_task_group.md) + * Client + * [基础功能](docs/cn/client.md) + * [错误ç ](docs/cn/error_code.md) + * [组åˆchannels](docs/cn/combo_channel.md) + * [访问http/h2](docs/cn/http_client.md) + * [访问gRPC](docs/cn/http_derivatives.md#h2grpc) + * [访问thrift](docs/cn/thrift.md#client端访问thrift-server) + * [访问UB](docs/cn/ub_client.md) + * [Streaming RPC](docs/cn/streaming_rpc.md) + * [访问redis](docs/cn/redis_client.md) + * [访问memcached](docs/cn/memcache_client.md) + * [Backup request](docs/cn/backup_request.md) + * [Dummy server](docs/cn/dummy_server.md) + * Server + * [基础功能](docs/cn/server.md) + * [æ­å»ºhttp/h2æœåŠ¡](docs/cn/http_service.md) + * [æ­å»ºgRPCæœåŠ¡](docs/cn/http_derivatives.md#h2grpc) + * [æ­å»ºthriftæœåŠ¡](docs/cn/thrift.md#server端处ç†thrift请求) + * [æ­å»ºNsheadæœåŠ¡](docs/cn/nshead_service.md) + * [高效率排查serverå¡é¡¿](docs/cn/server_debugging.md) + * [推é€](docs/cn/server_push.md) + * [雪崩](docs/cn/avalanche.md) + * [è‡ªé€‚åº”é™æµ](docs/cn/auto_concurrency_limiter.md) + * [æµåª’体æœåŠ¡](https://github.com/brpc/media-server) + * [json2pb](docs/cn/json2pb.md) + * [内置æœåŠ¡](docs/cn/builtin_service.md) + * [status](docs/cn/status.md) + * [vars](docs/cn/vars.md) + * [connections](docs/cn/connections.md) + * [flags](docs/cn/flags.md) + * [rpcz](docs/cn/rpcz.md) + * [cpu_profiler](docs/cn/cpu_profiler.md) + * [heap_profiler](docs/cn/heap_profiler.md) + * [contention_profiler](docs/cn/contention_profiler.md) + * 工具 + * [rpc_press](docs/cn/rpc_press.md) + * [rpc_replay](docs/cn/rpc_replay.md) + * [rpc_view](docs/cn/rpc_view.md) + * [benchmark_http](docs/cn/benchmark_http.md) + * [parallel_http](docs/cn/parallel_http.md) + * å…¶ä»– + * [IOBuf](docs/cn/iobuf.md) + * [Streaming Log](docs/cn/streaming_log.md) + * [FlatMap](docs/cn/flatmap.md) + * [å程](docs/cn/coroutine.md) + * [熔断](docs/cn/circuit_breaker.md) + * [RDMA](docs/cn/rdma.md) + * [Bazel构建支æŒ](docs/cn/bazel_support.md) + * [Wireshark baidu_stdåè®®è§£æžæ’ä»¶](docs/cn/wireshark_baidu_std.md) + * [bRPC外功修炼å®å…¸](docs/cn/brpc_intro.pptx)(åŸ¹è®­ææ–™) + * [æ­å»ºå¤§åž‹æœåС入闍](docs/en/tutorial_on_building_services.pptx)(åŸ¹è®­ææ–™) + * [bRPC内功修炼å®å…¸](docs/en/brpc_internal.pptx)(åŸ¹è®­ææ–™) + * 深入RPC + * [New Protocol](docs/cn/new_protocol.md) + * [Atomic instructions](docs/cn/atomic_instructions.md) + * [IO](docs/cn/io.md) + * [Threading Overview](docs/cn/threading_overview.md) + * [Load Balancing](docs/cn/load_balancing.md) + * [Locality-aware](docs/cn/lalb.md) + * [Consistent Hashing](docs/cn/consistent_hashing.md) + * [Memory Management](docs/cn/memory_management.md) + * [Timer keeping](docs/cn/timer_keeping.md) + * [bthread_id](docs/cn/bthread_id.md) + * Use cases inside Baidu + * [百度地图apiå…¥å£](docs/cn/case_apicontrol.md) + * [è”盟DSP](docs/cn/case_baidu_dsp.md) + * [ELF学习框架](docs/cn/case_elf.md) + * [云平å°ä»£ç†æœåŠ¡](docs/cn/case_ubrpc.md) + +# è´¡çŒ®ä»£ç  + +请å‚考[这里](CONTRIBUTING.md#chinese-version)。 + +# å馈和å‚与 + +* bugã€ç–‘惑ã€ä¿®æ”¹å»ºè®®éƒ½æ¬¢è¿Žæåœ¨[Github Issues](https://github.com/apache/brpc/issues)中 +* 订阅邮件列表(dev-subscribe@brpc.apache.org)èŽ·å¾—é¡¹ç›®æœ€æ–°ä¿¡æ¯ + + +# 行为准则 +我们éµå®ˆApache软件基金会的行为准则, 请å‚考如下 [链接](https://www.apache.org/foundation/policies/conduct) diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..ac8d16b --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,13 @@ +# Security Policy + +## Reporting a Vulnerability + +`apache/brpc` follows the [Apache Software Foundation security process](https://www.apache.org/security/). Please report suspected +vulnerabilities privately to `security@apache.org`; do not open public +GitHub issues or pull requests for security reports. + +## Threat Model + +What the project treats as in scope and out of scope, the security +properties it provides and disclaims, the adversary model, and how +findings are triaged are documented in [THREAT_MODEL.md](./THREAT_MODEL.md). diff --git a/THREAT_MODEL.md b/THREAT_MODEL.md new file mode 100644 index 0000000..e318507 --- /dev/null +++ b/THREAT_MODEL.md @@ -0,0 +1,627 @@ +# Apache bRPC — Threat Model (v1 draft) + +## §1 Header + +- **Project:** Apache bRPC (`apache/brpc`). +- **Scope:** the `apache/brpc` repository only. The PMC confirmed on 2026-05-20 that `apache/brpc-website` is out of scope for this engagement. This draft is first authored by the ASF Security Team and then reviewed by the PMC. +- **Version binding:** based on `master` around 2026-05-21. Vulnerability reports should be triaged against the model for the corresponding version, not against `HEAD`; re-bind on each release. +- **Authors and status:** drafted by the ASF Security Team (Glasswing pre-scan), revised by PMC member Weibing Wang. **DRAFT v1** +- **Reporting entry point:** at drafting time, the repository had no `SECURITY.md`, and the Apache security project index listed only the generic `security@apache.org` address. Until project-level disclosure documentation is published, report vulnerabilities to `security@apache.org` per ASF policy. +- **Provenance legend:** + - *(documented — source)*: from repository documentation, headers, gflags, source code, or Apache governance artifacts. + - *(inferred — Qn)*: inferred from code structure, general RPC security experience, or absence of a defense, with a corresponding question in §14. + - *(maintainer)*: not yet used in this draft; to be substituted after PMC confirmation. +- **Draft confidence:** most factual descriptions in §1-§13 come from documentation and source code. Intent, default security posture, resource boundaries, the built-in service trust model, and vulnerability triage criteria still require confirmation in §14. +- **bRPC overview:** bRPC is an embeddable C++ RPC framework that supports dispatching multiple protocols on the same port via content sniffing, including `baidu_std`, HTTP/1.x, HTTP/2/gRPC, Thrift, Redis, memcached, RTMP, Mongo, the nshead family, and others. It provides naming services, load balancers, optional TLS, bthread scheduling, and HTTP built-in admin services. bRPC is not a standalone daemon; downstream applications link `libbrpc` and start `brpc::Server` in-process. + +--- + +## §2 Scope and intended use + +bRPC's primary uses are: + +1. Expose one or more `google::protobuf::Service` implementations on a TCP port, with multiple protocols sharing the same port. +2. Act as a client `brpc::Channel` to access a single server or a cluster described by a naming service plus load balancer. +3. Be embedded by a host application; deployment, TLS, network exposure, authentication, routing, and process lifecycle are the responsibility of the application or operator. +4. Use built-in services such as `/status`, `/vars`, `/flags`, `/connections`, `/rpcz`, and `/health` for debugging and monitoring. +5. Use bRPC as an HTTP/h2 server or client, including Restful URL mapping and JSON-to-Protobuf / Protobuf-to-JSON conversion. + +bRPC is not a secure-by-default managed service. Threats land in the runtime code linked by the application and in the built-in admin services the application chooses to expose. + +### Caller / actor roles + +- **Application developer:** defines `.proto` files, implements services, chooses protocols and ports, and calls clients. Trusted within the compile-time and configuration boundary. +- **Operator:** runs the binary and configures ports, `internal_port`, TLS, gflags, naming services, rate limiting, and built-in services. Trusted for that instance. +- **Client peer (RPC client):** sends bytes to a bRPC server. Untrusted by default; protocol sniffers must handle arbitrary input. +- **Server peer:** the remote server that a bRPC client connects to. Response bytes are also untrusted. +- **Naming-service backend:** `bns`, `file`, `consul`, `nacos`, DNS, and similar backends. Configured by the operator and treated by bRPC as trusted infrastructure. +- **Built-in admin-service consumer:** a person or program accessing `/status`, `/flags`, `/rpcz`, and similar endpoints. Its trust level depends entirely on whether the operator places these endpoints on an internal network or disables them. + +### Component-family table + +| Family | Representative entry point | Touches outside the process? | In model? | +| --- | --- | --- | --- | +| **C++ runtime core** | `Server::Start`, `Channel::CallMethod`, `Socket`, `InputMessenger` | sockets, files, threads, TLS, optional RDMA | **In model** | +| **Wire-protocol parsers** | `Parse*Message` | reads untrusted bytes from sockets | **In model**, highest priority | +| **HTTP / h2 (+ gRPC) stack** | `HttpServerHandler`, `H2StreamContext`, `URI` | sockets, TLS, json2pb | **In model** | +| **Built-in admin services** | `/status`, `/vars`, `/flags`, `/rpcz`, `/dir`, `/threads`, profiler, metrics | HTTP, `/proc`, filesystem, profiler | **In model**, depending on exposure | +| **TLS / SSL layer** | `ServerSSLOptions`, `ChannelSSLOptions` | OpenSSL, certificate files | **In model** | +| **Authentication hooks** | `Authenticator::VerifyCredential` | wire token | **In model**, policy is implemented by the application | +| **Naming services** | `file://`, `http(s)://`, `consul://`, `nacos://`, `dns://` | files and network | **In model**, backend treated as trusted | +| **Load balancers** | rr, wrr, random, la, consistent hashing | pure computation | **In model**, not a direct attack surface | +| **Compression layer** | gzip/snappy/zlib/lz4 | CPU/memory | **In model** | +| **RDMA transport** | `rdma://` | verbs API, pinned memory | **In model** only when enabled at build time and runtime | +| **Coroutine bridge** | `usercode_in_coroutine` | scheduling | **In model** in non-default mode | +| **bthread / butil / bvar** | scheduler, IOBuf, counters | threads, futex, files, `/proc` | **In model** | +| **mcpack2pb / json2pb** | mcpack/JSON <-> pb | pure computation | **In model** on the corresponding protocol paths | +| **Java / Python bindings** | JNI / pyBRPC | language bridge | currently unsupported; **Out of model** | +| **tools / test / example / build / community / docs** | CLI, tests, examples, build, governance, docs | non-production runtime surface | **Out of model** | + +Wire-protocol parsers are the most important surface: they directly receive untrusted bytes, are implemented in C++, cover many protocols with different maturity levels, and multi-protocol sniffing can make every registered parser reachable from the same listening port. `enabled_protocols` can restrict the sniffing set, but its implementation details need maintainer confirmation. + +--- + +## §3 Out of scope (explicit non-goals) + +The following scenarios or threats are not protected by the bRPC threat model. Matching reports are closed according to §13. + +### Use cases out of scope + +1. **A secure-by-default RPC endpoint.** bRPC provides components, not a `brpcd` with a strong default security posture. +2. **A sandbox or process-isolation boundary.** Deserialization, business handlers, and the host application run in the same process. +3. **Cryptographic primitives.** TLS security comes from OpenSSL; bRPC only wraps and configures it. +4. **An application field-validation framework.** bRPC validates wire framing, not semantic fields such as email addresses, IDs, or business ranges. +5. **A complete replacement for authenticated transport.** Bare `baidu_std`, HTTP, Thrift, Redis, and similar protocols have no default authentication; `Authenticator` and mTLS require explicit configuration. +6. **A general HTML/JSON rendering security surface.** Escaping in application HTTP handlers is the application's responsibility. +7. **A general file server.** `/dir` is disabled by default and is not modeled as a production file-serving feature. +8. **Exposing built-in services to the public internet.** bRPC built-in services should only be exposed to trusted internal consumers. + +### Threats explicitly out of scope + +1. Attackers who control the calling process, can read/write process memory, or can call arbitrary bRPC APIs. +2. Attackers who control the compiler, dependencies, build environment, or supply chain. +3. Side channels such as timing, cache, power, and RowHammer. +4. Raw socket-layer DoS: SYN flood, slowloris, half-open connection exhaustion, and kernel table exhaustion. +5. Resource exhaustion in `bvar`/`bthread`/`butil` caused purely by in-process call patterns. +6. Performance loss caused by an operator intentionally enabling expensive tracing/profiling. +7. Compromise of the naming-service backend; bRPC trusts the backend configured by the operator. +8. Vulnerabilities in application handlers, such as SQL injection or missing business authorization. + +### Code shipped in the repo but out of scope + +`test/`, `example/`, `tools/`, build and packaging files, `community/`, `docs/`, and `apache/brpc-website` are not modeled as production runtime surfaces. The core boundary is the runtime, parsers, transports, built-in services, and support libraries under `src/`. + +--- + +## §4 Trust boundaries and data flow + +bRPC has four main trust boundaries: three on the network surface and one on the operator configuration and naming-service surface. + +### Boundary 1 — the wire (server side, business RPC) + +Server-side socket bytes are untrusted by default: + +```text +socket bytes + -> Acceptor / Socket + -> InputMessenger::CutInputMessage + -> try registered protocol parsers one by one + -> check whether declared body size exceeds -max_body_size + -> protocol message structure + -> protobuf / json2pb / mcpack2pb / other decoder + -> Service::Method(controller, request, response, done) +``` + +The trust transition occurs when the framework calls the user's `Service::Method`. Crashes or memory corruption reachable from the wire in parsers, decoders, compression, and TLS handshake are in model. How the business handler processes `Request` is the application's responsibility. + +All protocol parsers are enabled by default. `ServerOptions.enabled_protocols` can restrict the protocol sniffing set. + +### Boundary 2 — the wire (server side, built-in admin services) + +HTTP/h2 requests on the same listening port may be routed to built-in services. `internal_port` can move built-in services to a separate port, and `has_builtin_services=false` can disable them entirely. `/dir` and `/threads` are disabled by default; other built-in services are enabled by default when `has_builtin_services=true`. + +Model posture: built-in services are treated as an operator-trusted surface when placed on an internal port or protected by firewall. If exposed to the public internet, they become a major risk surface. Specific triage depends on Q46/Q50 in §14. + +Even when built-in services are only served internally, they still need to avoid severe attacks such as command injection or denial of service. However, modifying gflags, enabling rpcz, profiling, and similar operations through built-in services can affect business logic or program performance; those effects are normal use and are not security vulnerabilities. + +### Boundary 3 — the wire (client side) + +A bRPC client deserializes server responses through paths symmetric to the server side: untrusted bytes enter parsers and decoders before being handed to the application. Parser/decoder vulnerabilities triggered by malicious server responses are in model. + +### Boundary 4 — the operator config + naming-service backend + +`ServerOptions`, `ChannelOptions`, gflags, flagfiles, TLS file paths, and naming-service URIs are supplied by the operator and are trusted. Server lists returned by naming services are also treated as trusted infrastructure. Backend compromise is out of scope, but crashes in reply parsers on malformed input remain in model. + +### Reachability preconditions per family + +- Parser issues are in model only when reachable from Boundary 1/3; opt-in protocols require operator enablement. +- Built-in services are triaged according to the Boundary 2 exposure rules. +- TLS issues are inside the network surface; OpenSSL CVEs are handled as external dependency issues. +- Compression, json2pb, and mcpack2pb are in model when reachable from attacker input. +- RDMA and coroutine paths are modeled only when explicitly enabled or loaded. + +### Data not crossing a boundary + +Purely internal scheduler queues, in-process `bvar` counters, internal `IOBuf` lifetimes, `socket_map` lifetimes, Wireshark dissectors under `tools/`, and similar paths are not trust transitions. + +--- + +## §5 Assumptions about the environment + +bRPC is a C++ library that normally runs on Linux/macOS with POSIX sockets, OpenSSL, and a C++ toolchain. + +### OS / runtime / hardware + +- Linux and macOS are supported; Windows is not included in the security support scope for now. +- A C++11 or newer toolchain is required. +- POSIX sockets and Linux epoll or macOS kqueue are required. +- TLS depends on OpenSSL; risks from old OpenSSL versions are managed by the operator. +- gflags, protobuf, and leveldb are regular dependencies; tcmalloc/gperftools is optional. + +### Concurrency + +- bthread is an M:N scheduler; the number of worker pthreads depends on CPU count or configuration. +- `ServerOptions.num_threads` is a global worker-count hint, not hard isolation for one server. +- bthread-local state may be reused; user destructors must be reentrant. +- `-usercode_in_pthread` moves user code to pthreads and changes concurrency and queuing semantics. + +### Memory model + +bRPC is memory-unsafe C++. All `Parse*Message`, `Read*`, `Decompress*`, JSON/mcpack/protobuf decoder paths are candidate surfaces for OOB access, UAF, double-free, integer overflow, and stack overflow. `-max_body_size` is the key outer cap; the model depends on parsers correctly checking lengths and avoiding signed/unsigned overflow. + +### Time / clock + +bRPC uses `gettimeofday`, `clock_gettime`, `cpuwide_time_us`, and similar clocks. Resistance to timing side channels is not a goal. + +### Filesystem / network / peripherals + +bRPC opens TCP/Unix sockets, pid files, TLS cert/key files, naming-service files, profile output, rpc dumps, and reads `/proc/*` for bvar. It also sets normal socket options such as keepalive, `SO_REUSEPORT`, and `TCP_USER_TIMEOUT`. + +### What bRPC does *not* do to its host (negative-claim inventory) + +By default it does not install signal handlers. Normal operation does not fork child processes unless a profiler endpoint is triggered. It reads limited environment variables and gflags. First SSL use initializes OpenSSL global state. Logs go to stdout/stderr or glog. It does not modify locale or FPU state. `fork without exec` must happen before bRPC initialization. + +--- + +## §5a Build-time and configuration variants + +bRPC's security boundary is affected by build options, gflags, `ServerOptions`, `ChannelOptions`, and SSL options. + +### Build-time options that change the security envelope + +| Knob / flag | Default | Effect on model | +| --- | --- | --- | +| `WITH_THRIFT` | off | makes compiling and enabling the Thrift parser possible | +| `WITH_GLOG` | off | changes the logging backend; not critical | +| `WITH_RDMA` | off | introduces RDMA transport and pinned memory | +| `WITH_MESALINK` | off | OpenSSL replacement implementation | +| `BUILD_UNIT_TESTS` | off | builds tests, out of model | + +*Note: the table above is only an example, not a complete list. Analyze the latest code for details.* + +### Runtime gflags that change the security envelope + +| Flag / option | Default | Effect | Maintainer stance | +| --- | --- | --- | --- | +| `-max_body_size` | 64 MiB | global body cap for all protocols; protobuf's internal cap is lifted to `INT_MAX` | critical | +| `-enable_dir_service` | false | `/dir` reads files | dangerous when enabled | +| `-enable_threads_service` | false | `/threads` dumps stacks | dangerous when enabled | +| `-immutable_flags` | false | `/flags` can modify reloadable gflags | safer when enabled | +| `-usercode_in_pthread` | false | changes the thread model for user code | changes concurrency semantics and may cause deadlocks | +| `ServerOptions.has_builtin_services` | true | global switch for built-in services | critical | +| `ServerOptions.internal_port` | -1 | built-in services are on the main port by default | critical; safer when set | + +*Note: the table above is only an example, not a complete list. Analyze the latest code for details.* + +### Insecure-default summary (the §13 routing question) + +Defaults triaged by the PMC: + +1. `-max_body_size=64 MiB` is the production default. +2. `has_builtin_services=false` or `internal_port!=-1` is operator responsibility. +3. The combination of `-immutable_flags=false` and reachable `/flags` is acceptable. +4. `ChannelSSLOptions.verify.verify_mode=NOT_SET`, causing client TLS not to verify the server certificate, is acceptable. +5. `ChannelSSLOptions.protocols` including TLS 1.0/1.1 is acceptable. +6. `force_ssl=false`, causing a TLS-configured port to still accept plaintext, is acceptable. +7. `/dir` and `/threads` are disabled by default. If an operator enables them and exposes them publicly, treat that as a dangerous non-default configuration. + +*Note: the table above is only an example, not a complete list. Analyze the latest code for details.* + +--- + +## §6 Assumptions about inputs + +bRPC receives three classes of input: socket bytes, in-process API parameters, and operator configuration. Boundary 1/3 wire bytes are the highest risk. + +### Per-parameter trust table + +| Component / function | Parameter | Attacker-controllable? | Caller / operator must enforce | +| --- | --- | --- | --- | +| `InputMessenger::CutInputMessage` | initial connection bytes | yes | sniffer must defend against arbitrary bytes | +| `ParseRpcMessage` | PRPC header, `RpcMeta`, payload | yes | `-max_body_size`, `meta_size <= body_size` | +| `ParseHttpMessage` | method, URI, headers, body | yes | HTTP grammar, body cap | +| `ParseH2Message` | frame, HPACK headers, SETTINGS | yes | frame/header/HPACK/SETTINGS caps | +| Redis / memcache / Thrift / Mongo / nshead parsers, etc. | declared length, frame, body | yes | must be uniformly constrained by `-max_body_size` or protocol caps | +| RTMP / AMF | chunk stream, AMF object | yes | chunk and nesting caps | +| `json2pb::JsonToProtoMessage` | HTTP JSON body | yes | UTF-8, depth, repeated-field expansion | +| `mcpack2pb` | mcpack body | yes | depth and size caps | +| `Decompress` | compressed payload | yes | bRPC currently does not guarantee a decompressed-size cap; decompression may fail | +| TLS handshake | cert, SNI, ALPN | yes | operator configures verify, SNI, ALPN | +| `Authenticator::VerifyCredential` | credential, client_addr | yes; more obvious when header IP is enabled | application implements authentication; operator protects proxy boundary | +| Built-in `/flags` | gflag value | yes if reachable | hide built-ins or set `-immutable_flags=true` | +| Built-in `/dir` | path | yes if enabled | do not enable on public internet | +| Built-in profiler | `seconds` and similar parameters | yes if reachable | hide built-ins and limit profiling cost | +| `ServerOptions` / `ChannelOptions` / gflags | configuration values | no | operator trusted | +| Naming service reply | backend response | trusted by transitivity | parser should still tolerate malformed replies | + +### Size, shape, rate + +- `-max_body_size=64 MiB` is the global message cap; there is no unified per-method or per-protocol cap. +- The cap for unconsumed streaming RPC bytes is `-socket_max_streams_unconsumed_bytes`; default 0 means unlimited. +- Pending write buffers per socket are limited by `-socket_max_unwritten_bytes`. +- `max_concurrency` limits in-flight requests, not connection count; built-in services are not constrained by this option. +- `idle_timeout_sec` is disabled by default; connection count and slowloris are mainly handled by operators / load balancers. +- Protobuf has a recursion limit; JSON, mcpack, and AMF depth limits need confirmation. +- The framework has no general rate limiting. + +--- + +## §7 Adversary model + +### Primary adversary — the wire peer + +The primary attacker is the socket peer, which can send arbitrary bytes, confuse inputs across protocols, declare large lengths, construct compression bombs, trigger parser bugs, or make a client parse malicious server responses. Goals include crashes, memory/CPU exhaustion, OOB read/write, framing bypass, arbitrary command execution, authentication bypass, abuse of reachable built-in services, modification of reloadable gflags, and reading information through `/dir`. + +### Secondary adversary — the authenticated peer + +A peer that passes `Authenticator` is still untrusted at the parser layer. Authentication only narrows the attacker set; it does not change the peer's ability to send bytes. + +### Tertiary adversary — the HTTP-built-in-services consumer + +When `internal_port < 0` and `has_builtin_services=true`, any HTTP client that can reach the listening port may access `/status`, `/vars`, `/flags`, profiler, metrics, and similar endpoints. Final triage depends on Q46/Q50. + +### Out-of-scope adversaries + +In-process attackers, local side-channel attackers, attackers controlling `ServerOptions`/`ChannelOptions`, attackers controlling naming-service backends, build-chain attackers, and attacks that depend on the operator failing to harden network boundaries are not objects that bRPC itself promises to defend against. + +### Adversary capabilities by transport + +- **Plain TCP:** full wire control, no default authentication or encryption. +- **TLS:** provides encryption, but client/server certificate verification and TLS-only behavior require operator configuration. +- **RDMA:** modeled only when enabled; risks come from the verbs API and memory regions. +- **Unix domain socket:** if supported, the trust model is similar to TCP, with socket file permissions managed by the operator. + +--- + +## §8 Security properties the project provides + +### Memory and process-safety properties + +**P1. Under configured caps, valid wire input should not cause memory corruption.** +Any OOB access, UAF, double-free, or heap corruption in a parser, decoder, decompressor, TLS path, or built-in handler reachable from Boundary 1/3 is a high/critical issue. + +**P2. Bounded recursive structures should not cause stack overflow.** +Protobuf, JSON, AMF, mcpack, and similar decoders should reject excessively deep input before exhausting the stack. + +### Wire-format properties + +**P3. Multi-protocol sniffing should be conservative.** +When a parser returns `TRY_OTHERS`, it should not consume bytes; the same frame should not be taken over by the wrong parser. + +**P4. `-max_body_size` should be enforced.** +Parsers with declared lengths should reject and close the connection when the cap is exceeded; they should not allocate oversized memory first. + +### TLS / transport-security properties (when enabled) + +**P5. With SSL correctly configured and OpenSSL secure, TLS provides confidentiality and integrity.** + +**P6. The server rejects SSLv3 by default.** + +**P7. SNI can be used for certificate selection; fallback behavior on no match is controlled by `strict_sni`.** + +**P8. ALPN selection should be limited to `ServerSSLOptions.alpns`.** + +### Resource-bound properties + +**P9. Single-message memory use should be bounded by `-max_body_size`.** +Linear constant-factor overhead is acceptable; superlinear expansion or allocations that bypass the cap should be treated as bugs. See §9 D5 for decompression expansion. + +**P10. Per-socket unwritten buffers should be limited by `-socket_max_unwritten_bytes`.** + +**P11. Server/method concurrency caps should take effect when configured by the operator.** + +### Concurrency properties + +**P12. The framework's own cross-connection state should be thread-safe.** Synchronization of shared state in user handlers is the user's responsibility. + +**P13. `Channel::CallMethod` may be called across threads; `Channel::Init()` is not guaranteed to be thread-safe.** + +### Built-in admin-service properties (conditional on operator exposure) + +**P14. Built-in services should be protected by `has_builtin_services`, `internal_port`, or network boundaries.** + +**P15. `/dir` and `/threads` are disabled by default.** + +--- + +## §9 Security properties the project does *not* provide + +### Disclaimed properties (downstream's job, not bRPC's) + +**D1.** Bare protocols do not have default peer authentication; `Authenticator` authenticates per connection, not per request. +**D2.** No application-layer authorization is provided; RBAC, ACLs, scopes, and rate limits are implemented by the application or `Interceptor`. +**D3.** When `-http_header_of_user_ip` is enabled, bRPC does not defend against attacker-forged headers; trusted proxies and firewalls must enforce the boundary. +**D4.** Without a configured cap, streaming does not defend against unlimited growth of unconsumed stream data. +**D5.** bRPC does not guarantee a decompressed-output size cap. Decompression failure is allowed, but crashes or memory boundary violations are not. +**D6.** bRPC does not guarantee a cap on decoded JSON/repeated-field size. Decode failure is allowed, but crashes or memory boundary violations are not. +**D7.** h2/HPACK bomb, CONTINUATION flood, and PING flood defenses are currently missing and should preferably be added. +**D8.** No constant-time guarantee is provided. +**D9.** OpenSSL weaknesses and default TLS version choices are managed by the operator. +**D10.** No anti-replay is provided; request/sequence IDs are only used for request/response matching. +**D11.** There is no confidentiality without TLS. +**D12.** bRPC does not defend against socket-layer connection floods or slowloris. +**D13.** When built-ins are exposed and `-immutable_flags=false`, bRPC does not defend against `/flags` modifying reloadable gflags. +**D14.** When built-ins are reachable, bRPC does not defend against information disclosure from `/status`, `/vars`, `/connections`, `/rpcz`, and similar endpoints. +**D15.** When built-ins are reachable, bRPC does not defend against CPU/IO cost from profiler endpoints. +**D16.** When `internal_port=-1`, user services and built-in services on the same port are not isolated. +**D17.** Cross-protocol confusion from the multi-protocol sniffer is a parser issue the framework must defend against, but the risk of not restricting the protocol set is the operator's responsibility. +**D18.** Pathological protobuf input under protobuf `TotalBytesLimit=INT_MAX` has no additional framework cap. +**D19.** When `force_ssl=false`, a TLS-configured port still accepts plaintext. + +### False-friend properties + +**F1.** `has_builtin_services=true` is an administrative surface, not just harmless debug pages. +**F2.** `Authenticator::VerifyCredential` runs once per connection, not once per request. +**F3.** `force_ssl=false` means the same port accepts both SSL and non-SSL. +**F4.** `Controller::remote_side()` may be affected by `-http_header_of_user_ip`. +**F5.** `verify_depth=0` means verification is disabled, not strict verification. +**F6.** `Authenticator` does not cover all protocols by default. +**F7.** `strict_sni=false` means an unknown SNI falls back to the default certificate. +**F8.** `-max_body_size` does not limit decompressed size, decoded JSON size, or protobuf's internal cap. +**F9.** The LZ4 enum and documented support status are not fully aligned and need confirmation. + +### Well-known attack classes left to the caller + +Compression bombs, JSON/repeated-field expansion, HPACK bombs, TLS compression oracles, TLS downgrade, authentication brute force, `/flags` weaponization, slow decoder DoS, HTTP request smuggling, cross-protocol confusion, and naming-service spoofing. Except for parser memory safety and explicit claims, most of these are mitigated by the operator or application. + +--- + +## §10 Downstream responsibilities + +### Application developer responsibilities + +1. Pin the bRPC version and evaluate against that version's model. +2. Treat all deserialized fields as untrusted application input and perform business-semantic validation. +3. Implement `Authenticator` when identity is required, remembering that it authenticates per connection. +4. Implement `Interceptor` or handler checks when per-request authorization is required. +5. Do not call `Channel::Init()` concurrently across threads; `CallMethod()` is the thread-safe path. +6. Do not cache gflag values long-term when running with reloadable flags. +7. Do not use `assert` for security checks. + +### Operator responsibilities + +8. Hide built-in services on public ports: set `internal_port`, set `has_builtin_services=false`, or use a firewall. +9. Keep `-enable_dir_service=false` and `-enable_threads_service=false` on public ports. +10. Unless truly needed, set `-immutable_flags=true` or ensure `/flags` is reachable only by trusted operators. +11. Configure TLS: server certificate, client verification, removal of TLS 1.0/1.1, and `force_ssl=true` when needed. +12. Set `max_concurrency`, per-method concurrency, `idle_timeout_sec`, and streaming caps. +13. When enabling `-http_header_of_user_ip`, allow only trusted proxies to access the backend port. +14. Do not run bRPC processes as root. +15. Use escaping when application HTTP handlers output HTML. +16. Put public endpoints behind a load balancer / reverse proxy for connection-rate control, slowloris handling, and L7 hardening. +17. Track OpenSSL patches and rotate TLS material separately. +18. If compression is enabled, limit decompressed size at the application layer or sidecar. +19. Use `enabled_protocols` to expose only required protocols. +20. Choose trusted naming-service backends and protect permissions on flagfiles, cert/key files, and pid files. + +### Both + +21. Re-read and revise this model on each major bRPC upgrade or whenever a §12 condition occurs. + +--- + +## §11 Known misuse patterns + +**M1.** Exposing a server with default `has_builtin_services=true` and `internal_port=-1` to the public internet. +**M2.** Treating `Authenticator` as per-request authentication. +**M3.** Enabling `-http_header_of_user_ip` while allowing clients to bypass the trusted proxy and connect directly. +**M4.** Calling `Channel::Init()` from multiple threads. +**M5.** Using `assert` for security checks. +**M6.** Running bRPC as root. +**M7.** Configuring SSL but forgetting `force_ssl=true`, leaving plaintext available. +**M8.** Using plaintext protocols across trust boundaries. +**M9.** Setting `-max_body_size` very large and assuming it will not affect memory. +**M10.** Assuming compressed output size is limited by the framework. +**M11.** Enabling `/dir` or `/threads` on the public internet. +**M12.** Enabling nshead/nova/public/nshead_mcpack and forgetting the sniffer will try these parsers. +**M13.** Treating sequence/correlation IDs as nonces. +**M14.** Exposing `/flags` while keeping `-immutable_flags=false`. +**M15.** Not revalidating `auth_context()` or downstream identity information. +**M16.** Combining `-usercode_in_pthread` with high concurrency without setting `max_concurrency`. +**M17.** Using an untrusted naming service while client TLS does not verify the server certificate. +**M18.** Exposing profiler endpoints to the public internet. +**M19.** Enabling `/rpcz` on traffic containing sensitive request fields. +**M20.** Enabling RDMA and exposing it to untrusted peers. + +--- + +## §11a Known non-findings (recurring false positives) + +**N1.** A parser reading length and checking it with `FLAGS_max_body_size` is by design; it is an issue only if a parser truly skips the check. +**N2.** ~~Decompression has no decompressed-size cap, per §9 D5.~~ +**N3.** Built-in services expose internal information; operators should hide them. +**N4.** `/flags` modifying reloadable gflags without authentication is pending Q46. +**N5.** `/dir` reads files: disabled by default; enabling it is a dangerous non-default configuration. +**N6.** `/threads` dumps stacks: disabled by default. +**N7.** bvar reading `/proc/loadavg` and `/proc/stat` is by design. +**N8.** Client TLS includes TLS 1.0/1.1 by default; triage pending Q56. +**N9.** Client TLS does not verify server certificates by default; triage pending Q57. +**N10.** `force_ssl=false` allowing plaintext is documented behavior. +**N11.** `Authenticator` running once per connection is documented behavior. +**N12.** Issues in test/example/tools/build/community are out of model. +**N13.** Hard-coded certificates under `test/` are out of model. +**N14.** HTTP Basic credentials in plaintext are a consequence of the operator choosing plaintext transport. +**N15.** MD5/SHA-1 used for load-balancer hash distribution is not cryptographic use. +**N16.** Wire-reachable integer overflow/OOB is a valid vulnerability class and should not be mechanically closed. +**N17.** `session_local_data_factory` lifetime is guaranteed by the user as required by documentation. +**N18.** The bthread keytable pool retaining objects is a reuse design. +**N19.** `Channel.Init()` being non-thread-safe is documented behavior. +**N20.** Runtime certificate add/delete/modify concurrency safety is judged case by case and needs maintainer confirmation. +**N21.** Built-ins being handled on the main port is default behavior; triage pending Q50. +**N22.** The sniffer trying multiple parsers on unknown bytes is by design. +**N23.** A fuzz crash in an opt-in parser can still be `VALID` when the path is enabled. +**N24.** Protobuf `TotalBytesLimit=INT_MAX` is documented design; the outer layer relies on `-max_body_size`. +**N25.** Naming-service backend replies are trusted. +**N26.** Triage for crashes on malformed DNS/consul/nacos replies must distinguish backend compromise from parser hardening. +**N27.** Brute-force authentication using many short connections is rate-limited by the operator. +**N28.** `/rpcz` may expose sampled request information; this is a design risk after enabling it. +**N29.** OpenSSL CVEs are not bRPC CVEs, but they affect deployments. +**N30.** `fork without exec` after bRPC initialization is unsupported. + +--- + +## §12 Conditions that would change this model + +The following changes should trigger model revision: + +1. A new wire protocol parser or sniffer registration. +2. A new built-in admin service, especially one with write capability. +3. Changes to security-relevant defaults in §5a: `-max_body_size`, streaming caps, `-immutable_flags`, built-in defaults, `force_ssl`, TLS verification, TLS protocols, and so on. +4. An opt-in protocol becoming enabled by default. +5. Adding a decompressed-size cap. +6. Adding h2/HPACK bomb defenses. +7. Adding a per-request authentication mode. +8. Adding `SECURITY.md` or a project security page to the repository. +9. The PMC publishing a security policy. +10. A new CVE class that cannot be triaged under §13. + +Vulnerabilities should be triaged against the model in effect for the affected version, not against the latest `HEAD`. + +--- + +## §13 Triage dispositions + +| Disposition | Meaning | Licensed by | +| --- | --- | --- | +| `VALID` | violates a property claimed in §8, with attacker, input, and component all in model | §8, §6, §7 | +| `VALID-HARDENING` | does not violate an existing claim, but the API easily leads to §11 misuse and the project may choose to harden it | §11 | +| `OUT-OF-MODEL: trusted-input` | requires controlling configuration or objects marked trusted by the model | §6 | +| `OUT-OF-MODEL: adversary-not-in-scope` | requires attacker capabilities excluded by the model | §7, §3 | +| `OUT-OF-MODEL: unsupported-component` | located in out-of-scope components such as test/tools/example/build/community/docs | §3 | +| `OUT-OF-MODEL: non-default-build` | appears only under dangerous or non-default configuration | §5a | +| `BY-DESIGN: property-disclaimed` | belongs to a property explicitly disclaimed in §9 | §9 | +| `KNOWN-NON-FINDING` | matches a recurring false-positive pattern in §11a | §11a | +| `MODEL-GAP` | cannot be classified and requires model revision | §12 | + +### Worked routing examples + +- `Parse*Message` OOB write: `VALID`. +- Private key leak under `test/`: `OUT-OF-MODEL: unsupported-component`. +- Client TLS not verifying server certificates by default: `BY-DESIGN`. +- Remote access to `/flags/max_body_size?setvalue=0`: operator responsibility. +- `/dir?path=/etc/passwd`: if it requires `-enable_dir_service=true`, `OUT-OF-MODEL: non-default-build`. +- A small gzip payload decompressing to huge output and causing OOM: `VALID`. +- h2 HPACK bomb: if defenses are missing and reachable, potentially `VALID`. +- Hostile consul backend redirecting a client: `OUT-OF-MODEL: adversary-not-in-scope`; malformed reply crashes can be judged separately. +- OpenSSL CVE: `BY-DESIGN: property-disclaimed`. +- `Channel.Init()` data race: `BY-DESIGN`, because documentation says it is not thread-safe. + +--- + +## §14 Open questions for the maintainers + +Each question includes the draft recommendation and awaits PMC confirmation, correction, or deletion. After confirmation, the corresponding *(inferred)* tags in the body should be updated to *(maintainer)*. + +--- + +### Wave 1 — scope, adversary, and the insecure-default rulings (must answer first) + +**Q1.** Is the server-side wire peer untrusted by default, so the runtime cannot assume input matches any registered protocol? Yes. +**Q2.** Is client-side deserialization of server responses in the same model scope as server-side handling of client requests? Yes. +**Q40.** Is `-max_body_size=64 MiB` a supported production default, or a baseline that operators must lower per deployment? Production default. +**Q50.** `has_builtin_services=true` + `internal_port=-1` puts built-ins on the main port by default; how should public exposure of `/flags`/`/version` be triaged? Operator responsibility. +**Q46.** `-immutable_flags=false` allows reachable `/flags` to modify reloadable gflags; should the default be changed to true? No, operator responsibility. +**Q57.** Client TLS does not verify server certificates by default; should successful MITM be `BY-DESIGN` or `VALID`/`VALID-HARDENING`? `BY-DESIGN`. +**Q56.** Is it acceptable that `ChannelSSLOptions.protocols` includes TLS 1.0/1.1 by default? `BY-DESIGN`. +**Q51.** Is `force_ssl=false`, which makes a TLS port still accept plaintext, only operator responsibility? Operator responsibility. + +### Wave 2 — what the runtime does (and does not do) to its host + +**Q9.** Is bRPC explicitly an embedded library rather than a secure-by-default daemon? Yes. +**Q10.** Does the user handler run in the same process as the deserializer, with no sandbox provided by bRPC? Yes. +**Q11.** Are TLS/SSL cryptographic guarantees entirely inherited from OpenSSL? Yes. +**Q12.** Does bRPC validate only wire framing, not application field semantics? Yes. +**Q24.** Is Windows outside the security support environment? Yes. +**Q28.** Do maintainers agree that parser/read/decompress paths are memory-unsafe C++ attack surfaces? Yes. + +### Wave 3 — wire-protocol parser surface (per-protocol hardening parity) + +**Q8.** Is the list of default-on, opt-in, and client-only protocols accurate? Yes. +**Q37.** Should `enabled_protocols` ensure parsers not listed are never tried? Yes. +**Q22.** Should vulnerabilities in opt-in parsers be triaged as `OUT-OF-MODEL: non-default-build` when not enabled? Parsers are all enabled by default, so triage as `VALID`. +**Q80.** Do all parsers with length framing uniformly check `FLAGS_max_body_size`? Yes. +**Q59.** Does h2/HPACK have defenses against bomb, CONTINUATION flood, PING flood, and SETTINGS flood? Preferably yes. +**Q68.** Does `mcpack2pb` have recursion/depth caps? Preferably yes. +**Q69.** Does `json2pb` have a JSON depth cap? Preferably yes. + +### Wave 4 — built-in admin services trust model + +**Q4.** Is the trust status of built-in admin consumers determined entirely by operator exposure? Yes. +**Q19.** Should public access to default built-ins such as `/version` be triaged as operator responsibility? Yes. +**Q45.** Because `/dir` and `/threads` are disabled by default, should issues after public enablement be triaged as non-default-build? Yes. +**Q71.** Do profiler endpoint `seconds` parameters have reasonable upper bounds? How should DoS after exposure be triaged? Preferably yes. +**Q87.** Is there no isolation between built-in services, so a bug in one handler can affect other services in the same process? This is an issue. + +### Wave 5 — TLS / SSL / authentication + +**Q52.** Is `strict_sni=false` fallback to the default certificate a supported posture? Yes. +**Q54.** Is server-side mTLS being disabled by default a supported posture? Yes. +**Q90.** Which protocols does `Authenticator` actually cover? Does it not cover Thrift/Redis/memcache/Mongo/RTMP/nshead by default? Yes. +**Q77.** Is an authenticated peer still an untrusted adversary at the parser layer? Yes. +**Q47.** Does `-http_header_of_user_ip` have no built-in trusted-proxy verification? Yes; this is not an issue. + +### Wave 6 — resource bounds, compression, streaming + +**Q42.** Should streaming unconsumed bytes being unlimited by default change default behavior or require explicit operator configuration? Yes. +**Q70.** Is it confirmed that bRPC has no decompressed-output size cap? Should `-max_decompressed_size` be added? Preferably yes. +**Q73.** Is it true that there is no per-protocol/per-method body cap and only global `-max_body_size`? There is indeed none, and this is acceptable. +**Q74.** Is there no framework-level connection-count cap? None. +**Q82.** Can the resource policy be stated as: superlinear memory growth over the wire-declared size is a bug when constrained by `-max_body_size`? Yes. +**Q93.** Has the HTTP parser been audited for request smuggling defenses? Yes. + +### Wave 7 — concurrency, properties, and remaining open items + +**Q5.** Does RDMA require explicit build-time and runtime enablement, with related vulnerabilities out of model when not enabled? Yes. +**Q7.** Are `test/`, `example/`, `tools/`, and `community/` out of model? Yes. +**Q18.** Do wire bytes remain untrusted until the user's `Service::Method` is called? Yes. +**Q20.** Is client response parsing modeled equivalently to server request parsing? Yes. +**Q23.** Can crashes on malformed naming-service replies be `VALID`, while malicious backend redirection is out of model? Yes. +**Q72.** Should consul/nacos and similar naming-service parsers defend against malformed input? Yes. +**Q79.** Does bRPC have continuous fuzzing/OSS-Fuzz; if not, does P1 mainly rely on code review and CI? No. +**Q83.** Under the per-connection bthread model, is synchronization of application shared state entirely the user's responsibility? Yes. +**Q84.** Is per-request authorization implemented by `Interceptor` or the handler, not `Authenticator`? Yes. +**Q88.** Should cross-protocol sniffer confusion be handled as a framework `VALID` issue? Yes. + +--- + +## §15 Optional: machine-readable companion + +v1 does not generate a machine-readable sidecar. After the defaults and triage decisions in §14 wave 1 stabilize, generate a derived index for tooling: entry points and parameter trust levels, in-scope/out-of-scope components, security-relevant gflag defaults, §8 properties, §9 disclaimed properties, §11a non-findings, and §13 disposition labels. This document remains the normative specification. + +--- + +## Appendix: SECURITY.md statement -> threat-model § back-map + +At drafting time, the repository had no `SECURITY.md`, and the Apache security project index provided only the generic `security@apache.org` address, with no bRPC project-level security page. + +| Source | Statement | Threat-model section | +| --- | --- | --- | +| `security.apache.org/projects/` | no project-level security content | N/A | +| future `SECURITY.md` | TBD by PMC | to be backfilled in a future version | + +Once the PMC publishes `SECURITY.md` or an official security policy, that artifact should become a higher-authority source. This document should then map back to or link to the official document. + +--- + +*End of v1 draft.* + diff --git a/WORKSPACE.bzlmod b/WORKSPACE.bzlmod new file mode 100644 index 0000000..e69de29 diff --git a/bazel/BUILD.bazel b/bazel/BUILD.bazel new file mode 100644 index 0000000..c75172c --- /dev/null +++ b/bazel/BUILD.bazel @@ -0,0 +1,26 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@hedron_compile_commands//:refresh_compile_commands.bzl", "refresh_compile_commands") + +refresh_compile_commands( + name = "brpc_compdb", + # Specify the targets of interest. + # For example, specify a dict of targets and their arguments: + targets = { + "//:brpc": "", + }, + # For more details, feel free to look into refresh_compile_commands.bzl if you want. +) diff --git a/bazel/config/BUILD.bazel b/bazel/config/BUILD.bazel new file mode 100644 index 0000000..eec551d --- /dev/null +++ b/bazel/config/BUILD.bazel @@ -0,0 +1,152 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@bazel_skylib//lib:selects.bzl", "selects") + +licenses(["notice"]) # Apache v2 + +selects.config_setting_group( + name = "brpc_with_glog", + match_any = [ + ":brpc_with_glog_deprecated_flag", + ":brpc_with_glog_new_flag", + ], + visibility = ["//visibility:public"], +) + +config_setting( + name = "brpc_with_glog_deprecated_flag", + define_values = {"with_glog": "true"}, +) + +config_setting( + name = "brpc_with_glog_new_flag", + define_values = {"BRPC_WITH_GLOG": "true"}, +) + +selects.config_setting_group( + name = "brpc_with_mesalink", + match_any = [ + ":brpc_with_mesalink_deprecated_flag", + ":brpc_with_mesalink_new_flag", + ], + visibility = ["//visibility:public"], +) + +config_setting( + name = "brpc_with_mesalink_deprecated_flag", + define_values = {"with_mesalink": "true"}, +) + +config_setting( + name = "brpc_with_mesalink_new_flag", + define_values = {"BRPC_WITH_MESALINK": "true"}, +) + +selects.config_setting_group( + name = "brpc_with_thrift", + match_any = [ + ":brpc_with_thrift_deprecated_flag", + ":brpc_with_thrift_new_flag", + ], + visibility = ["//visibility:public"], +) + +config_setting( + name = "brpc_with_thrift_legacy_version", + define_values = {"BRPC_WITH_THRIFT_LEGACY_VERSION": "true"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "brpc_with_thrift_deprecated_flag", + define_values = {"with_thrift": "true"}, +) + +config_setting( + name = "brpc_with_thrift_new_flag", + define_values = {"BRPC_WITH_THRIFT": "true"}, +) + +config_setting( + name = "brpc_build_for_unittest", + define_values = {"BRPC_BUILD_FOR_UNITTEST": "true"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "brpc_with_sse42", + define_values = {"BRPC_WITH_SSE42": "true"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "darwin", + values = {"cpu": "darwin"}, + visibility = ["//:__subpkgs__"], +) + +config_setting( + name = "brpc_with_rdma", + define_values = {"BRPC_WITH_RDMA": "true"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "brpc_with_boringssl", + define_values = {"BRPC_WITH_BORINGSSL": "true"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "brpc_with_debug_bthread_sche_safety", + define_values = {"with_debug_bthread_sche_safety": "true"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "brpc_with_debug_lock", + define_values = {"with_debug_lock": "true"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "brpc_with_asan", + define_values = {"with_asan": "true"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "brpc_with_bthread_tracer", + constraint_values = [ + "@platforms//cpu:x86_64", + ], + define_values = { + "with_bthread_tracer": "true", + }, + visibility = ["//visibility:public"], +) + +config_setting( + name = "brpc_with_no_pthread_mutex_hook", + define_values = {"BRPC_WITH_NO_PTHREAD_MUTEX_HOOK": "true"}, + visibility = ["//visibility:public"], +) + +config_setting( + name = "with_babylon_counter", + define_values = {"with_babylon_counter": "true"}, + visibility = ["//visibility:public"], +) \ No newline at end of file diff --git a/bazel/third_party/BUILD.bazel b/bazel/third_party/BUILD.bazel new file mode 100644 index 0000000..fefa6c3 --- /dev/null +++ b/bazel/third_party/BUILD.bazel @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Thie empty BUILD.bazel file is required to make Bazel treat +# this directory as a package. diff --git a/bazel/third_party/crc32c/BUILD.bazel b/bazel/third_party/crc32c/BUILD.bazel new file mode 100644 index 0000000..fefa6c3 --- /dev/null +++ b/bazel/third_party/crc32c/BUILD.bazel @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Thie empty BUILD.bazel file is required to make Bazel treat +# this directory as a package. diff --git a/bazel/third_party/crc32c/crc32c.BUILD b/bazel/third_party/crc32c/crc32c.BUILD new file mode 100644 index 0000000..72715d4 --- /dev/null +++ b/bazel/third_party/crc32c/crc32c.BUILD @@ -0,0 +1,93 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@rules_cc//cc:defs.bzl", "cc_library", "cc_test") + +genrule( + name = "crc32c_config_h", + srcs = ["src/crc32c_config.h.in"], + outs = ["crc32c/crc32c_config.h"], + cmd = """ +sed -e 's/#cmakedefine01/#define/' \ +""" + select({ + "@//bazel/config:brpc_with_sse42": """-e 's/ HAVE_SSE42/ HAVE_SSE42 1/' \ +""", + "//conditions:default": """-e 's/ HAVE_SSE42/ HAVE_SSE42 0/' \ +""", + }) + select({ + "@//bazel/config:brpc_with_glog": """-e 's/ CRC32C_TESTS_BUILT_WITH_GLOG/ CRC32C_TESTS_BUILT_WITH_GLOG 1/' \ +""", + "//conditions:default": """-e 's/ CRC32C_TESTS_BUILT_WITH_GLOG/ CRC32C_TESTS_BUILT_WITH_GLOG 0/' \ +""", + }) + """-e 's/ BYTE_ORDER_BIG_ENDIAN/ BYTE_ORDER_BIG_ENDIAN 0/' \ + -e 's/ HAVE_BUILTIN_PREFETCH/ HAVE_BUILTIN_PREFETCH 0/' \ + -e 's/ HAVE_MM_PREFETCH/ HAVE_MM_PREFETCH 0/' \ + -e 's/ HAVE_ARM64_CRC32C/ HAVE_ARM64_CRC32C 0/' \ + -e 's/ HAVE_STRONG_GETAUXVAL/ HAVE_STRONG_GETAUXVAL 0/' \ + -e 's/ HAVE_WEAK_GETAUXVAL/ HAVE_WEAK_GETAUXVAL 0/' \ + < $< > $@ +""", +) + +cc_library( + name = "crc32c", + srcs = [ + "src/crc32c.cc", + "src/crc32c_arm64.cc", + "src/crc32c_arm64.h", + "src/crc32c_arm64_check.h", + "src/crc32c_internal.h", + "src/crc32c_portable.cc", + "src/crc32c_prefetch.h", + "src/crc32c_read_le.h", + "src/crc32c_round_up.h", + "src/crc32c_sse42.cc", + "src/crc32c_sse42.h", + "src/crc32c_sse42_check.h", + ":crc32c_config_h", + ], + hdrs = [ + "include/crc32c/crc32c.h", + ], + copts = select({ + "@//bazel/config:brpc_with_sse42": ["-msse4.2"], + "//conditions:default": [], + }), + strip_include_prefix = "include", + visibility = ["//visibility:public"], +) + +cc_test( + name = "crc32c_test", + srcs = [ + "src/crc32c_arm64_unittest.cc", + "src/crc32c_extend_unittests.h", + "src/crc32c_portable_unittest.cc", + "src/crc32c_prefetch_unittest.cc", + "src/crc32c_read_le_unittest.cc", + "src/crc32c_round_up_unittest.cc", + "src/crc32c_sse42_unittest.cc", + "src/crc32c_test_main.cc", + "src/crc32c_unittest.cc", + ], + deps = [ + ":crc32c", + "@com_google_googletest//:gtest", + "@com_google_googletest//:gtest_main", + ] + select({ + "@//bazel/config:brpc_with_glog": ["@com_github_google_glog//:glog"], + "//conditions:default": [], + }), +) diff --git a/bazel/third_party/event/BUILD.bazel b/bazel/third_party/event/BUILD.bazel new file mode 100644 index 0000000..fefa6c3 --- /dev/null +++ b/bazel/third_party/event/BUILD.bazel @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Thie empty BUILD.bazel file is required to make Bazel treat +# this directory as a package. diff --git a/bazel/third_party/event/event.BUILD b/bazel/third_party/event/event.BUILD new file mode 100644 index 0000000..6fd6759 --- /dev/null +++ b/bazel/third_party/event/event.BUILD @@ -0,0 +1,59 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake") + +filegroup( + name = "all_srcs", + srcs = glob(["**"]), +) + +cmake( + name = "event", + cache_entries = { + "EVENT__DISABLE_BENCHMARK": "ON", + "EVENT__DISABLE_TESTS": "ON", + "EVENT__DISABLE_SAMPLES": "ON", + "EVENT__LIBRARY_TYPE": "STATIC", + "OPENSSL_ROOT_DIR": "$$EXT_BUILD_DEPS$$/openssl", + }, + generate_args = ["-GNinja"], + lib_source = ":all_srcs", + linkopts = [ + "-pthread", + ], + out_static_libs = select({ + "@platforms//os:windows": [ + "event.lib", + "event_core.lib", + "event_extra.lib", + "event_openssl.lib", + "event_pthreads.lib", + ], + "//conditions:default": [ + "libevent.a", + "libevent_core.a", + "libevent_extra.a", + "libevent_openssl.a", + "libevent_pthreads.a", + ], + }), + visibility = ["//visibility:public"], + deps = [ + # Zlib is only used for testing. + "@openssl//:crypto", + "@openssl//:ssl", + ], +) diff --git a/bazel/third_party/glog/0001-mark-override-resolve-warning.patch b/bazel/third_party/glog/0001-mark-override-resolve-warning.patch new file mode 100644 index 0000000..7a9bbb8 --- /dev/null +++ b/bazel/third_party/glog/0001-mark-override-resolve-warning.patch @@ -0,0 +1,36 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +diff --git a/src/glog/logging.h.in b/src/glog/logging.h.in +index 421f1e0..a363141 100755 +--- a/src/glog/logging.h.in ++++ b/src/glog/logging.h.in +@@ -1334,7 +1334,7 @@ class GOOGLE_GLOG_DLL_DECL LogStreamBuf : public std::streambuf { + } + + // This effectively ignores overflow. +- int_type overflow(int_type ch) { ++ int_type overflow(int_type ch) override { + return ch; + } + +@@ -1862,7 +1862,7 @@ class GOOGLE_GLOG_DLL_DECL NullStreamFatal : public NullStream { + NullStreamFatal() { } + NullStreamFatal(const char* file, int line, const CheckOpString& result) : + NullStream(file, line, result) { } +- @ac_cv___attribute___noreturn@ ~NullStreamFatal() throw () { _exit(1); } ++ @ac_cv___attribute___noreturn@ ~NullStreamFatal() throw () override { _exit(1); } + }; + + // Install a signal handler that will dump signal information and a stack diff --git a/bazel/third_party/glog/BUILD.bazel b/bazel/third_party/glog/BUILD.bazel new file mode 100644 index 0000000..fefa6c3 --- /dev/null +++ b/bazel/third_party/glog/BUILD.bazel @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Thie empty BUILD.bazel file is required to make Bazel treat +# this directory as a package. diff --git a/bazel/third_party/leveldb/BUILD.bazel b/bazel/third_party/leveldb/BUILD.bazel new file mode 100644 index 0000000..ea0c109 --- /dev/null +++ b/bazel/third_party/leveldb/BUILD.bazel @@ -0,0 +1,21 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +exports_files( + [ + "port_config.h", + "port.h", + ], +) diff --git a/bazel/third_party/leveldb/leveldb.BUILD b/bazel/third_party/leveldb/leveldb.BUILD new file mode 100644 index 0000000..787f77f --- /dev/null +++ b/bazel/third_party/leveldb/leveldb.BUILD @@ -0,0 +1,72 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@rules_cc//cc:defs.bzl", "cc_library") +load("@bazel_skylib//rules:copy_file.bzl", "copy_file") + +copy_file( + name = "port_config_h", + src = "@//bazel/third_party/leveldb:port_config.h", + out = "port/port_config.h", + allow_symlink = True, +) + +copy_file( + name = "port_h", + src = "@//bazel/third_party/leveldb:port.h", + out = "port/port.h", + allow_symlink = True, +) + +cc_library( + name = "leveldb", + srcs = glob( + [ + "db/**/*.cc", + "db/**/*.h", + "helpers/**/*.cc", + "helpers/**/*.h", + "port/**/*.cc", + "port/**/*.h", + "table/**/*.cc", + "table/**/*.h", + "util/**/*.cc", + "util/**/*.h", + ], + exclude = [ + "**/*_test.cc", + "**/testutil.*", + "**/*_bench.cc", + "**/*_windows*", + "db/leveldbutil.cc", + ], + ), + hdrs = glob( + ["include/**/*.h"], + exclude = ["doc/**"], + ) + [ + ":port_h", + ":port_config_h", + ], + includes = [ + ".", + "include", + ], + visibility = ["//visibility:public"], + deps = [ + "@com_github_google_crc32c//:crc32c", + "@com_github_google_snappy//:snappy", + ], +) diff --git a/bazel/third_party/leveldb/port.h b/bazel/third_party/leveldb/port.h new file mode 100644 index 0000000..8c9a4ea --- /dev/null +++ b/bazel/third_party/leveldb/port.h @@ -0,0 +1,34 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +// Copyright (c) 2011 The LevelDB Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. See the AUTHORS file for names of contributors. + +#ifndef STORAGE_LEVELDB_PORT_PORT_H_ +#define STORAGE_LEVELDB_PORT_PORT_H_ + +#include + +#define LEVELDB_HAS_PORT_CONFIG_H 1 + +// Include the appropriate platform specific file below. If you are +// porting to a new platform, see "port_example.h" for documentation +// of what the new port_.h file must provide. +#include "port/port_stdcxx.h" + +#endif // STORAGE_LEVELDB_PORT_PORT_H_ diff --git a/bazel/third_party/leveldb/port_config.h b/bazel/third_party/leveldb/port_config.h new file mode 100644 index 0000000..4ccdebf --- /dev/null +++ b/bazel/third_party/leveldb/port_config.h @@ -0,0 +1,38 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +// Copyright 2017 The LevelDB Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. See the AUTHORS file for names of contributors. + +#ifndef STORAGE_LEVELDB_PORT_PORT_CONFIG_H_ +#define STORAGE_LEVELDB_PORT_PORT_CONFIG_H_ + +// Define to 1 if you have a definition for fdatasync() in . +#define HAVE_FUNC_FDATASYNC 1 + +// Define to 1 if you have Google CRC32C. +#define HAVE_CRC32C 1 + +// Define to 1 if you have Google Snappy. +#define HAVE_SNAPPY 1 + +// Define to 1 if your processor stores words with the most significant byte +// first (like Motorola and SPARC, unlike Intel and VAX). +#define LEVELDB_IS_BIG_ENDIAN 0 + +#endif // STORAGE_LEVELDB_PORT_PORT_CONFIG_H_ diff --git a/bazel/third_party/openssl/BUILD.bazel b/bazel/third_party/openssl/BUILD.bazel new file mode 100644 index 0000000..fefa6c3 --- /dev/null +++ b/bazel/third_party/openssl/BUILD.bazel @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Thie empty BUILD.bazel file is required to make Bazel treat +# this directory as a package. diff --git a/bazel/third_party/openssl/openssl.BUILD b/bazel/third_party/openssl/openssl.BUILD new file mode 100644 index 0000000..c02cb6f --- /dev/null +++ b/bazel/third_party/openssl/openssl.BUILD @@ -0,0 +1,165 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copyright 2016 The Bazel Authors. All rights reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copied from https://github.com/bazelbuild/rules_foreign_cc/blob/0.7.0/examples/third_party/openssl/BUILD.openssl.bazel +# +# Modifications: +# 1. Create alias `ssl` & `crypto` to align with boringssl. +# 2. Build with `@com_github_madler_zlib//:zlib`. +# 3. Add more configure options coming from debian openssl package configurations. + +load("@rules_foreign_cc//foreign_cc:defs.bzl", "configure_make", "configure_make_variant") + +filegroup( + name = "all_srcs", + srcs = glob(["**"]), +) + +CONFIGURE_OPTIONS = [ + "no-idea", + "no-mdc2", + "no-rc5", + "no-ssl3", + "no-ssl3-method", + "enable-rfc3779", + "enable-cms", + "no-capieng", + "enable-ec_nistp_64_gcc_128", + "--with-zlib-include=$$EXT_BUILD_DEPS$$", + "--with-zlib-lib=$$EXT_BUILD_DEPS$$", + # https://stackoverflow.com/questions/36220341/struct-in6-addr-has-no-member-named-s6-addr32-with-ansi + "-D_DEFAULT_SOURCE=1", + "-DPEDANTIC", +] + +LIB_NAME = "openssl" + +MAKE_TARGETS = [ + "build_libs", + "install_dev", +] + +config_setting( + name = "msvc_compiler", + flag_values = { + "@bazel_tools//tools/cpp:compiler": "msvc-cl", + }, + visibility = ["//visibility:public"], +) + +alias( + name = "ssl", + actual = "openssl", + visibility = ["//visibility:public"], +) + +alias( + name = "crypto", + actual = "openssl", + visibility = ["//visibility:public"], +) + +alias( + name = "openssl", + actual = select({ + ":msvc_compiler": "openssl_msvc", + "//conditions:default": "openssl_default", + }), + visibility = ["//visibility:public"], +) + +configure_make_variant( + name = "openssl_msvc", + build_data = [ + "@nasm//:nasm", + "@perl//:perl", + ], + configure_command = "Configure", + configure_in_place = True, + configure_options = CONFIGURE_OPTIONS + [ + "VC-WIN64A", + # Unset Microsoft Assembler (MASM) flags set by built-in MSVC toolchain, + # as NASM is unsed to build OpenSSL rather than MASM + "ASFLAGS=\" \"", + ], + configure_prefix = "$PERL", + env = { + # The Zi flag must be set otherwise OpenSSL fails to build due to missing .pdb files + "CFLAGS": "-Zi", + "PATH": "$$(dirname $(execpath @nasm//:nasm)):$$PATH", + "PERL": "$(execpath @perl//:perl)", + }, + lib_name = LIB_NAME, + lib_source = ":all_srcs", + out_static_libs = [ + "libssl.lib", + "libcrypto.lib", + ], + targets = MAKE_TARGETS, + toolchain = "@rules_foreign_cc//toolchains:preinstalled_nmake_toolchain", + deps = [ + "@com_github_madler_zlib//:zlib", + ], +) + +# https://wiki.openssl.org/index.php/Compilation_and_Installation +configure_make( + name = "openssl_default", + configure_command = "config", + configure_in_place = True, + configure_options = CONFIGURE_OPTIONS, + env = select({ + "@platforms//os:macos": { + "AR": "", + "PERL": "$$EXT_BUILD_ROOT$$/$(PERL)", + }, + "//conditions:default": { + "PERL": "$$EXT_BUILD_ROOT$$/$(PERL)", + }, + }), + lib_name = LIB_NAME, + lib_source = ":all_srcs", + # Note that for Linux builds, libssl must come before libcrypto on the linker command-line. + # As such, libssl must be listed before libcrypto + out_static_libs = [ + "libssl.a", + "libcrypto.a", + ], + targets = MAKE_TARGETS, + toolchains = ["@rules_perl//:current_toolchain"], + deps = [ + "@com_github_madler_zlib//:zlib", + ], +) + +filegroup( + name = "gen_dir", + srcs = [":openssl"], + output_group = "gen_dir", +) diff --git a/bazel/third_party/protobuf/BUILD.bazel b/bazel/third_party/protobuf/BUILD.bazel new file mode 100644 index 0000000..fefa6c3 --- /dev/null +++ b/bazel/third_party/protobuf/BUILD.bazel @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Thie empty BUILD.bazel file is required to make Bazel treat +# this directory as a package. diff --git a/bazel/third_party/protobuf/protobuf.BUILD b/bazel/third_party/protobuf/protobuf.BUILD new file mode 100644 index 0000000..0d5188e --- /dev/null +++ b/bazel/third_party/protobuf/protobuf.BUILD @@ -0,0 +1,498 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copyright 2008 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Copied from https://github.com/protocolbuffers/protobuf/blob/v3.19.1/BUILD +# +# Modifications: +# 1. Remove all non-cxx rules. +# 2. Remove android support. +# 3. zlib use @com_github_madler_zlib//:zlib + +# Bazel (https://bazel.build/) BUILD file for Protobuf. + +load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library", native_cc_proto_library = "cc_proto_library") +load("@rules_proto//proto:defs.bzl", "proto_lang_toolchain", "proto_library") +load(":compiler_config_setting.bzl", "create_compiler_config_setting") +load( + ":protobuf.bzl", + "adapt_proto_library", +) + +licenses(["notice"]) + +exports_files(["LICENSE"]) + +################################################################################ +# build configuration +################################################################################ + +################################################################################ +# ZLIB configuration +################################################################################ + +ZLIB_DEPS = ["@com_github_madler_zlib//:zlib"] + +################################################################################ +# Protobuf Runtime Library +################################################################################ + +MSVC_COPTS = [ + "/wd4018", # -Wno-sign-compare + "/wd4065", # switch statement contains 'default' but no 'case' labels + "/wd4146", # unary minus operator applied to unsigned type, result still unsigned + "/wd4244", # 'conversion' conversion from 'type1' to 'type2', possible loss of data + "/wd4251", # 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2' + "/wd4267", # 'var' : conversion from 'size_t' to 'type', possible loss of data + "/wd4305", # 'identifier' : truncation from 'type1' to 'type2' + "/wd4307", # 'operator' : integral constant overflow + "/wd4309", # 'conversion' : truncation of constant value + "/wd4334", # 'operator' : result of 32-bit shift implicitly converted to 64 bits (was 64-bit shift intended?) + "/wd4355", # 'this' : used in base member initializer list + "/wd4506", # no definition for inline function 'function' + "/wd4800", # 'type' : forcing value to bool 'true' or 'false' (performance warning) + "/wd4996", # The compiler encountered a deprecated declaration. +] + +COPTS = select({ + ":msvc": MSVC_COPTS, + "//conditions:default": [ + "-DHAVE_ZLIB", + "-Wmissing-field-initializers", + "-Woverloaded-virtual", + "-Wno-sign-compare", + ], +}) + +create_compiler_config_setting( + name = "msvc", + value = "msvc-cl", + visibility = [ + # Public, but Protobuf only visibility. + "//:__subpackages__", + ], +) + +# Android and MSVC builds do not need to link in a separate pthread library. +LINK_OPTS = select({ + ":msvc": [ + # Suppress linker warnings about files with no symbols defined. + "-ignore:4221", + ], + "//conditions:default": [ + "-lpthread", + "-lm", + ], +}) + +cc_library( + name = "protobuf_lite", + srcs = [ + # AUTOGEN(protobuf_lite_srcs) + "src/google/protobuf/any_lite.cc", + "src/google/protobuf/arena.cc", + "src/google/protobuf/arenastring.cc", + "src/google/protobuf/extension_set.cc", + "src/google/protobuf/generated_enum_util.cc", + "src/google/protobuf/generated_message_table_driven_lite.cc", + "src/google/protobuf/generated_message_tctable_lite.cc", + "src/google/protobuf/generated_message_util.cc", + "src/google/protobuf/implicit_weak_message.cc", + "src/google/protobuf/inlined_string_field.cc", + "src/google/protobuf/io/coded_stream.cc", + "src/google/protobuf/io/io_win32.cc", + "src/google/protobuf/io/strtod.cc", + "src/google/protobuf/io/zero_copy_stream.cc", + "src/google/protobuf/io/zero_copy_stream_impl.cc", + "src/google/protobuf/io/zero_copy_stream_impl_lite.cc", + "src/google/protobuf/map.cc", + "src/google/protobuf/message_lite.cc", + "src/google/protobuf/parse_context.cc", + "src/google/protobuf/repeated_field.cc", + "src/google/protobuf/repeated_ptr_field.cc", + "src/google/protobuf/stubs/bytestream.cc", + "src/google/protobuf/stubs/common.cc", + "src/google/protobuf/stubs/int128.cc", + "src/google/protobuf/stubs/status.cc", + "src/google/protobuf/stubs/statusor.cc", + "src/google/protobuf/stubs/stringpiece.cc", + "src/google/protobuf/stubs/stringprintf.cc", + "src/google/protobuf/stubs/structurally_valid.cc", + "src/google/protobuf/stubs/strutil.cc", + "src/google/protobuf/stubs/time.cc", + "src/google/protobuf/wire_format_lite.cc", + ], + hdrs = glob([ + "src/google/protobuf/**/*.h", + "src/google/protobuf/**/*.inc", + ]), + copts = COPTS, + includes = ["src/"], + linkopts = LINK_OPTS, + visibility = ["//visibility:public"], +) + +PROTOBUF_DEPS = select({ + ":msvc": [], + "//conditions:default": ZLIB_DEPS, +}) + +cc_library( + name = "protobuf", + srcs = [ + # AUTOGEN(protobuf_srcs) + "src/google/protobuf/any.cc", + "src/google/protobuf/any.pb.cc", + "src/google/protobuf/api.pb.cc", + "src/google/protobuf/compiler/importer.cc", + "src/google/protobuf/compiler/parser.cc", + "src/google/protobuf/descriptor.cc", + "src/google/protobuf/descriptor.pb.cc", + "src/google/protobuf/descriptor_database.cc", + "src/google/protobuf/duration.pb.cc", + "src/google/protobuf/dynamic_message.cc", + "src/google/protobuf/empty.pb.cc", + "src/google/protobuf/extension_set_heavy.cc", + "src/google/protobuf/field_mask.pb.cc", + "src/google/protobuf/generated_message_bases.cc", + "src/google/protobuf/generated_message_reflection.cc", + "src/google/protobuf/generated_message_table_driven.cc", + "src/google/protobuf/generated_message_tctable_full.cc", + "src/google/protobuf/io/gzip_stream.cc", + "src/google/protobuf/io/printer.cc", + "src/google/protobuf/io/tokenizer.cc", + "src/google/protobuf/map_field.cc", + "src/google/protobuf/message.cc", + "src/google/protobuf/reflection_ops.cc", + "src/google/protobuf/service.cc", + "src/google/protobuf/source_context.pb.cc", + "src/google/protobuf/struct.pb.cc", + "src/google/protobuf/stubs/substitute.cc", + "src/google/protobuf/text_format.cc", + "src/google/protobuf/timestamp.pb.cc", + "src/google/protobuf/type.pb.cc", + "src/google/protobuf/unknown_field_set.cc", + "src/google/protobuf/util/delimited_message_util.cc", + "src/google/protobuf/util/field_comparator.cc", + "src/google/protobuf/util/field_mask_util.cc", + "src/google/protobuf/util/internal/datapiece.cc", + "src/google/protobuf/util/internal/default_value_objectwriter.cc", + "src/google/protobuf/util/internal/error_listener.cc", + "src/google/protobuf/util/internal/field_mask_utility.cc", + "src/google/protobuf/util/internal/json_escaping.cc", + "src/google/protobuf/util/internal/json_objectwriter.cc", + "src/google/protobuf/util/internal/json_stream_parser.cc", + "src/google/protobuf/util/internal/object_writer.cc", + "src/google/protobuf/util/internal/proto_writer.cc", + "src/google/protobuf/util/internal/protostream_objectsource.cc", + "src/google/protobuf/util/internal/protostream_objectwriter.cc", + "src/google/protobuf/util/internal/type_info.cc", + "src/google/protobuf/util/internal/utility.cc", + "src/google/protobuf/util/json_util.cc", + "src/google/protobuf/util/message_differencer.cc", + "src/google/protobuf/util/time_util.cc", + "src/google/protobuf/util/type_resolver_util.cc", + "src/google/protobuf/wire_format.cc", + "src/google/protobuf/wrappers.pb.cc", + ], + hdrs = glob([ + "src/**/*.h", + "src/**/*.inc", + ]), + copts = COPTS, + includes = ["src/"], + linkopts = LINK_OPTS, + visibility = ["//visibility:public"], + deps = [":protobuf_lite"] + PROTOBUF_DEPS, +) + +# This provides just the header files for use in projects that need to build +# shared libraries for dynamic loading. This target is available until Bazel +# adds native support for such use cases. +# TODO(keveman): Remove this target once the support gets added to Bazel. +cc_library( + name = "protobuf_headers", + hdrs = glob([ + "src/**/*.h", + "src/**/*.inc", + ]), + includes = ["src/"], + visibility = ["//visibility:public"], +) + +# Map of all well known protos. +# name => (include path, imports) +WELL_KNOWN_PROTO_MAP = { + "any": ("src/google/protobuf/any.proto", []), + "api": ( + "src/google/protobuf/api.proto", + [ + "source_context", + "type", + ], + ), + "compiler_plugin": ( + "src/google/protobuf/compiler/plugin.proto", + ["descriptor"], + ), + "descriptor": ("src/google/protobuf/descriptor.proto", []), + "duration": ("src/google/protobuf/duration.proto", []), + "empty": ("src/google/protobuf/empty.proto", []), + "field_mask": ("src/google/protobuf/field_mask.proto", []), + "source_context": ("src/google/protobuf/source_context.proto", []), + "struct": ("src/google/protobuf/struct.proto", []), + "timestamp": ("src/google/protobuf/timestamp.proto", []), + "type": ( + "src/google/protobuf/type.proto", + [ + "any", + "source_context", + ], + ), + "wrappers": ("src/google/protobuf/wrappers.proto", []), +} + +WELL_KNOWN_PROTOS = [value[0] for value in WELL_KNOWN_PROTO_MAP.values()] + +LITE_WELL_KNOWN_PROTO_MAP = { + "any": ("src/google/protobuf/any.proto", []), + "api": ( + "src/google/protobuf/api.proto", + [ + "source_context", + "type", + ], + ), + "duration": ("src/google/protobuf/duration.proto", []), + "empty": ("src/google/protobuf/empty.proto", []), + "field_mask": ("src/google/protobuf/field_mask.proto", []), + "source_context": ("src/google/protobuf/source_context.proto", []), + "struct": ("src/google/protobuf/struct.proto", []), + "timestamp": ("src/google/protobuf/timestamp.proto", []), + "type": ( + "src/google/protobuf/type.proto", + [ + "any", + "source_context", + ], + ), + "wrappers": ("src/google/protobuf/wrappers.proto", []), +} + +LITE_WELL_KNOWN_PROTOS = [value[0] for value in LITE_WELL_KNOWN_PROTO_MAP.values()] + +filegroup( + name = "well_known_protos", + srcs = WELL_KNOWN_PROTOS, + visibility = ["//visibility:public"], +) + +filegroup( + name = "lite_well_known_protos", + srcs = LITE_WELL_KNOWN_PROTOS, + visibility = ["//visibility:public"], +) + +adapt_proto_library( + name = "cc_wkt_protos_genproto", + visibility = ["//visibility:public"], + deps = [proto + "_proto" for proto in WELL_KNOWN_PROTO_MAP.keys()], +) + +cc_library( + name = "cc_wkt_protos", + deprecation = "Only for backward compatibility. Do not use.", + visibility = ["//visibility:public"], +) + +################################################################################ +# Well Known Types Proto Library Rules +# +# These proto_library rules can be used with one of the language specific proto +# library rules i.e. java_proto_library: +# +# java_proto_library( +# name = "any_java_proto", +# deps = ["@com_google_protobuf//:any_proto], +# ) +################################################################################ + +[proto_library( + name = proto[0] + "_proto", + srcs = [proto[1][0]], + strip_import_prefix = "src", + visibility = ["//visibility:public"], + deps = [dep + "_proto" for dep in proto[1][1]], +) for proto in WELL_KNOWN_PROTO_MAP.items()] + +[native_cc_proto_library( + name = proto + "_cc_proto", + visibility = ["//visibility:private"], + deps = [proto + "_proto"], +) for proto in WELL_KNOWN_PROTO_MAP.keys()] + +################################################################################ +# Protocol Buffers Compiler +################################################################################ + +cc_library( + name = "protoc_lib", + srcs = [ + # AUTOGEN(protoc_lib_srcs) + "src/google/protobuf/compiler/code_generator.cc", + "src/google/protobuf/compiler/command_line_interface.cc", + "src/google/protobuf/compiler/cpp/cpp_enum.cc", + "src/google/protobuf/compiler/cpp/cpp_enum_field.cc", + "src/google/protobuf/compiler/cpp/cpp_extension.cc", + "src/google/protobuf/compiler/cpp/cpp_field.cc", + "src/google/protobuf/compiler/cpp/cpp_file.cc", + "src/google/protobuf/compiler/cpp/cpp_generator.cc", + "src/google/protobuf/compiler/cpp/cpp_helpers.cc", + "src/google/protobuf/compiler/cpp/cpp_map_field.cc", + "src/google/protobuf/compiler/cpp/cpp_message.cc", + "src/google/protobuf/compiler/cpp/cpp_message_field.cc", + "src/google/protobuf/compiler/cpp/cpp_padding_optimizer.cc", + "src/google/protobuf/compiler/cpp/cpp_parse_function_generator.cc", + "src/google/protobuf/compiler/cpp/cpp_primitive_field.cc", + "src/google/protobuf/compiler/cpp/cpp_service.cc", + "src/google/protobuf/compiler/cpp/cpp_string_field.cc", + "src/google/protobuf/compiler/csharp/csharp_doc_comment.cc", + "src/google/protobuf/compiler/csharp/csharp_enum.cc", + "src/google/protobuf/compiler/csharp/csharp_enum_field.cc", + "src/google/protobuf/compiler/csharp/csharp_field_base.cc", + "src/google/protobuf/compiler/csharp/csharp_generator.cc", + "src/google/protobuf/compiler/csharp/csharp_helpers.cc", + "src/google/protobuf/compiler/csharp/csharp_map_field.cc", + "src/google/protobuf/compiler/csharp/csharp_message.cc", + "src/google/protobuf/compiler/csharp/csharp_message_field.cc", + "src/google/protobuf/compiler/csharp/csharp_primitive_field.cc", + "src/google/protobuf/compiler/csharp/csharp_reflection_class.cc", + "src/google/protobuf/compiler/csharp/csharp_repeated_enum_field.cc", + "src/google/protobuf/compiler/csharp/csharp_repeated_message_field.cc", + "src/google/protobuf/compiler/csharp/csharp_repeated_primitive_field.cc", + "src/google/protobuf/compiler/csharp/csharp_source_generator_base.cc", + "src/google/protobuf/compiler/csharp/csharp_wrapper_field.cc", + "src/google/protobuf/compiler/java/java_context.cc", + "src/google/protobuf/compiler/java/java_doc_comment.cc", + "src/google/protobuf/compiler/java/java_enum.cc", + "src/google/protobuf/compiler/java/java_enum_field.cc", + "src/google/protobuf/compiler/java/java_enum_field_lite.cc", + "src/google/protobuf/compiler/java/java_enum_lite.cc", + "src/google/protobuf/compiler/java/java_extension.cc", + "src/google/protobuf/compiler/java/java_extension_lite.cc", + "src/google/protobuf/compiler/java/java_field.cc", + "src/google/protobuf/compiler/java/java_file.cc", + "src/google/protobuf/compiler/java/java_generator.cc", + "src/google/protobuf/compiler/java/java_generator_factory.cc", + "src/google/protobuf/compiler/java/java_helpers.cc", + "src/google/protobuf/compiler/java/java_kotlin_generator.cc", + "src/google/protobuf/compiler/java/java_map_field.cc", + "src/google/protobuf/compiler/java/java_map_field_lite.cc", + "src/google/protobuf/compiler/java/java_message.cc", + "src/google/protobuf/compiler/java/java_message_builder.cc", + "src/google/protobuf/compiler/java/java_message_builder_lite.cc", + "src/google/protobuf/compiler/java/java_message_field.cc", + "src/google/protobuf/compiler/java/java_message_field_lite.cc", + "src/google/protobuf/compiler/java/java_message_lite.cc", + "src/google/protobuf/compiler/java/java_name_resolver.cc", + "src/google/protobuf/compiler/java/java_primitive_field.cc", + "src/google/protobuf/compiler/java/java_primitive_field_lite.cc", + "src/google/protobuf/compiler/java/java_service.cc", + "src/google/protobuf/compiler/java/java_shared_code_generator.cc", + "src/google/protobuf/compiler/java/java_string_field.cc", + "src/google/protobuf/compiler/java/java_string_field_lite.cc", + "src/google/protobuf/compiler/js/js_generator.cc", + "src/google/protobuf/compiler/js/well_known_types_embed.cc", + "src/google/protobuf/compiler/objectivec/objectivec_enum.cc", + "src/google/protobuf/compiler/objectivec/objectivec_enum_field.cc", + "src/google/protobuf/compiler/objectivec/objectivec_extension.cc", + "src/google/protobuf/compiler/objectivec/objectivec_field.cc", + "src/google/protobuf/compiler/objectivec/objectivec_file.cc", + "src/google/protobuf/compiler/objectivec/objectivec_generator.cc", + "src/google/protobuf/compiler/objectivec/objectivec_helpers.cc", + "src/google/protobuf/compiler/objectivec/objectivec_map_field.cc", + "src/google/protobuf/compiler/objectivec/objectivec_message.cc", + "src/google/protobuf/compiler/objectivec/objectivec_message_field.cc", + "src/google/protobuf/compiler/objectivec/objectivec_oneof.cc", + "src/google/protobuf/compiler/objectivec/objectivec_primitive_field.cc", + "src/google/protobuf/compiler/php/php_generator.cc", + "src/google/protobuf/compiler/plugin.cc", + "src/google/protobuf/compiler/plugin.pb.cc", + "src/google/protobuf/compiler/python/python_generator.cc", + "src/google/protobuf/compiler/ruby/ruby_generator.cc", + "src/google/protobuf/compiler/subprocess.cc", + "src/google/protobuf/compiler/zip_writer.cc", + ], + copts = COPTS, + includes = ["src/"], + linkopts = LINK_OPTS, + visibility = ["//visibility:public"], + deps = [":protobuf"], +) + +cc_binary( + name = "protoc", + srcs = ["src/google/protobuf/compiler/main.cc"], + linkopts = LINK_OPTS, + visibility = ["//visibility:public"], + deps = [":protoc_lib"], +) + +proto_lang_toolchain( + name = "cc_toolchain", + blacklisted_protos = [proto + "_proto" for proto in WELL_KNOWN_PROTO_MAP.keys()], + command_line = "--cpp_out=$(OUT)", + runtime = ":protobuf", + visibility = ["//visibility:public"], +) + +alias( + name = "objectivec", + actual = "//objectivec", + visibility = ["//visibility:public"], +) + +alias( + name = "protobuf_objc", + actual = "//objectivec", + visibility = ["//visibility:public"], +) diff --git a/bazel/third_party/snappy/BUILD.bazel b/bazel/third_party/snappy/BUILD.bazel new file mode 100644 index 0000000..fefa6c3 --- /dev/null +++ b/bazel/third_party/snappy/BUILD.bazel @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Thie empty BUILD.bazel file is required to make Bazel treat +# this directory as a package. diff --git a/bazel/third_party/snappy/snappy.BUILD b/bazel/third_party/snappy/snappy.BUILD new file mode 100644 index 0000000..9cfb1ad --- /dev/null +++ b/bazel/third_party/snappy/snappy.BUILD @@ -0,0 +1,122 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copyright 2015 The TensorFlow Authors. All Rights Reserved. +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Copied from https://github.com/tensorflow/tensorflow/blob/bdd8bf316e4ab7d699127d192d30eb614a158462/third_party/snappy.BUILD + +load("@rules_cc//cc:defs.bzl", "cc_library") + +cc_library( + name = "snappy", + srcs = [ + "config.h", + "snappy.cc", + "snappy.h", + "snappy-internal.h", + "snappy-sinksource.cc", + "snappy-stubs-internal.cc", + "snappy-stubs-internal.h", + "snappy-stubs-public.h", + ], + hdrs = [ + "snappy.h", + "snappy-sinksource.h", + ], + copts = [ + "-DHAVE_CONFIG_H", + "-fno-exceptions", + "-Wno-sign-compare", + "-Wno-shift-negative-value", + ], + includes = ["."], + visibility = ["//visibility:public"], +) + +genrule( + name = "config_h", + outs = ["config.h"], + cmd = "\n".join([ + "cat <<'EOF' >$@", + "#define HAVE_STDDEF_H 1", + "#define HAVE_STDINT_H 1", + "", + "#ifdef __has_builtin", + "# if !defined(HAVE_BUILTIN_EXPECT) && __has_builtin(__builtin_expect)", + "# define HAVE_BUILTIN_EXPECT 1", + "# endif", + "# if !defined(HAVE_BUILTIN_CTZ) && __has_builtin(__builtin_ctzll)", + "# define HAVE_BUILTIN_CTZ 1", + "# endif", + "#elif defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 4)", + "# ifndef HAVE_BUILTIN_EXPECT", + "# define HAVE_BUILTIN_EXPECT 1", + "# endif", + "# ifndef HAVE_BUILTIN_CTZ", + "# define HAVE_BUILTIN_CTZ 1", + "# endif", + "#endif", + "", + "#ifdef __has_include", + "# if !defined(HAVE_BYTESWAP_H) && __has_include()", + "# define HAVE_BYTESWAP_H 1", + "# endif", + "# if !defined(HAVE_UNISTD_H) && __has_include()", + "# define HAVE_UNISTD_H 1", + "# endif", + "# if !defined(HAVE_SYS_ENDIAN_H) && __has_include()", + "# define HAVE_SYS_ENDIAN_H 1", + "# endif", + "# if !defined(HAVE_SYS_MMAN_H) && __has_include()", + "# define HAVE_SYS_MMAN_H 1", + "# endif", + "# if !defined(HAVE_SYS_UIO_H) && __has_include()", + "# define HAVE_SYS_UIO_H 1", + "# endif", + "#endif", + "", + "#ifndef SNAPPY_IS_BIG_ENDIAN", + "# ifdef __s390x__", + "# define SNAPPY_IS_BIG_ENDIAN 1", + "# elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__", + "# define SNAPPY_IS_BIG_ENDIAN 1", + "# endif", + "#endif", + "EOF", + ]), +) + +genrule( + name = "snappy_stubs_public_h", + srcs = ["snappy-stubs-public.h.in"], + outs = ["snappy-stubs-public.h"], + cmd = ("sed " + + "-e 's/$${\\(.*\\)_01}/\\1/g' " + + "-e 's/$${SNAPPY_MAJOR}/1/g' " + + "-e 's/$${SNAPPY_MINOR}/1/g' " + + "-e 's/$${SNAPPY_PATCHLEVEL}/7/g' " + + "$< >$@"), +) diff --git a/bazel/third_party/thrift/BUILD.bazel b/bazel/third_party/thrift/BUILD.bazel new file mode 100644 index 0000000..fefa6c3 --- /dev/null +++ b/bazel/third_party/thrift/BUILD.bazel @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Thie empty BUILD.bazel file is required to make Bazel treat +# this directory as a package. diff --git a/bazel/third_party/thrift/thrift.BUILD b/bazel/third_party/thrift/thrift.BUILD new file mode 100644 index 0000000..079606a --- /dev/null +++ b/bazel/third_party/thrift/thrift.BUILD @@ -0,0 +1,75 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@rules_foreign_cc//foreign_cc:defs.bzl", "cmake") + +filegroup( + name = "all_srcs", + srcs = glob(["**"]), +) + +cmake( + name = "thrift", + cache_entries = { + "BUILD_COMPILER": "OFF", + "BUILD_TESTING": "OFF", + "BUILD_TUTORIALS": "OFF", + "WITH_AS3": "OFF", + "WITH_CPP": "ON", + "WITH_C_GLIB": "OFF", + "WITH_JAVA": "OFF", + "WITH_JAVASCRIPT": "OFF", + "WITH_NODEJS": "OFF", + "WITH_PYTHON": "OFF", + "BUILD_SHARED_LIBS": "OFF", + "Boost_USE_STATIC_LIBS": "ON", + "BOOST_ROOT": "$$EXT_BUILD_DEPS$$", + "LIBEVENT_INCLUDE_DIRS": "$$EXT_BUILD_DEPS$$/event/include", + "LIBEVENT_LIBRARIES": "$$EXT_BUILD_DEPS$$/event/lib/libevent.a", + "OPENSSL_ROOT_DIR": "$$EXT_BUILD_DEPS$$/openssl", + "ZLIB_ROOT": "$$EXT_BUILD_DEPS$$/zlib", + }, + generate_args = ["-GNinja"], + lib_source = ":all_srcs", + linkopts = [ + "-pthread", + ], + out_static_libs = select({ + "@platforms//os:windows": [ + "thrift.lib", + "thriftnb.lib", + "thriftz.lib", + ], + "//conditions:default": [ + "libthrift.a", + "libthriftnb.a", + "libthriftz.a", + ], + }), + visibility = ["//visibility:public"], + deps = [ + "@boost//:algorithm", + "@boost//:locale", + "@boost//:noncopyable", + "@boost//:numeric_conversion", + "@boost//:scoped_array", + "@boost//:smart_ptr", + "@boost//:tokenizer", + "@com_github_libevent_libevent//:event", + "@com_github_madler_zlib//:zlib", + "@openssl//:crypto", + "@openssl//:ssl", + ], +) diff --git a/bazel/third_party/zlib/BUILD.bazel b/bazel/third_party/zlib/BUILD.bazel new file mode 100644 index 0000000..fefa6c3 --- /dev/null +++ b/bazel/third_party/zlib/BUILD.bazel @@ -0,0 +1,17 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Thie empty BUILD.bazel file is required to make Bazel treat +# this directory as a package. diff --git a/bazel/third_party/zlib/zlib.BUILD b/bazel/third_party/zlib/zlib.BUILD new file mode 100644 index 0000000..d8139b6 --- /dev/null +++ b/bazel/third_party/zlib/zlib.BUILD @@ -0,0 +1,111 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Copyright 2008 Google Inc. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following disclaimer +# in the documentation and/or other materials provided with the +# distribution. +# * Neither the name of Google Inc. nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +# Copied from https://github.com/protocolbuffers/protobuf/blob/v3.9.1/third_party/zlib.BUILD + +load("@rules_cc//cc:defs.bzl", "cc_library") + +_ZLIB_HEADERS = [ + "crc32.h", + "deflate.h", + "gzguts.h", + "inffast.h", + "inffixed.h", + "inflate.h", + "inftrees.h", + "trees.h", + "zconf.h", + "zlib.h", + "zutil.h", +] + +_ZLIB_PREFIXED_HEADERS = ["zlib/include/" + hdr for hdr in _ZLIB_HEADERS] + +# In order to limit the damage from the `includes` propagation +# via `:zlib`, copy the public headers to a subdirectory and +# expose those. +genrule( + name = "copy_public_headers", + srcs = _ZLIB_HEADERS, + outs = _ZLIB_PREFIXED_HEADERS, + cmd = "cp $(SRCS) $(@D)/zlib/include/", + visibility = ["//visibility:private"], +) + +cc_library( + name = "zlib", + srcs = [ + "adler32.c", + "compress.c", + "crc32.c", + "deflate.c", + "gzclose.c", + "gzlib.c", + "gzread.c", + "gzwrite.c", + "infback.c", + "inffast.c", + "inflate.c", + "inftrees.c", + "trees.c", + "uncompr.c", + "zutil.c", + ], + hdrs = _ZLIB_PREFIXED_HEADERS, + copts = select({ + ":windows": [], + "//conditions:default": [ + "-Wno-unused-variable", + "-Wno-implicit-function-declaration", + ], + }), + includes = ["zlib/include/"], + visibility = ["//visibility:public"], +) + +config_setting( + name = "windows", + constraint_values = [ + "@platforms//os:windows", + ], +) diff --git a/bazel/tools/BUILD.bazel b/bazel/tools/BUILD.bazel new file mode 100644 index 0000000..3b44830 --- /dev/null +++ b/bazel/tools/BUILD.bazel @@ -0,0 +1,23 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This BUILD file marks bazel/tools/ as a Bazel package so that loads +# of the form `//bazel/tools:xxx.bzl` are valid. The directory only +# hosts .bzl files (brpc_proto_library.bzl / proto_gen.bzl) and does +# not define any build targets. + +package(default_visibility = ["//visibility:public"]) + +exports_files(glob(["*.bzl"])) diff --git a/bazel/tools/brpc_proto_library.bzl b/bazel/tools/brpc_proto_library.bzl new file mode 100644 index 0000000..22a3c00 --- /dev/null +++ b/bazel/tools/brpc_proto_library.bzl @@ -0,0 +1,138 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# brpc_proto_library: a proto -> cc_library macro that is robust against +# protobuf and Bazel version churn. +# +# Background: +# - Old protobuf (< 3.21) used to expose a `cc_proto_library` macro +# via `@com_google_protobuf//:protobuf.bzl`; newer protobuf removed +# that macro. +# - Newer protobuf expects callers to use Bazel's native +# `proto_library` / `cc_proto_library` (or the `cc_proto_library` +# re-exported from `@com_google_protobuf//bazel:cc_proto_library.bzl`), +# but older protobuf does not surface a complete `ProtoInfo`, so +# the native rules cannot build it. +# - Bazel 8 additionally removed `cc_proto_library` from +# `@rules_cc//cc:defs.bzl` (the load now resolves to a stub rule +# that fails analysis), forcing every caller to either load it +# from `@com_google_protobuf` or replace it. +# - Bazel's `load()` is static and cannot be conditional on the +# protobuf version, so a single brpc_proto_library.bzl cannot +# directly satisfy both old and new protobuf by switching imports. +# +# Solution (inspired by https://github.com/trpc-group/trpc-cpp/blob/a69d2950f4a9c16b3cb40a2750c69d8940c96820/trpc/trpc.bzl): +# We implement the proto compilation rule from scratch (see +# proto_gen.bzl in this directory). Dependency information is +# propagated through Bazel's native `ProtoInfo` provider, and the +# default well-known-proto source is +# `@com_google_protobuf//:descriptor_proto` -- a `proto_library` +# whose name has been stable across protobuf 3.x / 27.x / 34.x. +load("//bazel/tools:proto_gen.bzl", "brpc_proto_gen") + +# `:descriptor_proto` is the protobuf repo's `proto_library` target; +# its label has been stable since protobuf 3.x. We consume it through +# Bazel's native `ProtoInfo` provider, which is uniform across PB +# versions. If a caller's .proto needs additional well-known protos +# (any.proto, timestamp.proto, ...), they can pass extra entries via +# the `proto_deps` argument. +_DEFAULT_PROTO_DEPS = ["@com_google_protobuf//:descriptor_proto"] + +def brpc_proto_library( + name, + srcs, + deps = [], + include = None, + proto_deps = None, + visibility = None, + testonly = 0): + """Generate a cc_library from a set of .proto files. + + Args: + name: target name. + srcs: list of .proto files, paths relative to the current package. + deps: list of other `brpc_proto_library` targets this target + depends on. The macro internally translates these labels + to the underlying `_genproto` rule so that .proto + include paths and sources propagate. + include: protoc `-I` root AND the resulting cc_library `includes` + root, relative to the current package. + When omitted, "" or None, the include root is the + current package itself (suitable for .proto files + sitting directly under the package root, as in `test/` + and `example/...`). The root `BUILD.bazel` of brpc must + pass `"src"` so that code can reference the protos as + `import "brpc/foo.proto"`. + proto_deps: list of native `proto_library` dependencies + (well-known protos or external .proto libraries). + Defaults to + `["@com_google_protobuf//:descriptor_proto"]`. + Pass `[]` explicitly to disable the default; pass + None (the default) to use it. + visibility: same semantics as cc_library. + testonly: same semantics as cc_library. + """ + + real_include = include if include != None else "" + real_proto_deps = proto_deps if proto_deps != None else _DEFAULT_PROTO_DEPS + + gen_name = name + "_genproto" + brpc_proto_gen( + name = gen_name, + srcs = srcs, + # Rewrite each `brpc_proto_library` dep to its underlying + # `_genproto` rule, which exports BrpcProtoInfo. + deps = [d + "_genproto" for d in deps], + include = real_include, + proto_deps = real_proto_deps, + visibility = visibility, + testonly = testonly, + ) + + # Split the generated files into .pb.h / .pb.cc via OutputGroupInfo + # and feed them to cc_library's hdrs / srcs separately. Bazel + # rejects declaring the same File in both hdrs and srcs, so a + # plain DefaultInfo wouldn't work here. + native.filegroup( + name = gen_name + "_hdrs", + srcs = [":" + gen_name], + output_group = "hdrs", + visibility = visibility, + testonly = testonly, + ) + native.filegroup( + name = gen_name + "_srcs", + srcs = [":" + gen_name], + output_group = "srcs", + visibility = visibility, + testonly = testonly, + ) + + native.cc_library( + name = name, + srcs = [":" + gen_name + "_srcs"], + hdrs = [":" + gen_name + "_hdrs"], + # cc_library `includes` is required, otherwise the .pb.cc + # files inside this cc_library cannot find the .pb.h headers + # they just generated (the headers live under + # bazel-bin///...). When include="" we pass + # "." to mean "the current package itself"; Bazel then exposes + # both `-I ` and `-I bazel-bin/` + # automatically to dependents. + includes = [real_include if real_include else "."], + deps = deps + ["@com_google_protobuf//:protobuf"], + visibility = visibility, + testonly = testonly, + ) diff --git a/bazel/tools/proto_gen.bzl b/bazel/tools/proto_gen.bzl new file mode 100644 index 0000000..554d24d --- /dev/null +++ b/bazel/tools/proto_gen.bzl @@ -0,0 +1,240 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# brpc's self-implemented proto -> .pb.{h,cc} compilation rule. +# +# Cross-protobuf-version compatibility strategy (inspired by trpc.bzl): +# 1) Do NOT load `@com_google_protobuf//:protobuf.bzl` and do NOT +# call `native.cc_proto_library` -- this side-steps the double +# incompatibility of newer protobuf removing the macro and older +# protobuf missing a complete `ProtoInfo` provider. +# 2) Do NOT hardcode any protobuf-repo-internal filegroup names +# (such as `well_known_protos` / `descriptor_proto_srcs`) -- the +# names of those filegroups have shifted between protobuf 3.x +# and 27.x+. +# 3) Propagate dependencies via Bazel's native `ProtoInfo` provider: +# callers pass `proto_library` targets through `proto_deps` +# (defaulting to `@com_google_protobuf//:descriptor_proto`, a +# `proto_library` whose label has been stable across PB versions), +# and this rule walks `transitive_sources` / `transitive_proto_path` +# to collect .proto source files and protoc `-I` paths -- fully +# decoupled from the PB version. +# 4) Among `brpc_proto_gen` targets themselves, dependencies are +# propagated via the custom `BrpcProtoInfo` provider declared +# below. +# +# Note on minimum Bazel version: this rule itself does not call any +# Bazel-version-specific API, but it still consumes `ProtoInfo` from +# `proto_library` targets (e.g. `descriptor_proto`) defined inside +# the protobuf repo. Protobuf >= 34 calls +# `ProtoInfo(option_deps = ..., extension_declarations = ...)` in its +# own `proto_library` implementation, and those fields are only +# accepted by Bazel >= 8. In other words, the minimum Bazel version +# brpc requires is whatever the bundled protobuf version requires -- +# we just don't add any extra requirement on top of that. + +BrpcProtoInfo = provider( + doc = "Carries transitive .proto sources and protoc -I flags between brpc_proto_gen targets.", + fields = { + "transitive_srcs": "depset of all transitive .proto Files.", + "transitive_imports": "depset of strings, all -I flags needed by protoc.", + }, +) + +def _resolve_include_dir(ctx): + """Compute this target's protoc include root (workspace-relative). + + Examples: + ctx.label.package = "" + include = "src" -> "src" + ctx.label.package = "test" + include = "" -> "test" + ctx.label.package = "" + include = "" -> "." + """ + pkg = ctx.label.package + inc = ctx.attr.include.rstrip("/") + if pkg and inc: + return pkg + "/" + inc + if pkg: + return pkg + if inc: + return inc + return "." + +def _proto_gen_impl(ctx): + srcs = ctx.files.srcs + include_dir = _resolve_include_dir(ctx) + bin_root = ctx.bin_dir.path + + # `-I` flags for this target itself: the source-tree root plus + # the corresponding bin-dir root. The bin-dir entry is needed + # when a transitive dep generates .proto files into bazel-bin + # (e.g. via a custom code generator). + own_imports = ["-I" + include_dir] + if include_dir == ".": + own_imports.append("-I" + bin_root) + else: + own_imports.append("-I" + bin_root + "/" + include_dir) + + # Collect transitive info from other `brpc_proto_gen` deps. + dep_srcs_list = [d[BrpcProtoInfo].transitive_srcs for d in ctx.attr.deps] + dep_imports_list = [d[BrpcProtoInfo].transitive_imports for d in ctx.attr.deps] + + # Collect native `proto_library` deps (well-known protos or + # external .proto libraries). Key design: .proto sources and + # `-I` paths are obtained via Bazel's native `ProtoInfo`, + # avoiding any reliance on protobuf-repo-internal filegroup + # names (descriptor_proto_srcs / well_known_protos / ...). + # `transitive_proto_path` already accounts for the + # `_virtual_imports` paths created by `strip_import_prefix`, so + # protoc can consume the paths directly. + # + # Important: `strip_import_prefix` causes .proto files to live at + # virtual paths under bazel-out//bin// + # (see trpc.bzl for prior art). For every `proto_dep` repo we + # therefore expose FOUR candidate `-I` paths to be safe: + # 1) -- source root (plain proto_library) + # 2) / -- virtual root after strip_import_prefix + # 3) /src -- fallback for older PB descriptor_proto without strip + # 4) //src -- same as #3, under bin-dir + # protoc only warns on non-existent `-I` paths, so this is harmless. + proto_dep_src_depsets = [] + proto_dep_imports = [] + extra_pb_root_imports = [] + # Belt-and-suspenders: also feed each `proto_dep`'s default outputs + # (i.e. the .proto files themselves) into `inputs`, in case the + # ProtoInfo's transitive_sources does not cover everything we need. + proto_dep_src_depsets.append(depset(direct = ctx.files.proto_deps)) + for pd in ctx.attr.proto_deps: + pi = pd[ProtoInfo] + proto_dep_src_depsets.append(pi.transitive_sources) + for path in pi.transitive_proto_path.to_list(): + proto_dep_imports.append("-I" + path) + wsroot = pd.label.workspace_root + if wsroot: + extra_pb_root_imports.append("-I" + wsroot) + extra_pb_root_imports.append("-I" + bin_root + "/" + wsroot) + extra_pb_root_imports.append("-I" + wsroot + "/src") + extra_pb_root_imports.append("-I" + bin_root + "/" + wsroot + "/src") + # Deduplicate the workspace-level `-I` entries so the same repo + # is not listed multiple times when several proto_deps share it. + proto_dep_imports.extend(depset(extra_pb_root_imports).to_list()) + + all_imports = depset( + direct = own_imports + proto_dep_imports, + transitive = dep_imports_list, + ) + + # Output files: every .proto produces a .pb.h and a .pb.cc. + # NB: the `path` argument of `ctx.actions.declare_file(path)` is + # *relative to the current package*, while `src.short_path` is + # *relative to the workspace root*. The two differ by the package + # prefix; we must strip that prefix before calling declare_file, + # otherwise the outputs would land at + # bazel-bin///... (one level too deep). + pkg = ctx.label.package + pkg_prefix = pkg + "/" if pkg else "" + outs = [] + for src in srcs: + if not src.short_path.endswith(".proto"): + fail("brpc_proto_gen srcs must be .proto, got: %s" % src.short_path) + + rel = src.short_path + if pkg_prefix and rel.startswith(pkg_prefix): + rel = rel[len(pkg_prefix):] + base = rel[:-len(".proto")] + outs.append(ctx.actions.declare_file(base + ".pb.h")) + outs.append(ctx.actions.declare_file(base + ".pb.cc")) + + # protoc's --cpp_out points at the include root under bin_root. + # After protoc organizes outputs by their import-relative path, + # the .pb.{h,cc} files land exactly where declare_file declared + # them above. + if include_dir == ".": + cpp_out_dir = bin_root + else: + cpp_out_dir = bin_root + "/" + include_dir + + args = ctx.actions.args() + args.add_all(all_imports.to_list()) + args.add("--cpp_out=" + cpp_out_dir) + args.add_all([s.path for s in srcs]) + + ctx.actions.run( + executable = ctx.executable.protoc, + arguments = [args], + inputs = depset( + direct = srcs, + transitive = dep_srcs_list + proto_dep_src_depsets, + ), + outputs = outs, + mnemonic = "BrpcProtoCompile", + progress_message = "BrpcProtoCompile %s" % ctx.label, + ) + + hdr_files = [f for f in outs if f.path.endswith(".pb.h")] + src_files = [f for f in outs if f.path.endswith(".pb.cc")] + + return [ + DefaultInfo(files = depset(outs)), + # Split outputs so the brpc_proto_library macro can route + # them to cc_library.hdrs vs cc_library.srcs separately. + OutputGroupInfo( + hdrs = depset(hdr_files), + srcs = depset(src_files), + ), + BrpcProtoInfo( + transitive_srcs = depset(direct = srcs, transitive = dep_srcs_list), + transitive_imports = all_imports, + ), + ] + +brpc_proto_gen = rule( + implementation = _proto_gen_impl, + attrs = { + "srcs": attr.label_list( + allow_files = [".proto"], + mandatory = True, + ), + # Other `brpc_proto_gen` targets; deps are propagated via the + # custom `BrpcProtoInfo` provider. + "deps": attr.label_list( + providers = [BrpcProtoInfo], + default = [], + ), + # The include root, relative to the current BUILD package + # (e.g. "src" for the brpc root BUILD). + "include": attr.string(default = ""), + "protoc": attr.label( + default = Label("@com_google_protobuf//:protoc"), + executable = True, + # `"host"` is the legacy spelling of `"exec"`. Modern + # Bazel (>= 6) prefers `"exec"`, but still accepts + # `"host"` as an alias through at least Bazel 8.x. We + # keep `"host"` here for the broad range of Bazel + # versions used to build brpc; switch to `"exec"` once + # `"host"` is finally removed (likely a future major + # Bazel release). + cfg = "host", + allow_files = True, + ), + # Native `proto_library` deps (well-known protos or external + # .proto libraries). .proto sources and -I paths are obtained + # automatically through Bazel's native `ProtoInfo`, fully + # decoupled from the protobuf version. + "proto_deps": attr.label_list( + providers = [ProtoInfo], + default = [], + ), + }, +) diff --git a/cmake/CMakeLists.download_gtest.in b/cmake/CMakeLists.download_gtest.in new file mode 100644 index 0000000..03ad5c8 --- /dev/null +++ b/cmake/CMakeLists.download_gtest.in @@ -0,0 +1,30 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +cmake_minimum_required(VERSION 3.16...3.28) + +project(googletest-download NONE) + +include(ExternalProject) +ExternalProject_Add(googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG release-1.12.0 + SOURCE_DIR "${PROJECT_BINARY_DIR}/googletest-src" + BINARY_DIR "${PROJECT_BINARY_DIR}/googletest-build" + CONFIGURE_COMMAND "" + BUILD_COMMAND "" + INSTALL_COMMAND "" + TEST_COMMAND "" +) diff --git a/cmake/CompileProto.cmake b/cmake/CompileProto.cmake new file mode 100644 index 0000000..d4e2440 --- /dev/null +++ b/cmake/CompileProto.cmake @@ -0,0 +1,34 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +function(compile_proto OUT_HDRS OUT_SRCS DESTDIR HDR_OUTPUT_DIR PROTO_DIR PROTO_FILES) + foreach(P ${PROTO_FILES}) + string(REPLACE .proto .pb.h HDR ${P}) + set(HDR_RELATIVE ${HDR}) + set(HDR ${DESTDIR}/${HDR}) + string(REPLACE .proto .pb.cc SRC ${P}) + set(SRC ${DESTDIR}/${SRC}) + list(APPEND HDRS ${HDR}) + list(APPEND SRCS ${SRC}) + add_custom_command( + OUTPUT ${HDR} ${SRC} + COMMAND ${PROTOBUF_PROTOC_EXECUTABLE} ${PROTOC_FLAGS} -I${PROTO_DIR} --cpp_out=${DESTDIR} ${PROTO_DIR}/${P} + COMMAND ${CMAKE_COMMAND} -E copy ${HDR} ${HDR_OUTPUT_DIR}/${HDR_RELATIVE} + DEPENDS ${PROTO_DIR}/${P} + ) + endforeach() + set(${OUT_HDRS} ${HDRS} PARENT_SCOPE) + set(${OUT_SRCS} ${SRCS} PARENT_SCOPE) +endfunction() diff --git a/cmake/FindBoringSSL.cmake b/cmake/FindBoringSSL.cmake new file mode 100644 index 0000000..b475f0a --- /dev/null +++ b/cmake/FindBoringSSL.cmake @@ -0,0 +1,77 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Usage of this module as follows: +# +# find_package(BORINGSSL) +# +# Variables used by this module, they can change the default behaviour and need +# to be set before calling find_package: +# +# BORINGSSL_ROOT_DIR Set this variable to the root installation of +# boringssl if the module has problems finding the +# proper installation path. +# +# Variables defined by this module: +# +# BORINGSSL_FOUND System has boringssl, include and library dirs found +# BORINGSSL_INCLUDE_DIR The boringssl include directories. +# BORINGSSL_LIBRARIES The boringssl libraries. +# BORINGSSL_CRYPTO_LIBRARY The boringssl crypto library. +# BORINGSSL_SSL_LIBRARY The boringssl ssl library. +# BORING_USE_STATIC_LIBS Whether use static library. + +if(BORING_USE_STATIC_LIBS) + set(_boringssl_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + if(MSVC) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else() + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif() +endif() + +find_path(BORINGSSL_ROOT_DIR + NAMES include/openssl/ssl.h include/openssl/base.h include/openssl/hkdf.h + HINTS ${BORINGSSL_ROOT_DIR}) + +find_path(BORINGSSL_INCLUDE_DIR + NAMES openssl/ssl.h openssl/base.h openssl/hkdf.h + HINTS ${BORINGSSL_ROOT_DIR}/include) + +find_library(BORINGSSL_SSL_LIBRARY + NAMES ssl + HINTS ${BORINGSSL_ROOT_DIR}/lib) + +find_library(BORINGSSL_CRYPTO_LIBRARY + NAMES crypto + HINTS ${BORINGSSL_ROOT_DIR}/lib) + +set(BORINGSSL_LIBRARIES ${BORINGSSL_SSL_LIBRARY} ${BORINGSSL_CRYPTO_LIBRARY} + CACHE STRING "BoringSSL SSL and crypto libraries" FORCE) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(BoringSSL DEFAULT_MSG + BORINGSSL_LIBRARIES + BORINGSSL_INCLUDE_DIR) + +mark_as_advanced( + BORINGSSL_ROOT_DIR + BORINGSSL_INCLUDE_DIR + BORINGSSL_LIBRARIES + BORINGSSL_CRYPTO_LIBRARY + BORINGSSL_SSL_LIBRARY +) + +set(CMAKE_FIND_LIBRARY_SUFFIXES ${_boringssl_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) diff --git a/cmake/FindGFLAGS.cmake b/cmake/FindGFLAGS.cmake new file mode 100644 index 0000000..dfad5fd --- /dev/null +++ b/cmake/FindGFLAGS.cmake @@ -0,0 +1,41 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +set(_gflags_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES}) + +find_path(GFLAGS_INCLUDE_PATH gflags/gflags.h) + +if (GFLAGS_STATIC) + if (WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .lib ${CMAKE_FIND_LIBRARY_SUFFIXES}) + else (WIN32) + set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) + endif (WIN32) +endif (GFLAGS_STATIC) +find_library(GFLAGS_LIBRARY NAMES gflags libgflags) +if(GFLAGS_INCLUDE_PATH AND GFLAGS_LIBRARY) + set(GFLAGS_FOUND TRUE) +endif(GFLAGS_INCLUDE_PATH AND GFLAGS_LIBRARY) +if(GFLAGS_FOUND) + if(NOT GFLAGS_FIND_QUIETLY) + message(STATUS "Found gflags: ${GFLAGS_LIBRARY}") + endif(NOT GFLAGS_FIND_QUIETLY) +else(GFLAGS_FOUND) + if(GFLAGS_FIND_REQUIRED) + message(FATAL_ERROR "Could not find gflags library.") + endif(GFLAGS_FIND_REQUIRED) +endif(GFLAGS_FOUND) + +set(CMAKE_FIND_LIBRARY_SUFFIXES ${_gflags_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES}) diff --git a/cmake/FindGperftools.cmake b/cmake/FindGperftools.cmake new file mode 100644 index 0000000..26f6de4 --- /dev/null +++ b/cmake/FindGperftools.cmake @@ -0,0 +1,66 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Tries to find Gperftools. +# +# Usage of this module as follows: +# +# find_package(Gperftools) +# +# Variables used by this module, they can change the default behaviour and need +# to be set before calling find_package: +# +# Gperftools_ROOT_DIR Set this variable to the root installation of +# Gperftools if the module has problems finding +# the proper installation path. +# +# Variables defined by this module: +# +# GPERFTOOLS_FOUND System has Gperftools libs/headers +# GPERFTOOLS_LIBRARIES The Gperftools libraries (tcmalloc & profiler) +# GPERFTOOLS_INCLUDE_DIR The location of Gperftools headers + +find_library(GPERFTOOLS_TCMALLOC + NAMES tcmalloc + HINTS ${Gperftools_ROOT_DIR}/lib) + +find_library(GPERFTOOLS_PROFILER + NAMES profiler + HINTS ${Gperftools_ROOT_DIR}/lib) + +find_library(GPERFTOOLS_TCMALLOC_AND_PROFILER + NAMES tcmalloc_and_profiler + HINTS ${Gperftools_ROOT_DIR}/lib) + +find_path(GPERFTOOLS_INCLUDE_DIR + NAMES gperftools/heap-profiler.h + HINTS ${Gperftools_ROOT_DIR}/include) + +set(GPERFTOOLS_LIBRARIES ${GPERFTOOLS_TCMALLOC_AND_PROFILER}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args( + Gperftools + DEFAULT_MSG + GPERFTOOLS_LIBRARIES + GPERFTOOLS_INCLUDE_DIR) + +mark_as_advanced( + Gperftools_ROOT_DIR + GPERFTOOLS_TCMALLOC + GPERFTOOLS_PROFILER + GPERFTOOLS_TCMALLOC_AND_PROFILER + GPERFTOOLS_LIBRARIES + GPERFTOOLS_INCLUDE_DIR) diff --git a/cmake/SetupGtest.cmake b/cmake/SetupGtest.cmake new file mode 100644 index 0000000..33e701c --- /dev/null +++ b/cmake/SetupGtest.cmake @@ -0,0 +1,39 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# Setup googletest +configure_file("${PROJECT_SOURCE_DIR}/cmake/CMakeLists.download_gtest.in" ${PROJECT_BINARY_DIR}/googletest-download/CMakeLists.txt) + +execute_process(COMMAND ${CMAKE_COMMAND} -G "${CMAKE_GENERATOR}" . + RESULT_VARIABLE result + WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/googletest-download +) +if(result) + message(FATAL_ERROR "CMake step for googletest failed: ${result}") +endif() + +execute_process(COMMAND ${CMAKE_COMMAND} --build . + RESULT_VARIABLE result + WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/googletest-download +) +if(result) + message(FATAL_ERROR "Build step for googletest failed: ${result}") +endif() + +set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + +add_subdirectory(${PROJECT_BINARY_DIR}/googletest-src + ${PROJECT_BINARY_DIR}/googletest-build + EXCLUDE_FROM_ALL) diff --git a/cmake/brpc.pc.in b/cmake/brpc.pc.in new file mode 100644 index 0000000..723dab4 --- /dev/null +++ b/cmake/brpc.pc.in @@ -0,0 +1,26 @@ +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +prefix=@CMAKE_INSTALL_PREFIX@ +exec_prefix=${prefix} +includedir=${prefix}/@CMAKE_INSTALL_INCLUDEDIR@ +libdir=${prefix}/@CMAKE_INSTALL_LIBDIR@ + +Name: brpc +Description: Apache bRPC is an Industrial-grade RPC framework using C++ Language, which is often used in high performance system such as Search, Storage, Machine learning, Advertisement, Recommendation etc. "bRPC" means "better RPC". +Version: @BRPC_VERSION@ +Cflags: -I${includedir} +Libs: -L${libdir}/ -lbrpc +Libs.private: @BRPC_PRIVATE_LIBS@ diff --git a/community/apache-package-validator.sh b/community/apache-package-validator.sh new file mode 100755 index 0000000..289b106 --- /dev/null +++ b/community/apache-package-validator.sh @@ -0,0 +1,94 @@ +#!/usr/bin/env bash +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +set -e + +g_package_link=${1} +g_package_keys=${2:-https://downloads.apache.org/brpc/KEYS} + +g_valid_package_link=' ' +g_valid_package_name=' ' +g_valid_package_checksum=' ' +g_valid_package_sig=' ' +g_valid_package_content=' ' +g_valid_package_license=' ' +g_valid_package_binary=' ' + +summary() { + cat < /dev/null 2>&1 + [[ -f RELEASE_VERSION ]] \ + && [[ $(cat RELEASE_VERSION) = "${ver}" ]] \ + && grep BRPC_VERSION CMakeLists.txt | grep -q ${ver} + ) && g_valid_package_content='x' + + ( + pushd ${package_name%.tar.gz} > /dev/null 2>&1 + [[ -f LICENSE && -f NOTICE ]] + ) && g_valid_package_license='x' + + local has_unexpected_binary= + for i in $(find ${package_name%.tar.gz} -type f); do + file ${i} | grep -v 'GIF\|JPEG\|PNG\|SVG\|PowerPoint\|Git\|JSON\|PEM\|empty\|text' && has_unexpected_binary=1 + done + [[ -z "${has_unexpected_binary}" ]] && g_valid_package_binary='x' +} + +trap on_exit EXIT + +validate_package diff --git a/community/cases.md b/community/cases.md new file mode 100644 index 0000000..70568be --- /dev/null +++ b/community/cases.md @@ -0,0 +1,130 @@ +# brpcçš„åº”ç”¨æ¡ˆä¾‹é›†åˆ + +## what is this +这里列出brpc在å„个ä¼ä¸šä¸­çš„è½åœ°åœºæ™¯ï¼ŒåŒ…括ä¼ä¸šå称,应用项目作用,集群规模和QPS统计,使用的版本信æ¯ç­‰ + +## Why this +列出å„ä¸ªæ¡ˆä¾‹ï¼Œä¸€æ¥æ–¹ä¾¿ç”¨æˆ·è¿›è¡Œå‚考,了解brpcå¯ä»¥ç”¨åœ¨å“ªäº›åœºæ™¯ä¸‹ï¼› +äºŒæ¥æ–¹ä¾¿ç¤¾åŒºå¼€å‘者统计brpc的版本,规模等情况 + +# Case List +## è½åœ°caseçš„sample (如果有多个场景,建议分开) +* å…¬å¸å称: xxxå…¬å¸ +* è½åœ°é¡¹ç›®ï¼š 例如app的个性化推è系统的预测æœåŠ¡ +* 集群规模: 例如100å° +* QPS: 例如峰值1000万, å‡å€¼100万 +* 使用版本: 例如社区版本0.9.7 +* ä¿¡æ¯æä¾›è€…ï¼šæŸæŸ + +## brpc在 百度的è½åœ°æƒ…况 +* å…¬å¸å称: 百度 +* è½åœ°é¡¹ç›®ï¼š 基础架构(分布å¼è®¡ç®—ã€å­˜å‚¨ã€æ•°æ®åº“ç­‰),业务系统(Feedã€å‡¤å·¢ã€åœ°å›¾ç­‰ï¼‰ +* 集群规模: 4000多个活跃模å—,600w以上实例 +* 使用版本: baidu内部版本 +* ä¿¡æ¯æä¾›è€…ï¼šwwbmmm + +## brpc在维沃的è½åœ°æƒ…况 +* å…¬å¸å称: 维沃(vivo) +* è½åœ°é¡¹ç›®ï¼š 在线推è系统 +* 使用版本: 社区版本0.9.7 +* ä¿¡æ¯æä¾›è€…ï¼šguodongxiaren + +## brpc在爱奇艺的è½åœ°æƒ…况 +* å…¬å¸å称: 爱奇艺(iqiyi) +* è½åœ°é¡¹ç›®ï¼š å¹¿å‘Šã€æŽ¨èã€æœç´¢ +* 使用版本: 基于社区版本定制 +* 集群规模: 3000+å°æœºå™¨(广告) +* ä¿¡æ¯æä¾›è€…ï¼šcdjingit + +## brpc在第四范å¼çš„è½åœ°æƒ…况 +* å…¬å¸å称: 第四范å¼ï¼ˆ4paradigm) +* è½åœ°é¡¹ç›®ï¼š é£ŽæŽ§ã€æŽ¨èã€æ™ºèƒ½è¿ç»´ç­‰ +* 使用版本: 基于社区版本定制 +* ä¿¡æ¯æä¾›è€…ï¼šdl239 + +## brpc在 å°çº¢ä¹¦çš„è½åœ°æƒ…况 +* å…¬å¸å称: å°çº¢ä¹¦ +* è½åœ°é¡¹ç›®ï¼š 推è系统,基础架构(存储等) +* 集群规模: 1w以上实例(推è) +* 使用版本: 基于社区版本定制 +* ä¿¡æ¯æä¾›è€…ï¼šlzfhust + +## brpc在作业帮的è½åœ°æƒ…况 +* å…¬å¸å称: 作业帮 +* è½åœ°é¡¹ç›®ï¼š 长连接IM,消æ¯åˆ†å‘系统 +* 集群规模: 2000+æ ¸ +* 使用版本: 基于0.9.7定制 +* ä¿¡æ¯æä¾›è€…ï¼šxdh0817 + +## brpcåœ¨æ¬¢èšæ—¶ä»£çš„è½åœ°æƒ…况 +* å…¬å¸å称: æ¬¢èšæ—¶ä»£ +* è½åœ°é¡¹ç›®ï¼š 推èã€ç›´æ’­ +* 使用版本: 基于社区版本定制 +* ä¿¡æ¯æä¾›è€…ï¼šchenBright + +## brpc 在 Apache Doris 中的应用 +* è½åœ°é¡¹ç›®ï¼šApache Doris +* 使用版本:1.2.0 +* 使用情况:Apache Doris 作为一款 MPP 分æžåž‹æ•°æ®åº“,其内部节点间使用 Apache Brpc ä½œä¸ºä¸»è¦ RPC 框架。Brpc 为 Doris æä¾›äº†ç¨³å®šæ˜“用的高性能通信机制。并且 BRPC æä¾›çš„ bthread,bvar 等基础库,以åŠå„ç§æ€§èƒ½è°ƒè¯•工具,也æžå¤§çš„æ–¹ä¾¿äº† Doris 的开å‘和调试工作。 +* ä¿¡æ¯æä¾›è€…ï¼šmorningman + +## brpc在BaikalDB中的应用 +* è½åœ°é¡¹ç›®ï¼šBaikalDB +* 使用版本:社区版0.9.7&百度内部stable +* 使用情况:BaikalDB是一款é¢å‘OLTP场景为主的NewSQLæ•°æ®åº“,其内部节点å‡é‡‡ç”¨brpc框架通信,实现数æ®å¤„ç†å’Œå¤åˆ¶ä»¥åŠé›†ç¾¤ç®¡ç†ï¼Œbrpc的高性能对OLTP场景的低延迟至关é‡è¦ï¼ŒåŒæ—¶brpc集æˆçš„æ€§èƒ½è°ƒä¼˜å·¥å…·å¯¹SQLæ€§èƒ½ä¼˜åŒ–ææ•ˆæ˜¾è‘—。 +* ä¿¡æ¯æä¾›è€…ï¼štullyliu + +## brpc在数美科技的è½åœ°æƒ…况 +* å…¬å¸å称: 数美科技(nextdata) +* è½åœ°é¡¹ç›®ï¼š æ™ºèƒ½é£ŽæŽ§ä¸šåŠ¡ï¼ˆæ¨¡åž‹ç‰¹å¾æœåŠ¡ã€è§„则引擎) +* 使用版本: 1.0.0 +* ä¿¡æ¯æä¾›è€…ï¼šday253 + +## brpc在信网信æ¯çš„è½åœ°æƒ…况 +* å…¬å¸å称:信网(eyou.com) +* è½åœ°é¡¹ç›®ï¼šåˆ†å¸ƒå¼å…ƒæ•°æ®å­˜å‚¨å¼•擎æœåŠ¡ +* 使用版本:1.3.0 +* 集群规模:10å°+ +* ä¿¡æ¯æä¾›è€…ï¼šhaihuju + +## brpc在滴滴的è½åœ°æƒ…况 +* å…¬å¸å称:滴滴(www.didiglobal.com) +* è½åœ°é¡¹ç›®ï¼šåœ°å›¾ç­‰ä¸šåŠ¡ +* 使用版本:0.9.3 +* ä¿¡æ¯æä¾›è€…ï¼šNIGHTFIGHTING + +## brpc在网易的实现 +* å…¬å¸å称:网易 +* 实施项目:高性能分布å¼å­˜å‚¨ç³»ç»ŸCurve。 +* 集群规模:å•个集群30,000个节点 +* 使用版本:1.3.0 +* ä¿¡æ¯æä¾›è€…ï¼šDivyansh200102 + +## brpc在æœç‹—的实现 +* å…¬å¸å称:æœç‹— +* 实现项目:SRPC是æœç‹—几乎所有在线æœåŠ¡éƒ½ä½¿ç”¨çš„ä¼ä¸šçº§RPC系统之一 + 主è¦åŠŸèƒ½åŒ…æ‹¬æ”¯æŒ bRPC ç­‰ RPC å议。 +* IDL:PB +* 通讯方å¼ï¼šTCP +* 网络数æ®ï¼šäºŒè¿›åˆ¶ +* ä¿¡æ¯æä¾›è€…ï¼šDivyansh20010 + +## brpc在B站的实现 +* å…¬å¸å称:哔哩哔哩 +* 实现项目:支æŒbilibiliåœ¨èŽ·å–æœåŠ¡å™¨èŠ‚ç‚¹æ—¶å‘çŽ°å‘½åæœåŠ¡çš„zone,支æŒbilibiliå‘现æœåŠ¡ +* 使用版本:0.9.7,0.9.6 +* ä¿¡æ¯æä¾›è€…ï¼šDivyansh200102 + +## brpc在腾讯的实现 +* å…¬å¸å称:腾讯 +* 已实现的项目:Dorisã€StarRocks是åŽç«¯çš„BRPC端å£ï¼Œç”¨äºŽåŽç«¯å®žä¾‹ä¹‹é—´çš„通信。 +* 端å£å·ï¼š8060 +* ä¿¡æ¯æä¾›è€…ï¼šDivyansh200102 + +## brpc在阿里巴巴的实现 +* å…¬å¸å称:阿里巴巴 +* 已实现项目:阿里云,bRPC端å£ç”¨äºŽä¸Žå¦ä¸€ä¸ªBE通信。 +* 端å£å称:brpc_port +* 默认端å£å·ï¼š8060 +* 通讯方å‘:FE <--> BE,BE <--> BE +* ä¿¡æ¯æä¾›è€…ï¼šDivyansh200102 \ No newline at end of file diff --git a/community/logo-bRPC.svg b/community/logo-bRPC.svg new file mode 100644 index 0000000..bd7c97d --- /dev/null +++ b/community/logo-bRPC.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/community/newcommitter_cn.md b/community/newcommitter_cn.md new file mode 100644 index 0000000..34bbf3e --- /dev/null +++ b/community/newcommitter_cn.md @@ -0,0 +1,68 @@ +# 这里记录å‘展Committer å’Œ PPMCæˆå‘˜çš„æµç¨‹å’Œå‚è€ƒç½‘ç«™ä¿¡æ¯ + +## 1. 如何å‘展committer + +### å‰ç½®æ¡ä»¶ +1. 贡献者commitæ•°é‡è¾¾åˆ°10个以上 +2. è´¡çŒ®è€…ä¸ªäººæœ‰æ„æ„¿æŽ¥å—邀请æˆä¸ºcommitter +3. 贡献者订阅dev@brpc.apache.org,并å‘邮件介ç»è‡ªå·± + +### æˆä¸ºcommitter的路程 +1. æå者在private@brpc中å‘起讨论和投票,投票通过å³OK (最少3+1, +1 > -1),[邮件模版](https://community.apache.org/newcommitter.html#committer-vote-template) +2. æå者å‘é€close vote邮件给private@brpc, 标题å¯ä»¥ä¸ºsubject [RESULT][VOTE],[邮件模版](https://community.apache.org/newcommitter.html#close-vote) +3. æå者给被æå者å‘invite letter([邮件模æ¿](https://community.apache.org/newcommitter.html#committer-invite-template)),并得到回å¤åŽå†æç¤ºä»–æäº¤ICLA([邮件模æ¿](https://community.apache.org/newcommitter.html#committer-accept-template)) +4. 被æå者填写[CLA](https://www.apache.org/licenses/contributor-agreements.html), 个人贡献者需è¦ä¸‹è½½[ICLA](https://www.apache.org/licenses/icla.pdf)填写个人信æ¯å¹¶ç­¾å,å‘é€ç”µå­ç‰ˆç»™ secretary@apache.org。(注æ„:1. ICLA需è¦å¡«å†™ä¿¡æ¯å®Œå…¨ï¼ŒåŒ…括邮寄地å€å’Œç­¾å,å¦åˆ™ä¼šè¢«ASF的秘书打回, 2. ICLA䏭嫿œ‰ä¸ªäººä¿¡æ¯ï¼Œæ‰€ä»¥åº”该å•å‘ç»™secretary@apache.org,ä¸åº”è¯¥åŒæ—¶æŠ„é€PMC或其他邮件组 3. ICLA中的preffered Apache idå’Œnotify project虽然是optional,但最好填上,这样秘书会帮新commiter申请好apache id,å¦åˆ™å°±éœ€è¦PMC chair或者ASF member去申请)个人信æ¯å¡«å†™é¡¹ï¼ˆé™¤ç­¾å外)å¯ä»¥ä½¿ç”¨ PDF 阅读器或æµè§ˆå™¨å¡«å†™ï¼Œå¡«å†™åŽä¿å­˜è¿›è¡Œç­¾åã€‚ç­¾åæ–¹å¼æ”¯æŒï¼š + - æ‰“å° è¯¥pdf 文件,手工填写表å•(姓åã€é‚®ç®±ã€é‚®å¯„地å€ï¼‰ï¼Œç„¶åŽæ‰‹å†™ç­¾åï¼Œæœ€åŽæ‰«æä¸ºç”µå­ç‰ˆï¼› + - ä½¿ç”¨æ”¯æŒæ‰‹å†™çš„设备进行电å­ç­¾åï¼› + - 使用 `gpg` 进行电å­ç­¾å,å³å¯¹å¡«å†™å¥½ä¸ªäººåŸºæœ¬ä¿¡æ¯çš„ pdf 文件进行æ“ä½œï¼ˆéœ€è¦æå‰ç”Ÿæˆä¸Žç™»è®°é‚®ç®±åŒ¹é…的公钥/密钥对):`gpg --armor --detach-sign icla.pdf`ï¼› + - 使用 `DocuSign` 进行签åï¼› + +5. æå者å‘é€announce邮件到dev@brpc.apache.org + + +### 如何赋予committer在github上的æƒé™ + +1. 加为committer +https://whimsy.apache.org/roster/ppmc/brpc + +2. 让他设置github id +https://id.apache.org/ + +3. 让他访问该网å€ï¼ŒèŽ·å¾—githubçš„æƒé™ +https://gitbox.apache.org/setup/ + + +### Apache 官网new committer相关的文档 + +* https://community.apache.org/newcommitter.html + +* https://infra.apache.org/new-committers-guide.html + +* https://juejin.cn/post/6844903788982042632 + +### Suggested steps from secretary@apache.org +Please do these things: + +1. Hold the discussion and vote on your private@ list. This avoids any issues related to personnel, which should remain private. +2. If the vote is successful, announce the result to the private@ list with a new email thread with subject [RESULT][VOTE]. This makes it easier for secretary to find the result of the vote in order to request the account at the time of the filing of the ICLA. +3. Only if the candidate accepts committership, announce the new committer on your dev@ list. + +Doing these things will make everyone's job easier. + + + +## 2. 如何把committerå˜æˆä¸ºPPMC + +### æµç¨‹å‚考:Apache官网文档 +* https://incubator.apache.org/guides/ppmc.html#voting_in_a_new_ppmc_member +* https://community.apache.org/newcommitter.html +* https://incubator.apache.org/guides/ppmc.html#podling_project_management_committee_ppmc + +### 实际æµç¨‹ +1. 在private@brpc中å‘起讨论,如果没有å对,则继续 +2. 在private@brpc中å‘起投票 +3. 在private@brpc中å‘é‚®ä»¶ï¼Œç»“æŸæŠ•ç¥¨ï¼Œå¹¶é€šçŸ¥private@incubator.apache.org +4. 在private@brpc中和dev中announce new PPMC +5. 设定他的æƒé™ï¼Œé€šè¿‡è®¿é—®https://whimsy.apache.org/roster/ppmc/brpc +6. 帮他订阅private邮件组,å‚è§https://whimsy.apache.org/committers/moderationhelper.cgi + diff --git a/community/newcommitter_en.md b/community/newcommitter_en.md new file mode 100644 index 0000000..2e99334 --- /dev/null +++ b/community/newcommitter_en.md @@ -0,0 +1,60 @@ +# Here is the doc for the process and reference website information of developing committee and PPMC members. + + +## 1. How to develop committers + +### Preconditions + +1. More than 10 commits from the contributor +2. Contributor is willing to accept the invitation to become a committer +3. Contributor subscribe to dev@brpc.apache.org and introduce himself by sending an email to dev@apache.org + +### The journey to become a committer + +1. The nominator sends an email to private@brpc to initiate discussion and begins to voting. If the voting is passed, it is OK (at least 3 +1, +1 >- 1). (See the [Vote email template](https://community.apache.org/newcommitter.html#committer-vote-template)) +2. The nominator sends a close vote email to private@brpc, the title can be subject [RESULT] [VOTE]. (See the [close email template](https://community.apache.org/newcommitter.html#close-vote)) +3. The nominator sends an invitation letter to the nominee ([email template](https://community.apache.org/newcommitter.html#committer-invite-template)) and prompts him to submit ICLA after receiving a reply ([email template](https://community.apache.org/newcommitter.html#committer-accept-template)) +4. The nominee fills in [ICLA](https://www.apache.org/licenses/contributor-agreements.html), individual contributors need to download [ICLA](https://www.apache.org/licenses/icla.pdf) Fill in personal information and sign, and send the electronic version to secretary@apache.org 。 (Note: 1. ICLA needs to fill in complete information, including mailing address and signature, otherwise it will be returned by ASF's secretary. 2. ICLA contains personal information, it should be send to secretary@apache.org only, not to the PMC or other mail list) The personal information entry (except for the signature) can be filled in with a PDF reader or browser, and then saved for signature. Signature method support: + * Print pdf documents and scan them into electronic version after handwritten signature; + * Electronic signature using devices that support handwriting; + * Use 'gpg' for electronic signature, that is, to operate the pdf file filled with personal basic information (a public key/key pair matching the registered mailbox needs to be generated in advance): 'gpg -- armor -- detach sign icla. pdf'; + * Use 'DocuSign' to sign; +5. The nominator sends an announcement email to dev@brpc.apache.org + +### How to grant a committer permission on github + +1. Add as committer ([https://whimsy.apache.org/roster/ppmc/brpc](https://whimsy.apache.org/roster/ppmc/brpc)) +2. Let him set github id ([https://id.apache.org/](https://id.apache.org/)) +3. Let him visit the website and get github permission([https://gitbox.apache.org/setup/](https://id.apache.org/)) + +### Documents related to the new committer on the official Apache website + +* [https://community.apache.org/newcommitter.html](https://community.apache.org/newcommitter.html) +* [https://infra.apache.org/new-committers-guide.html](https://infra.apache.org/new-committers-guide.html) +* [https://juejin.cn/post/6844903788982042632](https://juejin.cn/post/6844903788982042632) + +### Suggested steps from secretary@apache.org + +Please do these things: +1. Hold the discussion and vote on your private@ list. This avoids any issues related to personnel, which should remain private. +2. If the vote is successful, announce the result to the private@ list with a new email thread with subject [RESULT][VOTE]. This makes it easier for secretary to find the result of the vote in order to request the account at the time of the filing of the ICLA. +3. Only if the candidate accepts committership, announce the new committer on your dev@ list. + +Doing these things will make everyone's job easier. + +## 2. How to upgrade a committer into a PPMC + +### Process reference: Apache official website document + +* https://incubator.apache.org/guides/ppmc.html#voting_in_a_new_ppmc_member +* https://community.apache.org/newcommitter.html +* https://incubator.apache.org/guides/ppmc.html#podling_project_management_committee_ppmc + +### Actual process + +1. Initiate discussion in the private@brpc . If there is no objection, continue +2. Open a Vote in private@brpc +3. Send an email to close the voting and notify private@incubator.apache.org +4. Announce new PPMC On private@brpc +5. Set his authority by visiting https://whimsy.apache.org/roster/ppmc/brpc +6. Help him subscribe to a private email group. See https://whimsy.apache.org/committers/moderationhelper.cgi diff --git a/community/oncall.md b/community/oncall.md new file mode 100644 index 0000000..85abb02 --- /dev/null +++ b/community/oncall.md @@ -0,0 +1,71 @@ +# 值周工程师的èŒè´£å¦‚下 + +## 1. æ¯å¤©æŸ¥çœ‹github上brpc项目待处ç†çš„Pull Requestå’ŒIssueåˆ—è¡¨ï¼Œè´Ÿè´£é—®é¢˜çš„å¤„ç† + * 包括标记issue,回å¤issue,关闭issue等; + * 判断issueæ˜¯å¦æ˜¯é•¿æœŸIssue,如果是则标记为Pending + * 判断Issue的类型,例如bug,enhancement, discussionç­‰ + * 把issue分é…到熟悉该模å—的贡献者(å¯åœ¨å¾®ä¿¡ç¾¤é‡Œè¯¢é—®è°æ¥è´Ÿè´£) + +## 2. 轮值时间为一周 + * å³ä»Žå‘¨æ—¥æ—©ä¸Šåˆ°ä¸‹å‘¨å…­æ™šä¸Š + +## 3. 轮值结æŸéœ€è¦ + * 编写值周report,并å‘é€åˆ°dev@brpc.apache.org邮件群中 + * æé†’下一ä½è½®å€¼åŒå­¦ + +## 4. 值周顺åºå¦‚下 + * 朱佳顺 @zyearn + * æŽç£Š @lorinlee + * 王伟冰 @wwbmmm + * 蔡é“è¿› @cdjingit + * 何磊 @TousakaRin + * 刘帅 @serverglen + * 胡希国 @Huixxi + * æ¨ç«‹æ˜Ž @yanglimingcn + +## 5. 值周记录如下 + +| æ—¶é—´(月/æ—¥/年) | 值周人 | 值周report| +| ---- | ---- | --- | +| 06/21/2021 to 06/27/2021 | æŽç£Š | https://lists.apache.org/thread/czolsqo80jzsytqc7dp37knqwxnkymx1 +| 06/28/2021 to 07/04/2021 | 蔡é“è¿› | https://lists.apache.org/thread/c05fcjdjh7473ho1ylyl98mxscmnkbv0 +| 07/05/2021 - 07/12/2021 | 何磊 | https://lists.apache.org/thread/hz1vn7358v5fslglg2cl4g8x0wtxy4lv +| 08/16/2021 - 08/22/2021 | 朱佳顺 | https://lists.apache.org/thread/g36jtjc3v75lfoc7m3ynzplgbqlsjjrd +| 08/23/2021 - 08/29/2021 | æŽç£Š | https://lists.apache.org/thread/2098ndgdy6fs2b1s8tywpmz47n5swh29 +| 08/30/2021 - 09/05/2021 | 蔡é“è¿› | https://lists.apache.org/thread/wjxdomg7fp75dc0n0rmh37bkwd8w7myv +| 09/06/2021 - 09/12/2021 | 何磊 | https://lists.apache.org/thread/cwjtocpjbqjgndog53rqw8gs6f9c0rmo +| 09/20/2021 - 09/26/2021 | æŽç£Š | https://lists.apache.org/thread/p779y43hogv7ftckc4cqx006gv9j65r8 +| 09/27/2021 - 10/03/2021 | 蔡é“è¿› | https://lists.apache.org/thread/ync12fx2dwjb2l3p4yck0kodmkgzz7wd +| 12/13/2021 - 12/19/2021 | 蔡é“è¿› | https://lists.apache.org/thread/mvclsy79859mrbdso1xzm6y7yz3lg6w0 +| 01/24/2022 - 02/06/2022 | 王伟冰 | https://lists.apache.org/thread/ttgqnw4hfw0qnb7swvnn2kxb5b9hkdbo +| 04/10/2022 - 04/16/2022 | 刘帅 | https://lists.apache.org/thread/0l67lqnw0l6rgfwkvhrc168prwr7fp60 +| 04/17/2022 - 04/24/2022 | 朱佳顺| https://lists.apache.org/thread/xwkpyonndgtp8tq4c9v4yfowqx7fg9gl +| 04/25/2022 - 05/01/2022 | æŽç£Š | https://lists.apache.org/thread/cx7t1glptr7x7posxstsb1691h4m4mbl +| 05/02/2022 - 05/15/2022 | 王伟冰 | https://lists.apache.org/thread/tgyqkhh6fqgyzcn5d56kt46hk978wogx +| 06/06/2022 - 06/12/2022 | 何磊 | https://lists.apache.org/thread/s19p7ygnsj0bknfjvrh0wlf1mbgstxbk +| 06/13/2022 - 06/19/2022 | 刘帅 | https://lists.apache.org/thread/tvqjyz6rh7jb1zcclx0lh6zrcsf9ykxr +| 07/25/2022 - 07/31/2022 | 王伟冰 | https://lists.apache.org/thread/83scwkkfxrp6kkkoltbrn1fthfy3w0qz +| 08/08/2022 - 08/14/2022 | 何磊 | https://lists.apache.org/thread/jj16rzfh34yrt6o0xqfdz9wtdtzxzswq +| 08/15/2022 - 08/21/2022 | 刘帅 | https://lists.apache.org/thread/jp69sm7c8fs3dkdd828qk0fsojqwwz6h +| 09/05/2022 - 09/12/2022 | 王伟冰 | https://lists.apache.org/thread/4jjk2hxw9s2wskccclqb8fvpqxqffnlb +| 09/12/2022 - 09/18/2022 | 蔡é“è¿›| https://lists.apache.org/thread/8mo7zl0l2yrd8tp4v3kx86rnlyfk6wz4 +| 09/19/2022 - 09/25/2022 | 何磊 | https://lists.apache.org/thread/qlkr7cmwow3ob47dt80tpx0zrgzg7bdm +| 09/26/2022 - 10/09/2022 | 刘帅 | https://lists.apache.org/thread/b0lwr8wyflmhqlnf0kkh1j30tgt5qw54 +| 10/10/2022 - 10/16/2022 | 朱佳顺 | https://lists.apache.org/thread/y8sgbprxt21j6r0812dlftosfov6pbgk +| 10/17/2022 - 10/23/2022 | æŽç£Š | https://lists.apache.org/thread/qn2270p9qsrglkh7oy013ts1zk5rlhwx +| 10/24/2022 - 10/30/2022 | 王伟冰 | https://lists.apache.org/thread/k74155opmwmopgtsqo6p79z9q0f0sv8j +| 10/31/2022 - 11/06/2022 | 蔡é“è¿› | https://lists.apache.org/thread/t4z49yt7ymp4vr5sms0m4cpoo94db4oz +| 11/14/2022 - 11/20/2022 | 刘帅 | https://lists.apache.org/thread/nq50fp79ox3follc7gxp814cvcqnmqzz +| 11/21/2022 - 11/27/2022 | 朱佳顺 | https://lists.apache.org/thread/57kzov5g3j4vv6l2zcyw0msm36qglc8k +| 11/28/2022 - 12/04/2022 | æŽç£Š | https://lists.apache.org/thread/92hbzcd662slj75v3ndjf69o1dgsnd6o +| 12/05/2022 - 12/11/2022 | 王伟冰 | https://lists.apache.org/thread/99o15h9hk5dd73jv8wyp49l8mbw0j611 +| 12/19/2022 - 12/25/2022 | 何磊 | https://lists.apache.org/thread/g1stjjo1mc9ds47do6gosrw5k6wwb9mj +| 12/26/2022 - 01/01/2023 | 刘帅 | https://lists.apache.org/thread/3xw1gkobqmvr6oo375x3gsfcqvg80n23 +| 01/02/2023 - 01/08/2023 | 朱佳顺 | https://lists.apache.org/thread/sm4f209c8ltols04gpmzo386b02dyc9s +| 01/09/2023 - 01/15/2023 | æŽç£Š | https://lists.apache.org/thread/fydjz4h88omsrb7fzw65wl64kh5r520s +| 01/16/2023 - 01/29/2023 | 王伟冰 | https://lists.apache.org/thread/k5bb4pn2v23dksmwpwqphzlc4bd92ndr +| 01/30/2023 - 02/05/2023 | 蔡é“è¿› | https://lists.apache.org/thread/4scwpdh163l92czm5pvc7ox78n44mrn4 +| 02/13/2023 - 02/19/2023 | 刘帅 | https://lists.apache.org/thread/jwynp880hdhcfkqwq7thsm05y037wzy5 +| 02/27/2023 - 03/05/2023 | æŽç£Š | https://lists.apache.org/thread/94ndftsvooydfnn8hdddv294pp0tfvdm +| 03/06/2023 - 03/12/2023 | 王伟冰 | https://lists.apache.org/thread/bv3qw5w8gj9xs576fplxqhktopkbk7md +| 03/27/2023 - 04/03/2023 | 刘帅 | https://lists.apache.org/thread/fk37cn8r5pd1y10vjvzvkl211b67vn4q diff --git a/community/release_cn.md b/community/release_cn.md new file mode 100644 index 0000000..ee24c1b --- /dev/null +++ b/community/release_cn.md @@ -0,0 +1,592 @@ +# brpc å‘布 apache release 版本æµç¨‹ step by step + +## 准备工作 + +### 1. 确认 Release Notes + +该阶段会æŒç»­ä¸€å‘¨å·¦å³ï¼Œä¸»è¦å·¥ä½œåŒ…å«ï¼š +- 确认 Release Notes ä¸­æ˜¯å¦æœ‰é—æ¼é¡¹ä»¥åŠå„项的æè¿°æ˜¯å¦å‡†ç¡®ã€æ°å½“ï¼› +- åˆå…¥è®¡åˆ’å‘å¸ƒä½†æœªåŠæ—¶å¤„ç†çš„ PR。 + +Release Notes éœ€è¦æä¾›ä¸­è‹±ä¸¤ä¸ªç‰ˆæœ¬ï¼Œç”¨äºŽä¸åŒçš„对外å‘布渠é“。 + +模æ¿å¦‚下: +``` +[Release Notes] + +Feature: +- new feature 1; +- new feature 2; +- ... + +Bugfix: +- fix bug 1; +- fix bug 2; +- ... + +Enhancement: +- improve blabla + +Other: +- ... +``` + +### 2. 设置 GPG(éžé¦–次å‘版的åŒå­¦è¯·ç›´æŽ¥è·³è¿‡æ­¤æ­¥éª¤ï¼‰ + +#### 1. 安装 GPG + +通常 Linux å‘è¡Œç‰ˆä¸­ä¼šé›†æˆ `GnuPG` 工具,OSX å¯ä»¥ä½¿ç”¨ [`brew`](https://brew.sh/) 安装。 +```bash +brew install gnupg +``` + +也å¯ä»¥ç›´æŽ¥åœ¨[GnuPG 官网](https://www.gnupg.org/download/index.html)下载相应的安装包。`GnuPG` çš„ 1.x 版本和 2.x 版本的命令有细微差别,下é¢ä»¥ `GnuPG-2.3.1` 版本(OSX)为例进行说明。 + +安装完æˆåŽï¼Œæ‰§è¡Œä»¥ä¸‹å‘½ä»¤æŸ¥çœ‹ç‰ˆæœ¬å·ã€‚ +```bash +gpg --version +``` + +#### 2. 创建 key + +安装完æˆåŽï¼Œæ‰§è¡Œä»¥ä¸‹å‘½ä»¤åˆ›å»º key。 + +```bash +gpg --full-gen-key +``` + +æ ¹æ®æç¤ºå®Œæˆåˆ›å»º key,注æ„邮箱è¦ä½¿ç”¨ Apache 邮件地å€ï¼Œ`Real Name` 使用姓å Pinyinã€Apache ID 或 GitHub ID ç­‰å‡å¯ï¼š +``` +gpg (GnuPG) 2.3.1; Copyright (C) 2021 Free Software Foundation, Inc. +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Please select what kind of key you want: + (1) RSA and RSA + (2) DSA and Elgamal + (3) DSA (sign only) + (4) RSA (sign only) + (9) ECC (sign and encrypt) *default* + (10) ECC (sign only) + (14) Existing key from card +Your selection? 1 +RSA keys may be between 1024 and 4096 bits long. +What keysize do you want? (3072) 4096 +Requested keysize is 4096 bits +Please specify how long the key should be valid. + 0 = key does not expire + = key expires in n days + w = key expires in n weeks + m = key expires in n months + y = key expires in n years +Key is valid for? (0) 0 +Key does not expire at all +Is this correct? (y/N) y + +GnuPG needs to construct a user ID to identify your key. + +Real name: LorinLee +Email address: lorinlee@apache.org +Comment: lorinlee's key +You selected this USER-ID: + "LorinLee (lorinlee's key) " + +Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O +You need a Passphrase to protect your secret key. # è¾“å…¥å¯†ç  + +We need to generate a lot of random bytes. It is a good idea to perform +some other action (type on the keyboard, move the mouse, utilize the +disks) during the prime generation; this gives the random number +generator a better chance to gain enough entropy. +gpg: key 92E18A11B6585834 marked as ultimately trusted +gpg: revocation certificate stored as '/Users/lilei/.gnupg/openpgp-revocs.d/C30F211F071894258497F46392E18A11B6585834.rev' +public and secret key created and signed. + +pub rsa4096 2021-10-17 [SC] + C30F211F071894258497F46392E18A11B6585834 +uid LorinLee (lorinlee's key) +sub rsa4096 2021-10-17 [E] +``` + +#### 3. 查看生æˆçš„ key + +```bash +gpg --list-keys +``` + +执行结果: + +``` +gpg: checking the trustdb +gpg: marginals needed: 3 completes needed: 1 trust model: pgp +gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u +/Users/lilei/.gnupg/pubring.kbx +---------------------------------- +pub rsa4096 2021-10-17 [SC] + C30F211F071894258497F46392E18A11B6585834 +uid [ultimate] LorinLee (lorinlee's key) +sub rsa4096 2021-10-17 [E] +``` + +其中 `C30F211F071894258497F46392E18A11B6585834` 为公钥ID。 + +#### 4. 将公钥公布到æœåС噍 + +命令如下: + +```bash +gpg --keyserver hkps://pgp.mit.edu --send-key C30F211F071894258497F46392E18A11B6585834 +``` +keyserver 也å¯ä»¥ç”¨ `hkps://keys.openpgp.org` 或 `hkps://keyserver.ubuntu.com`,Web 上都æä¾›äº†æ¯”较方便的查询接å£ã€‚ + +#### 5. ç”Ÿæˆ fingerprint 并上传到 Apache 用户信æ¯ä¸­ + +由于公钥æœåŠ¡å™¨æ²¡æœ‰æ£€æŸ¥æœºåˆ¶ï¼Œä»»ä½•äººéƒ½å¯ä»¥ç”¨ä½ çš„å义上传公钥,所以没有办法ä¿è¯æœåŠ¡å™¨ä¸Šçš„å…¬é’¥çš„å¯é æ€§ã€‚通常,你å¯ä»¥åœ¨â½¹ç«™ä¸Šå…¬å¸ƒä¸€ä¸ªå…¬é’¥æŒ‡çº¹ï¼Œè®©å…¶ä»–⼈核对下载到的公钥是å¦ä¸ºçœŸã€‚fingerprint 傿•°ç”Ÿæˆå…¬é’¥æŒ‡çº¹ã€‚ + +执行如下命令查看 fingerprint: +``` +gpg --fingerprint lorinlee(用户ID) +``` + +输出如下: +``` +/Users/lilei/.gnupg/pubring.kbx +---------------------------------- +pub rsa4096 2021-10-17 [SC] + C30F 211F 0718 9425 8497 F463 92E1 8A11 B658 5834 +uid [ultimate] LorinLee (lorinlee's key) +sub rsa4096 2021-10-17 [E] +``` + +将上é¢çš„ fingerprint `C30F 211F 0718 9425 8497 F463 92E1 8A11 B658 5834` 粘贴到⾃己 Apache â½¤æˆ·ä¿¡æ¯ https://id.apache.org çš„ `OpenPGP Public Key Primary Fingerprint:` 字段中。 + +## 制作å‘布包 + +### 1. 拉出å‘版分支 + +如果是å‘布新的 2 ä½ç‰ˆæœ¬ï¼Œå¦‚ `1.0.0`,则需è¦ä»Ž master 拉出新的分支 `release-1.0`。 + +如果是在已有的 2 ä½ç‰ˆæœ¬ä¸Šå‘布新的 3 ä½ç‰ˆæœ¬ï¼Œå¦‚ `1.0.1` 版本,则åªéœ€è¦åœ¨å·²æœ‰çš„ `release-1.0` 分支上修改加上è¦å‘布的内容。 + +å‘版过程中的æ“作都在 release 分支(如:`release-1.0`)上æ“作,如果å‘版过程å‘çŽ°ä»£ç æœ‰é—®é¢˜éœ€è¦ä¿®æ”¹ï¼Œä¹Ÿåœ¨è¯¥åˆ†æ”¯ä¸Šè¿›è¡Œä¿®æ”¹ã€‚å‘版完æˆåŽï¼Œå°†è¯¥åˆ†æ”¯åˆå›ž master 分支。 + +### 2. æ›´æ–° `NOTICE` 文件 + +检查 `NOTICE` 文件中的年份是å¦éœ€è¦æ›´æ–°ï¼Œé€šå¸¸åœ¨å¹´åˆå‘版时需é‡ç‚¹å…³æ³¨ã€‚ + +### 3. 编辑版本å·ç›¸å…³æ–‡ä»¶ + +#### æ›´æ–° `RELEASE_VERSION` 文件 + +编辑项目根目录下 `RELEASE_VERSION` 文件,更新版本å·ï¼Œå¹¶æäº¤è‡³ä»£ç ä»“库,本文以 `1.0.0` 版本为例,文件内容为: + +``` +1.0.0 +``` + +#### æ›´æ–° `CMakeLists.txt` 文件 +编辑项目根目录下 `CMakeLists.txt` 文件,更新版本å·ï¼Œå¹¶æäº¤è‡³ä»£ç ä»“库,本文以 `1.0.0` 版本为例,修改 `BRPC_VERSION` 为: + +``` +set(BRPC_VERSION 1.0.0) +``` + +#### æ›´æ–° `package/rpm/brpc.spec` 文件 + +编辑项目根目录下 `package/rpm/brpc.spec` 文件,更新版本å·ï¼Œå¹¶æäº¤è‡³ä»£ç ä»“库,本文以 `1.0.0` 版本为例,修改 `Version` 为: + +``` +Version: 1.0.0 +``` + +#### æ›´æ–° `MODULE.bazel` 文件 + +编辑项目根目录下 `MODULE.bazel` 文件,更新版本å·ï¼Œå¹¶æäº¤è‡³ä»£ç ä»“库,本文以 `1.0.0` 版本为例,修改 `version` 为: + +``` +# in MODULE.bazel +module( + ... + version = '1.0.0', + ... +) +``` + +### 4. 创建å‘布 tag +```bash +export BRPCVERSION=1.0.0 +export BRPCBRANCH=1.0 +export BRPCUSERNAME=lorinlee +``` +拉å–å‘å¸ƒåˆ†æ”¯ï¼Œåˆ›å»ºå¹¶æŽ¨é€ tag +```bash +git clone -b release-$BRPCBRANCH git@github.com:apache/brpc.git ~/brpc + +cd ~/brpc + +git tag -a $BRPCVERSION -m "release $BRPCVERSION" + +git push origin --tags +``` + +### 5. 打包å‘布包 + +```bash +git archive --format=tar $BRPCVERSION --prefix=apache-brpc-$BRPCVERSION-src/ | gzip > apache-brpc-$BRPCVERSION-src.tar.gz +``` +或 +```bash +git archive --format=tar.gz $BRPCVERSION --prefix=apache-brpc-$BRPCVERSION-src/ --output=apache-brpc-$BRPCVERSION-src.tar.gz +``` + +### 6. 生æˆç­¾å文件 + +```bash +gpg -u $BRPCUSERNAME@apache.org --armor --output apache-brpc-$BRPCVERSION-src.tar.gz.asc --detach-sign apache-brpc-$BRPCVERSION-src.tar.gz + +gpg --verify apache-brpc-$BRPCVERSION-src.tar.gz.asc apache-brpc-$BRPCVERSION-src.tar.gz +``` + +### 7. 生æˆå“ˆå¸Œæ–‡ä»¶ + +```bash +sha512sum apache-brpc-$BRPCVERSION-src.tar.gz > apache-brpc-$BRPCVERSION-src.tar.gz.sha512 + +sha512sum --check apache-brpc-$BRPCVERSION-src.tar.gz.sha512 +``` + +## å‘布至 Apache SVN 仓库 + +### 1. 检出 dist/dev 下的 brpc 仓库目录 + +如无本地工作目录,则先创建本地工作目录。将 Apache SVN 仓库克隆下æ¥ï¼Œusername 需è¦ä½¿ç”¨è‡ªå·±çš„ Apache LDAP 用户å。 + +```bash +mkdir -p ~/brpc_svn/dev/ + +cd ~/brpc_svn/dev/ + +svn --username=$BRPCUSERNAME co https://dist.apache.org/repos/dist/dev/brpc/ + +cd ~/brpc_svn/dev/brpc +``` + +### 2. 添加 GPG 公钥 + +仅第一次部署的账å·éœ€è¦æ·»åŠ ï¼Œåªè¦ KEYS 中包å«å·²ç»éƒ¨ç½²è¿‡çš„账户的公钥å³å¯ã€‚ + +```bash +(gpg --list-sigs $BRPCUSERNAME && gpg -a --export $BRPCUSERNAME) >> KEYS +``` + +注æ„:当有多个å相åŒçš„ key 时,å¯ä»¥æŒ‡å®šå®Œæ•´é‚®ä»¶åœ°å€æˆ–者公钥æ¥å¯¼å‡ºæŒ‡å®šçš„公钥信æ¯ã€‚如: +```bash +(gpg --list-sigs $BRPCUSERNAME@apache.org && gpg -a --export $BRPCUSERNAME@apache.org) >> KEYS +``` +或: +```bash +(gpg --list-sigs C30F211F071894258497F46392E18A11B6585834 && gpg -a --export C30F211F071894258497F46392E18A11B6585834) >> KEYS +``` + +### 3. 将待å‘布的代ç åŒ…添加至 SVN 目录 + +```bash +mkdir -p ~/brpc_svn/dev/brpc/$BRPCVERSION + +cd ~/brpc_svn/dev/brpc/$BRPCVERSION + +cp ~/brpc/apache-brpc-$BRPCVERSION-src.tar.gz ~/brpc_svn/dev/brpc/$BRPCVERSION + +cp ~/brpc/apache-brpc-$BRPCVERSION-src.tar.gz.asc ~/brpc_svn/dev/brpc/$BRPCVERSION + +cp ~/brpc/apache-brpc-$BRPCVERSION-src.tar.gz.sha512 ~/brpc_svn/dev/brpc/$BRPCVERSION +``` + +### 4. æäº¤ SVN + +退回到上级目录,使用 Apache LDAP è´¦å·æäº¤ SVN。 + +```bash +cd ~/brpc_svn/dev/brpc + +svn add * + +svn --username=$BRPCUSERNAME commit -m "release $BRPCVERSION" +``` + +## 检查å‘布结果 +```bash +cd ~/brpc_svn/dev/brpc/$BRPCVERSION +``` +### 1. 检查 sha512 哈希 + +```bash +sha512sum --check apache-brpc-$BRPCVERSION-src.tar.gz.sha512 +``` + +### 2. 检查 GPG ç­¾å + +首先导入å‘布人公钥。从 svn 仓库导入 KEYS 到本地环境。(å‘布版本的人ä¸éœ€è¦å†å¯¼å…¥ï¼Œå¸®åŠ©åšéªŒè¯çš„人需è¦å¯¼å…¥ï¼Œç”¨æˆ·åå¡«å‘版人的å³å¯ï¼‰ + +```bash +curl https://dist.apache.org/repos/dist/dev/brpc/KEYS >> KEYS + +gpg --import KEYS +``` + +设置信任该用户的签å,执行以下命令,填写å‘布人的用户å +```bash +gpg --edit-key $BRPCUSERNAME +``` + +输出为 +``` +gpg (GnuPG) 2.3.1; Copyright (C) 2021 Free Software Foundation, Inc. +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Secret key is available. + +gpg> trust + +Please decide how far you trust this user to correctly verify other users' keys +(by looking at passports, checking fingerprints from different sources, etc.) + + 1 = I don't know or won't say + 2 = I do NOT trust + 3 = I trust marginally + 4 = I trust fully + 5 = I trust ultimately + m = back to the main menu + +Your decision? 5 +Do you really want to set this key to ultimate trust? (y/N) y + +gpg> save +``` + +ç„¶åŽè¿›è¡Œ gpg ç­¾åæ£€æŸ¥ã€‚ +```bash +gpg --verify apache-brpc-$BRPCVERSION-src.tar.gz.asc apache-brpc-$BRPCVERSION-src.tar.gz +``` + +### 3. 检查å‘布内容 + +#### 1. 对比æºç åŒ…与 github 上的 tag 内容差异 + +```bash +curl -Lo tag-$BRPCVERSION.tar.gz https://github.com/apache/brpc/archive/refs/tags/$BRPCVERSION.tar.gz + +tar xvzf tag-$BRPCVERSION.tar.gz + +tar xvzf apache-brpc-$BRPCVERSION-src.tar.gz + +diff -r brpc-$BRPCVERSION apache-brpc-$BRPCVERSION-src +``` + +#### 2. 检查æºç åŒ…的文件内容 + +- 检查æºç åŒ…是å¦åŒ…å«ç”±äºŽåŒ…å«ä¸å¿…è¦æ–‡ä»¶ï¼Œè‡´ä½¿ tarball 过于庞大 +- 存在 LICENSE å’Œ NOTICE 文件,并且 NOTICE 文件中的年份正确 +- åªå­˜åœ¨æ–‡æœ¬æ–‡ä»¶ï¼Œä¸å­˜åœ¨äºŒè¿›åˆ¶æ–‡ä»¶ +- 所有文件的开头都有 ASF 许å¯è¯ +- 能够正确编译,å•元测试å¯ä»¥é€šè¿‡ +- æ£€æŸ¥æ˜¯å¦æœ‰å¤šä½™æ–‡ä»¶æˆ–文件夹,例如空文件夹等 +- 检查第三方ä¾èµ–许å¯è¯ï¼š + - 第三方ä¾èµ–的许å¯è¯å…¼å®¹ + - 所有第三方ä¾èµ–的许å¯è¯éƒ½åœ¨ LICENSE 文件中声å + - ä¾èµ–许å¯è¯çš„完整版全部在 license 目录 + - 如果ä¾èµ–的是 Apache 许å¯è¯å¹¶ä¸”存在 NOTICE 文件,那么这些 NOTICE 文件也需è¦åŠ å…¥åˆ°ç‰ˆæœ¬çš„ NOTICE 文件中 + +## 在 Apache bRPC 社区å‘起投票 + +该阶段会æŒç»­è‡³å°‘ 3 天。 + +### 1. 投票阶段 + +1. å‘起投票邮件到 dev@brpc.apache.org。PMC 需è¦å…ˆæŒ‰æ–‡æ¡£æ£€æŸ¥ç‰ˆæœ¬çš„æ­£ç¡®æ€§ï¼Œç„¶åŽå†è¿›è¡ŒæŠ•票。ç»è¿‡è‡³å°‘ 72 å°æ—¶å¹¶ç»Ÿè®¡åˆ° 3 个 +1 PMC member 票åŽï¼Œæ–¹å¯è¿›å…¥ä¸‹ä¸€é˜¶æ®µã€‚ +2. 宣布投票结果,å‘起投票结果邮件到 dev@brpc.apache.org。 + +### 2. æŠ•ç¥¨é‚®ä»¶æ¨¡æ¿ + +#### Apache bRPC ç¤¾åŒºæŠ•ç¥¨é‚®ä»¶æ¨¡æ¿ + +标题: +``` +[VOTE] Release Apache bRPC 1.0.0 +``` + +正文: +``` +Hi Apache bRPC Community, + +This is a call for vote to release Apache bRPC version 1.0.0 + +[Release Note] +- xxx + +The release candidates: +https://dist.apache.org/repos/dist/dev/brpc/1.0.0/ + +Git tag for the release: +https://github.com/apache/brpc/releases/tag/1.0.0 + +Release Commit ID: +https://github.com/apache/brpc/commit/xxx + +Keys to verify the Release Candidate: +https://dist.apache.org/repos/dist/dev/brpc/KEYS + +The vote will be open for at least 72 hours or until the necessary number of +votes are reached. + +Please vote accordingly: +[ ] +1 approve +[ ] +0 no opinion +[ ] -1 disapprove with the reason + +PMC vote is +1 binding, all others are +1 non-binding. + +Checklist for reference: +[ ] Download links are valid. +[ ] Checksums and PGP signatures are valid. +[ ] Source code distributions have correct names matching the current +release. +[ ] LICENSE and NOTICE files are correct for each brpc repo. +[ ] All files have license headers if necessary. +[ ] No compiled archives bundled in source archive. + +Regards, +LorinLee +``` + +注:`Release Commit ID` å¡«å†™å½“å‰ tag(1.0.0) çš„ commit id。 + +#### Apache bRPC ç¤¾åŒºå®£å¸ƒç»“æžœé‚®ä»¶æ¨¡æ¿ + +标题: +``` +[RESULT] [VOTE] Release Apache bRPC 1.0.0 +``` + +正文: +``` +Hi all, + +The vote to release Apache bRPC 1.0.0 has passed. + +The vote PASSED with 3 binding +1, 3 non binding +1 and no -1 votes: + +Binding votes: +- xxx +- yyy +- zzz + +Non-binding votes: +- aaa +- bbb +- ccc + +Vote thread: xxx (vote email link in https://lists.apache.org/) + +Thank you to all the above members to help us to verify and vote for +the 1.0.0 release. I will process to publish the release and send ANNOUNCE. + +Regards, +LorinLee +``` + +### 3. 投票未通过 + +若社区投票未通过,则在 release 分支对代ç ä»“åº“è¿›è¡Œä¿®æ”¹ï¼Œé‡æ–°æ‰“包,å‘起投票。 + +## 完æˆå‘布 + +### 1. 将软件包从 Apache SVN 仓库的 dist/dev 目录移至 dist/release 目录 + +注æ„ï¼šè¯¥è¿‡ç¨‹éœ€è¦ PMC æˆå‘˜è¿›è¡Œï¼ŒæŠ•票通过åŽå¯ä»¥è”ç³» PMC æˆå‘˜è¿›è¡Œç›¸å…³æ“作,首次å‘版的æˆå‘˜è¿˜éœ€è¦æ›´æ–°å…¬é’¥ä¿¡æ¯ KEYS。 + +```bash +svn mv https://dist.apache.org/repos/dist/dev/brpc/$BRPCVERSION https://dist.apache.org/repos/dist/release/brpc/$BRPCVERSION -m "release brpc $BRPCVERSION" +``` + +### 2. 创建 GitHub 版本å‘布页 + +在 [GitHub Releases 页é¢](https://github.com/apache/brpc/tags)的对应 tag 上点击,创建新的 Release,编辑版本å·åŠç‰ˆæœ¬è¯´æ˜Žã€‚注æ„Release titleç»Ÿä¸€æ ¹æ®æœ¬æ¬¡ç‰ˆæœ¬å·å†™ä¸ºApache bRPC 1.x.0,并点击 Publish release。 + +### 3. 更新网站下载页 + +等待并确认新的å‘å¸ƒç‰ˆæœ¬åŒæ­¥è‡³ Apache 镜åƒåŽï¼Œæ›´æ–°å¦‚下页é¢ï¼š, æ›´æ–°æ–¹å¼åœ¨ 仓库中,注æ„ä¸­è‹±æ–‡éƒ½è¦æ›´æ–°ã€‚ + +GPG ç­¾åæ–‡ä»¶å’Œå“ˆå¸Œæ ¡éªŒæ–‡ä»¶çš„下载链接应该使用这个å‰ç¼€ï¼šhttps://downloads.apache.org/brpc/ + +代ç åŒ…的下载链接应该使用这个å‰ç¼€ï¼šhttps://dlcdn.apache.org/brpc/ + +### 4. å‘é€é‚®ä»¶é€šçŸ¥æ–°ç‰ˆå‘布 + +å‘é€é‚®ä»¶åˆ° dev@brpc.apache.org å’Œ announce@apache.org 通知完æˆç‰ˆæœ¬å‘布。 + +注æ„:å‘邮件账å·å¿…须使用**个人 apache 邮箱**,且邮件内容必须是**纯文本格å¼**(å¯åœ¨ gmail 选择"纯文本模å¼")。announce@apache.org 邮件组需è¦ç»è¿‡äººå·¥å®¡æ ¸æ‰èƒ½é€è¾¾ï¼Œå‘出邮件åŽè¯·è€å¿ƒç­‰å¾…,一般会在一天之内通过。 + +个人 apache 邮箱é…置方å¼å¯ä»¥å‚考:https://shenyu.apache.org/zh/community/use-apache-email +注æ„:SMTP æœåŠ¡å™¨éœ€è¦å¡« `mail-relay.apache.org`。 + +通知邮件模æ¿å¦‚下: + +标题: +``` +[ANNOUNCE] Apache bRPC 1.0.0 released +``` + +正文: +注:`Brief notes of this release` 仅需列出本次å‘版的主è¦å˜æ›´ï¼Œä¸”无需指出对应贡献人和 PR ç¼–å·ï¼Œå»ºè®®å‚考下之å‰çš„ Announce 邮件。 +``` +Hi all, + +The Apache bRPC community is glad to announce the new release +of Apache bRPC 1.0.0. + +Apache bRPC is an Industrial-grade RPC framework using C++ Language, +which is often used in high performance systems such as Search, Storage, +Machine learning, Advertisement, Recommendation etc. + +Brief notes of this release: +- xxx +- yyy +- zzz + +More details regarding Apache brpc can be found at: +https://brpc.apache.org/ + +The release is available for download at: +https://brpc.apache.org/download/ + +The release notes can be found here: +https://github.com/apache/brpc/releases/tag/1.0.0 + +Website: https://brpc.apache.org/ + +Apache bRPC Resources: +- Issue: https://github.com/apache/brpc/issues/ +- Mailing list: dev@brpc.apache.org +- Documents: https://brpc.apache.org/docs/ + +We would like to thank all contributors of the Apache bRPC community +who made this release possible! + + +Best Regards, +Apache bRPC Community +``` + +### 5. å…¶ä»–å¯¹å¤–å…¬å…±è´¦å· + +#### å¾®ä¿¡å…¬ä¼—å· + +å‚考 。 +建议先在腾讯文档中编辑åŽç²˜è´´è‡³å…¬ä¼—å·ï¼Œç»Ÿä¸€å­—体大å°å’Œæ ¼å¼ï¼Œå‚考 [腾讯文档:bRPC 1.11.0](https://docs.qq.com/doc/DYmZ2Tnpub1lySWZO?_t=1730208105245&u=31460cd039dd4461877a61ab9f56be1f) + + +### 6. æ›´æ–° master 分支 + +å‘版完æˆåŽï¼Œå°† release 分支åˆå¹¶åˆ° master 分支。 diff --git a/community/release_en.md b/community/release_en.md new file mode 100644 index 0000000..8a31482 --- /dev/null +++ b/community/release_en.md @@ -0,0 +1,595 @@ +# brpc apache release guide step by step + +## Preparation + +### 1. Confirm the release notes + +It will cost about 1 week or so to finish this phase, during this phase: +* The content of the `Release Notes` will be confirmed, + - no missing changes; + - and the description is clear; +* The PRs those are scheduled for the release can be merged. + +The `Release Notes` template: +``` +[Release Notes] + +Feature: +- ... + +Bugfix: +- ... + +Enhancement: +- ... + +Other: +- ... +``` + +### 2. Setup GPG(Please skip this step if you are not a first time distributor) + +#### 1. Install GPG + +The popular Linux distributions should have the GnuPG pre-installed. With OSX, you can install GnuPG using [`brew`](https://brew.sh/): +```bash +brew install gnupg +``` + +You can also download the installation package from [the GnuPG official website](https://www.gnupg.org/download/index.html). The commands of GnuPG version 1.x and version 2.x are slightly different. The following instructions take the `GnuPG-2.3.1` version (OSX) as an example. + +After the installation is complete, execute the following command to check the version number. +```bash +gpg --version +``` + +#### 2. Create key + +After the installation is complete, execute the following command to create a key. + +```bash +gpg --full-gen-key +``` + +Complete the key creation according to the prompts. Note that the mailbox should use the Apache email address, and the `Real Name` can use Apache ID or GitHub ID: + +``` +gpg (GnuPG) 2.3.1; Copyright (C) 2021 Free Software Foundation, Inc. +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Please select what kind of key you want: + (1) RSA and RSA + (2) DSA and Elgamal + (3) DSA (sign only) + (4) RSA (sign only) + (9) ECC (sign and encrypt) *default* + (10) ECC (sign only) + (14) Existing key from card +Your selection? 1 +RSA keys may be between 1024 and 4096 bits long. +What keysize do you want? (3072) 4096 +Requested keysize is 4096 bits +Please specify how long the key should be valid. + 0 = key does not expire + = key expires in n days + w = key expires in n weeks + m = key expires in n months + y = key expires in n years +Key is valid for? (0) 0 +Key does not expire at all +Is this correct? (y/N) y + +GnuPG needs to construct a user ID to identify your key. + +Real name: LorinLee +Email address: lorinlee@apache.org +Comment: lorinlee's key +You selected this USER-ID: + "LorinLee (lorinlee's key) " + +Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O +You need a Passphrase to protect your secret key. # Input password + +We need to generate a lot of random bytes. It is a good idea to perform +some other action (type on the keyboard, move the mouse, utilize the +disks) during the prime generation; this gives the random number +generator a better chance to gain enough entropy. +gpg: key 92E18A11B6585834 marked as ultimately trusted +gpg: revocation certificate stored as '/Users/lilei/.gnupg/openpgp-revocs.d/C30F211F071894258497F46392E18A11B6585834.rev' +public and secret key created and signed. + +pub rsa4096 2021-10-17 [SC] + C30F211F071894258497F46392E18A11B6585834 +uid LorinLee (lorinlee's key) +sub rsa4096 2021-10-17 [E] +``` + +#### 3. Check the generated key + +```bash +gpg --list-keys +``` + +output: + +``` +gpg: checking the trustdb +gpg: marginals needed: 3 completes needed: 1 trust model: pgp +gpg: depth: 0 valid: 2 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 2u +/Users/lilei/.gnupg/pubring.kbx +---------------------------------- +pub rsa4096 2021-10-17 [SC] + C30F211F071894258497F46392E18A11B6585834 +uid [ultimate] LorinLee (lorinlee's key) +sub rsa4096 2021-10-17 [E] +``` + +Note that `C30F211F071894258497F46392E18A11B6585834` is the public key. + +#### 4. Publish the public key to server + +Execute the following command: + +```bash +gpg --keyserver hkps://pgp.mit.edu --send-key C30F211F071894258497F46392E18A11B6585834 +``` + +The keyserver can also use hkps://keys.openpgp.org or hkps://keyserver.ubuntu.com,which provide web page to view the keys. + +#### 5. Generate fingerprint and upload to Apache user profile + +Since the public key server has no verifying mechanism, anyone can upload the public key in your name, so there is no way to guarantee the reliability of the public key on the server. Usually, you can publish a public key fingerprint on your website and let others check the downloaded public key. + +Execute the following command to view the fingerprint. +``` +gpg --fingerprint lorinlee # user id +``` + +output: +``` +/Users/lilei/.gnupg/pubring.kbx +---------------------------------- +pub rsa4096 2021-10-17 [SC] + C30F 211F 0718 9425 8497 F463 92E1 8A11 B658 5834 +uid [ultimate] LorinLee (lorinlee's key) +sub rsa4096 2021-10-17 [E] +``` + +Paste the above fingerprint `C30F 211F 0718 9425 8497 F463 92E1 8A11 B658 5834` into the `OpenPGP Public Key Primary Fingerprint:` field of your Apache user information on https://id.apache.org. + +## Make the release + +### 1. Create release branch + +If you are releasing a new MAJOR/MINOR version, like `1.0.0`, you need to create a new branch `release-1.0` from master. + +If you are releasing a new PATCH version from existing MINOR version, like `1.0.1`, you only need to modify the existing `release-1.0` branch and add the content to be released. + +The code modification during the release process are performed on the release branch (such as `release-1.0`). After the release is complete, please merge the release branch back into the master branch. + +### 2. Update the `NOTICE` file + +Check and update the YEAR field of the `NOTIEC` file. + +### 3. Update version in source code + +#### Update `RELEASE_VERSION` file + +Edit the `RELEASE_VERSION` file in the project root directory, update the version number, and submit it to the code repository. For example, the `1.0.0` version of the file is: + +``` +1.0.0 +``` + +#### Update the `CMakeLists.txt` file + +Edit the `CMakeLists.txt` file in the project root directory, update the version number, and submit it to the code repository. For example: + +``` +set(BRPC_VERSION 1.0.0) +``` + +#### Update the `package/rpm/brpc.spec` file + +Edit the `/package/rpm/brpc.spec` file in the project root directory, update the version number, and submit it to the code repository. For example: + +``` +Version: 1.0.0 +``` + +#### Update the `MODULE.bazel` file + +Edit the `MODULE.bazel` file in the project root directory, update the version number, and submit it to the code repository. For example: + +``` +# in MODULE.bazel +module( + ... + version = '1.0.0', + ... +) +``` + +### 4. Create releasing tag + +Pull the release branch to tag, for example: + +```bash +git clone -b release-1.0 git@github.com:apache/brpc.git ~/brpc + +cd ~/brpc + +git tag -a 1.0.0 -m "release 1.0.0" + +git push origin --tags +``` + +### 5. Create releasing package + +```bash +git archive --format=tar 1.0.0 --prefix=apache-brpc-1.0.0-src/ | gzip > apache-brpc-1.0.0-src.tar.gz +``` +or +```bash +git archive --format=tar.gz 1.0.0 --prefix=apache-brpc-1.0.0-src/ --output=apache-brpc-1.0.0-src.tar.gz +``` + +### 6. Generate GPG signature + +```bash +gpg -u lorinlee@apache.org --armor --output apache-brpc-1.0.0-src.tar.gz.asc --detach-sign apache-brpc-1.0.0-src.tar.gz + +gpg --verify apache-brpc-1.0.0-src.tar.gz.asc apache-brpc-1.0.0-src.tar.gz +``` + +### 7. Generate SHA512 checksum + +```bash +sha512sum apache-brpc-1.0.0-src.tar.gz > apache-brpc-1.0.0-src.tar.gz.sha512 + +sha512sum --check apache-brpc-1.0.0-src.tar.gz.sha512 +``` + +## Publish to Apache SVN repository + +### 1. Checkout dist/dev/brpc directory + +If there is no local working directory, create a local working directory first. Checkout the Apache SVN repository, username needs to use your own Apache LDAP username: + +```bash +mkdir -p ~/brpc_svn/dev/ + +cd ~/brpc_svn/dev/ + +svn --username=lorinlee co https://dist.apache.org/repos/dist/dev/brpc/ + +cd ~/brpc_svn/dev/brpc +``` + +### 2. Add GPG public key + +A new release manager must add the key into KEYS file for the first time. + +``` +(gpg --list-sigs lorinlee && gpg -a --export lorinlee) >> KEYS +``` + +Note: if you have more than one keys that use the name, you should explicitly specify the key by email or fingerprint to export. + +By email +```bash +(gpg --list-sigs lorinlee@apache.org && gpg -a --export lorinlee@apache.org) >> KEYS +``` +By fingerprint: +```bash +(gpg --list-sigs C30F211F071894258497F46392E18A11B6585834 && gpg -a --export C30F211F071894258497F46392E18A11B6585834) >> KEYS +``` + +### 3. Add the releasing package to SVN directory + +```bash +mkdir -p ~/brpc_svn/dev/brpc/1.0.0 + +cd ~/brpc_svn/dev/brpc/1.0.0 + +cp ~/brpc/apache-brpc-1.0.0-src.tar.gz ~/brpc_svn/dev/brpc/1.0.0 + +cp ~/brpc/apache-brpc-1.0.0-src.tar.gz.asc ~/brpc_svn/dev/brpc/1.0.0 + +cp ~/brpc/apache-brpc-1.0.0-src.tar.gz.sha512 ~/brpc_svn/dev/brpc/1.0.0 +``` + +### 4. Submit SVN + +Return to the parent directory and use the Apache LDAP account to submit SVN + +```bash +cd ~/brpc_svn/dev/brpc + +svn add * + +svn --username=lorinlee commit -m "release 1.0.0" +``` + +## Verify release +```bash +cd ~/brpc_svn/dev/brpc/1.0.0 +``` +### 1. Verify SHA512 checksum + +```bash +sha512sum --check apache-brpc-1.0.0-src.tar.gz.sha512 +``` + +### 2. Verify GPG signature + +First import the publisher's public key. Import KEYS from the svn repository to the local. (The person who releases the version does not need to import it again. The person who verify needs to import it.) + +```bash +curl https://dist.apache.org/repos/dist/dev/brpc/KEYS >> KEYS + +gpg --import KEYS +``` + +Trust the signature of publisher, execute the following command using the publisher's user name + +```bash +gpg --edit-key lorinlee +``` + +output: +``` +gpg (GnuPG) 2.3.1; Copyright (C) 2021 Free Software Foundation, Inc. +This is free software: you are free to change and redistribute it. +There is NO WARRANTY, to the extent permitted by law. + +Secret key is available. + +gpg> trust + +Please decide how far you trust this user to correctly verify other users' keys +(by looking at passports, checking fingerprints from different sources, etc.) + + 1 = I don't know or won't say + 2 = I do NOT trust + 3 = I trust marginally + 4 = I trust fully + 5 = I trust ultimately + m = back to the main menu + +Your decision? 5 +Do you really want to set this key to ultimate trust? (y/N) y + +gpg> save +``` + +Then verify the GPG signature: +``` +gpg --verify apache-brpc-1.0.0-src.tar.gz.asc apache-brpc-1.0.0-src.tar.gz +``` + +### 3. Check release content + +#### 1. Compare the difference between the candidate source package and the package download through github tag page + +Should use the `tar.gz` format tarball. + +```bash +curl -Lo tag-1.0.0.tar.gz https://github.com/apache/brpc/archive/refs/tags/1.0.0.tar.gz + +tar xvzf tag-1.0.0.tar.gz + +tar xvzf apache-brpc-1.0.0-src.tar.gz + +diff -r brpc-1.0.0 apache-brpc-1.0.0-src +``` + +#### 2. Check file content + +- Check whether the source code package contains unnecessary files, which makes the tarball too large +- LICENSE and NOTICE files exist +- The year in the NOTICE file is correct +- Only text files exist, no binary files exist +- All files have an ASF license at the beginning +- Source code can be compiled correctly, and the unit test can pass +- Check whether there are redundant files or folders, such as empty folders +- Check for third-party dependency licenses: + - Third party dependency license compatibility + - All licenses of third-party dependency are declared in the LICENSE file + - The complete version of the dependency license is in the license directory + - If third-party dependency have the Apache license and have NOTICE files, these NOTICE files also need to be added to the releasing NOTICE file + +## Vote in the Apache bRPC community + +This stage will cost 3+ days. + +### 1. Vote stage + +1. Send a voting email to `dev@brpc.apache.org`. PMC needs to check the correctness of the version according to the document before voting. After at least 72 hours and 3 +1 PMC member votes, you can move to the next stage. +2. Announce the voting result and send the voting result to dev@brpc.apache.org. + +### 2. Vote email template + +1. Apache bRPC community vote email template + +Title: +``` +[VOTE] Release Apache bRPC 1.0.0 +``` + +Content: + +Note: `Release Commit ID` fills in the commit ID of the last commit of the current release branch. + +``` +Hi Apache bRPC Community, + +This is a call for vote to release Apache bRPC version +1.0.0 + +[Release Note] +- xxx + +The release candidates: +https://dist.apache.org/repos/dist/dev/brpc/1.0.0/ + +Git tag for the release: +https://github.com/apache/brpc/releases/tag/1.0.0 + +Release Commit ID: +https://github.com/apache/brpc/commit/xxx + +Keys to verify the Release Candidate: +https://dist.apache.org/repos/dist/dev/brpc/KEYS + +The vote will be open for at least 72 hours or until the necessary number of +votes are reached. + +Please vote accordingly: +[ ] +1 approve +[ ] +0 no opinion +[ ] -1 disapprove with the reason + +PMC vote is +1 binding, all others are +1 non-binding. + +Checklist for reference: +[ ] Download links are valid. +[ ] Checksums and PGP signatures are valid. +[ ] Source code distributions have correct names matching the current +release. +[ ] LICENSE and NOTICE files are correct for each brpc repo. +[ ] All files have license headers if necessary. +[ ] No compiled archives bundled in source archive. + +Regards, +LorinLee +``` + +2. Apache bRPC community announcement of vote result template + +Title: +``` +[Result] [VOTE] Release Apache bRPC 1.0.0 +``` + +Content: +``` +Hi all, + +The vote to release Apache bRPC 1.0.0 has passed. + +The vote PASSED with 3 binding +1, 3 non binding +1 and no -1 votes: + +Binding votes: +- xxx +- yyy +- zzz + +Non-binding votes: +- aaa +- bbb +- ccc + +Vote thread: xxx (vote email link in https://lists.apache.org/) + +Thank you to all the above members to help us to verify and vote for +the 1.0.0 release. I will process to publish the release and send ANNOUNCE. + +Regards, +LorinLee +``` + +### 3. Vote not passed + +If the community vote is not passed, please modify the code of the release branch, package and vote again. + + +## Finish the release + +### 1. Move the release package from Apache SVN directory dist/dev to dist/release + +Note: PMC members only, and it will also update the `KEYS` if changed. + +``` +svn mv https://dist.apache.org/repos/dist/dev/brpc/1.0.0 https://dist.apache.org/repos/dist/release/brpc/1.0.0 -m "release brpc 1.0.0" +``` + +### 2. Create github release + +1. On the [GitHub Releases page](https://github.com/apache/brpc/tags) Click the corresponding version of to create a new Release +2. Edit the version number and version description, and click `Publish release` + +### 3. Update download page + +After waiting and confirming that the new release is synchronized to the Apache image, update the following page: by change the code in . Please update both Chinese and English. + +The download links of GPG signature files and hash check files should use this prefix: `https://downloads.apache.org/brpc/` + +The download link of the code package should use this prefix: `https://dlcdn.apache.org/brpc/` + +### 4. Send email to announce release finished + +Send mail to `dev@brpc.apache.org` and `announce@apache.org` to announce the completion of release. + +Note: The email account must use **personal apache email**, and the email content must be **plain text format** ("plain text mode" can be selected in gmail). And email to `announce@apache.org` mail group will be delivered after manual review. Please wait patiently after sending the email, and it will be passed within one day. + +See https://shenyu.apache.org/community/use-apache-email for more details to setup a personal apache account email, the `SMTP` server should be `mail-relay.apache.org`. + +The announcement email template: + +Title: +``` +[ANNOUNCE] Apache bRPC 1.0.0 released +``` + +Content: + +Note: `Brief notes of this release` It is only necessary to list the main changes of this release, without corresponding contributors and PR numbers. It is recommended to refer to the previous announcement email. + +``` +Hi all, + +The Apache bRPC community is glad to announce the new release +of Apache bRPC 1.0.0. + +Apache bRPC is an Industrial-grade RPC framework using C++ Language, +which is often used in high performance systems such as Search, Storage, +Machine learning, Advertisement, Recommendation etc. + +Brief notes of this release: +- xxx +- yyy +- zzz + +More details regarding Apache brpc can be found at: +https://brpc.apache.org/ + +The release is available for download at: +https://brpc.apache.org/download/ + +The release notes can be found here: +https://github.com/apache/brpc/releases/tag/1.0.0 + +Website: https://brpc.apache.org/ + +Apache bRPC Resources: +- Issue: https://github.com/apache/brpc/issues/ +- Mailing list: dev@brpc.apache.org +- Documents: https://brpc.apache.org/docs/ + +We would like to thank all contributors of the Apache bRPC community +who made this release possible! + + +Best Regards, +Apache bRPC Community +``` + +### 5. Publish WeChat official account announcement + +Reference . + +### 6. Update master branch + +After the release is completed, merge the release branch into the `master` branch. diff --git a/community/release_schedule.md b/community/release_schedule.md new file mode 100644 index 0000000..1cf4ee2 --- /dev/null +++ b/community/release_schedule.md @@ -0,0 +1,27 @@ +# bRPC å‘版日程 + +|版本å·|å‘版时间|å‘版人| +|-|-|-| +|1.0.0|2021-10-31|æŽç£Š| +|1.1.0|2022-03-29|王伟冰| +|1.2.0|2022-07-11|刘帅| +|1.3.0|2022-10-25|胡希国| +|1.4.0|2023-02-07|王晓峰| +|1.5.0|2023-04-xx|胡希国| +|1.6.0|2023-07-xx|陈光明| +|1.7.0|2023-10-xx|æŽç£Š| +|1.8.0|2024-01-xx|王伟冰| +|1.9.0|2024-04-xx|刘帅| +|1.10.0|2024-07-xx|王晓峰| +|1.11.0|2024-10-xx|胡希国| +|1.12.0|2025-01-xx|陈光明| +|1.13.0|2025-04-xx|æŽç£Š| +|1.14.0|2025-07-xx|王伟冰| +|1.15.0|2025-10-xx|刘帅| +|1.16.0|2026-01-xx|王晓峰| +|1.17.0|2026-05-xx|胡希国| +|1.18.0|2026-09-xx|陈光明| +|1.19.0|2027-01-xx|æŽç£Š| +|1.20.0|2027-05-xx|王伟冰| +|1.21.0|2027-09-xx|刘帅| +|1.22.0|2028-01-xx|王晓峰| diff --git a/community/releasecheck.md b/community/releasecheck.md new file mode 100644 index 0000000..c780b66 --- /dev/null +++ b/community/releasecheck.md @@ -0,0 +1,54 @@ +# brpc å‘版时候的 Check List + +## 文档背景: + +当 Release Manager 在 dev 邮件群中å‘èµ·å‘å¸ƒæŠ•ç¥¨çš„æ—¶å€™ï¼Œéœ€è¦ PMC æˆå‘˜å¯¹å‘版相关信æ¯è¿›è¡Œæ£€æŸ¥ï¼Œå¦‚果检查通过则在邮件群中回å¤é€šè¿‡å¹¶é™„上检查结果。本文档就是å„个检查项。 + +## Checklist èµ„æ–™æ¥æº + +æ ¹æ® Incubator PMC Chair Justin 在 ApacheCon North America 2019 的分享 +https://training.apache.org/topics/ApacheWay/NavigatingASFIncubator/index.html + +![image](./releasecheck.png) + + +## 常è§çš„问题导致 -1 + +![image](./releasefail.png) + +## Vote 时候的检查项 + +æ¯•ä¸šåŽæ£€æŸ¥æ—¶ä¸å†éœ€è¦ `DISCLAIMER` ä»¥åŠ `incubating` + +1. ~~Incubating in name å³ä¸‹è½½åŒ…çš„æ–‡ä»¶åæ˜¯å¦å¸¦ä¸Šäº†incubating~~ +2. LICENSE and NOTICE are good + - LICENSE 是å¦ç¬¦åˆ Apache çš„è¦æ±‚ + - ASF å…许的 LICENSE:Category A(Apache V2, BSD 3, MIT etc) + - ASF å»ºè®®ä¸æ”¾åˆ°æºç ä¸­çš„ LICENSE:Category B(EPL, MPL, CDDL, etc) + - ASF ä¸å…许的 LICENSE:Category X(GPL, LGPL, CC Non commercial, etc) + - NOTICE 是å¦ç¬¦åˆ Apache çš„è¦æ±‚ +3. Signatures and hashes correct +4. All ASF files have ASF headers +5. No unexpected binary files +6. Must have an incubating disclaimer + - ~~Repo 根目录下应该有 DISCLAIMER 文件~~ + - 内容是 Apache 统一的内容 + + +## Vote æ—¶å€™çš„å¸¸ç”¨å›žå¤ + +> +> +1 (binding) +> +> I checked: +> - ~~incubating in name~~ +> - LICENSE and NOTICE are good +> - signatures and hashes correct +> - All ASF files have ASF headers +> - no unexpected binary files +> + +## 注æ„: + +1. ä¸è¦å›žå¤ç®€å•çš„ +1,需è¦åŠ ä¸Šæ‰§è¡Œçš„å‡ ä¸ªæ£€æŸ¥é¡¹å’Œæ£€æŸ¥ç»“æžœ +2. 给出 -1 çš„æ—¶å€™ï¼ŒåŒæ ·éœ€è¦ç»™å‡ºæ˜Žç¡®çš„ç†ç”± diff --git a/community/releasecheck.png b/community/releasecheck.png new file mode 100644 index 0000000000000000000000000000000000000000..9bc1141de8a8d310e6ce06f80566c8228987ea1f GIT binary patch literal 251728 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� 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

8Hc*7^I6M@vUf)V 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 literal 0 HcmV?d00001 diff --git a/community/releasefail.png b/community/releasefail.png new file mode 100644 index 0000000000000000000000000000000000000000..580f7d80eca1113ad9c6f3b805cf14b1a7e5c44a GIT binary patch literal 228365 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

SW$}& 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 literal 0 HcmV?d00001 diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..4f26e57 --- /dev/null +++ b/config.h.in @@ -0,0 +1,24 @@ +// Licensed to the Apache Software Foundation (ASF) under one or more +// contributor license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright ownership. +// The ASF licenses this file to You under the Apache License, Version 2.0 +// (the "License"); you may not use this file except in compliance with +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef BUTIL_CONFIG_H +#define BUTIL_CONFIG_H + +#ifdef BRPC_WITH_GLOG +#undef BRPC_WITH_GLOG +#endif +#cmakedefine BRPC_WITH_GLOG @WITH_GLOG_VAL@ + +#endif // BUTIL_CONFIG_H diff --git a/config_brpc.sh b/config_brpc.sh new file mode 100755 index 0000000..1c05942 --- /dev/null +++ b/config_brpc.sh @@ -0,0 +1,673 @@ +#!/usr/bin/env sh + +# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +BOLD='\033[1m' +GREEN='\033[0;32m' +YELLOW='\033[0;33m' +CYAN='\033[0;36m' +NC='\033[0m' # No Color + +print_info() { + printf "${CYAN}[INFO]${NC} %s\n" "$1" +} +print_success() { + printf "${GREEN}[OK]${NC} %s\n" "$1" +} +print_step() { + printf "${BOLD}==> %s${NC}\n" "$1" +} + +SYSTEM=$(uname -s) +if [ "$SYSTEM" = "Darwin" ]; then + if [ -z "$BASH" ] || [ "$BASH" = "/bin/sh" ] ; then + ECHO=echo + else + ECHO='echo -e' + fi + SO=dylib + LDD="otool -L" + if [ "$(getopt -V)" = " --" ]; then + >&2 $ECHO "gnu-getopt must be installed and used" + exit 1 + fi +else + if [ -z "$BASH" ]; then + ECHO=echo + else + ECHO='echo -e' + fi + SO=so + LDD=ldd +fi + +TEMP=`getopt -o v: --long headers:,libs:,cc:,cxx:,with-glog,with-thrift,with-rdma,with-mesalink,with-bthread-tracer,with-debug-bthread-sche-safety,with-debug-lock,with-asan,with-riscv-zvbc,with-riscv-zbc,nodebugsymbols,werror -n 'config_brpc' -- "$@"` +WITH_GLOG=0 +WITH_THRIFT=0 +WITH_RDMA=0 +WITH_MESALINK=0 +WITH_BTHREAD_TRACER=0 +WITH_ASAN=0 +WITH_RISCV_ZVBC=0 +WITH_RISCV_ZBC=0 +BRPC_DEBUG_BTHREAD_SCHE_SAFETY=0 +DEBUGSYMBOLS=-g +WERROR= +BRPC_DEBUG_LOCK=0 + +if [ $? != 0 ] ; then >&2 $ECHO "Terminating..."; exit 1 ; fi + +# Note the quotes around `$TEMP': they are essential! +eval set -- "$TEMP" + +if [ "$SYSTEM" = "Darwin" ]; then + REALPATH=realpath +else + REALPATH="readlink -f" +fi + +# Convert to abspath always so that generated mk is include-able from everywhere +while true; do + case "$1" in + --headers ) HDRS_IN="$(${REALPATH} $2)"; shift 2 ;; + --libs ) LIBS_IN="$(${REALPATH} $2)"; shift 2 ;; + --cc ) CC=$2; shift 2 ;; + --cxx ) CXX=$2; shift 2 ;; + --with-glog ) WITH_GLOG=1; shift 1 ;; + --with-thrift) WITH_THRIFT=1; shift 1 ;; + --with-rdma) WITH_RDMA=1; shift 1 ;; + --with-mesalink) WITH_MESALINK=1; shift 1 ;; + --with-bthread-tracer) WITH_BTHREAD_TRACER=1; shift 1 ;; + --with-debug-bthread-sche-safety ) BRPC_DEBUG_BTHREAD_SCHE_SAFETY=1; shift 1 ;; + --with-debug-lock ) BRPC_DEBUG_LOCK=1; shift 1 ;; + --with-asan) WITH_ASAN=1; shift 1 ;; + --with-riscv-zvbc) WITH_RISCV_ZVBC=1; shift 1 ;; + --with-riscv-zbc) WITH_RISCV_ZBC=1; shift 1 ;; + --nodebugsymbols ) DEBUGSYMBOLS=; shift 1 ;; + --werror ) WERROR=-Werror; shift 1 ;; + -- ) shift; break ;; + * ) break ;; + esac +done + +print_step "Configuring brpc (${SYSTEM})" +print_info "Headers path: ${HDRS_IN}" +print_info "Libs path: ${LIBS_IN}" + +if [ -z "$CC" ]; then + if [ ! -z "$CXX" ]; then + >&2 $ECHO "--cc and --cxx must be both set or unset" + exit 1 + fi + CC=gcc + CXX=g++ + if [ "$SYSTEM" = "Darwin" ]; then + CC=clang + CXX=clang++ + fi +elif [ -z "$CXX" ]; then + >&2 $ECHO "--cc and --cxx must be both set or unset" + exit 1 +fi + +print_info "CC=$CC, CXX=$CXX" + +GCC_VERSION=$(CXX=$CXX tools/print_gcc_version.sh) +if [ $GCC_VERSION -gt 0 ] && [ $GCC_VERSION -lt 40800 ]; then + >&2 $ECHO "GCC is too old, please install a newer version supporting C++11" + exit 1 +fi + +if [ -z "$HDRS_IN" ] || [ -z "$LIBS_IN" ]; then + >&2 $ECHO "config_brpc: --headers=HDRPATHS --libs=LIBPATHS must be specified" + exit 1 +fi + +find_dir_of_lib() { + local lib=$(find ${LIBS_IN} -name "lib${1}.a" -o -name "lib${1}.$SO" 2>/dev/null | head -n1) + if [ ! -z "$lib" ]; then + dirname $lib + fi +} +find_dir_of_lib_or_die() { + local dir=$(find_dir_of_lib $1) + if [ -z "$dir" ]; then + >&2 $ECHO "Fail to find $1 from --libs" + exit 1 + else + $ECHO $dir + fi +} + +find_bin() { + TARGET_BIN=$(find -L ${LIBS_IN} -type f -name "$1" 2>/dev/null | head -n1) + if [ ! -z "$TARGET_BIN" ]; then + $ECHO $TARGET_BIN + else + which "$1" 2>/dev/null + fi +} +find_bin_or_die() { + TARGET_BIN=$(find_bin "$1") + if [ ! -z "$TARGET_BIN" ]; then + $ECHO $TARGET_BIN + else + >&2 $ECHO "Fail to find $1" + exit 1 + fi +} + +find_dir_of_header() { + find -L ${HDRS_IN} -path "*/$1" | head -n1 | sed "s|$1||g" +} + +find_dir_of_header_excluding() { + find -L ${HDRS_IN} -path "*/$1" | grep -v "$2\$" | head -n1 | sed "s|$1||g" +} + +find_dir_of_header_or_die() { + if [ -z "$2" ]; then + local dir=$(find_dir_of_header $1) + else + local dir=$(find_dir_of_header_excluding $1 $2) + fi + if [ -z "$dir" ]; then + >&2 $ECHO "Fail to find $1 from --headers" + exit 1 + fi + $ECHO $dir +} + +if [ "$SYSTEM" = "Darwin" ]; then + if [ -d "/usr/local/opt/openssl" ]; then + LIBS_IN="/usr/local/opt/openssl/lib $LIBS_IN" + HDRS_IN="/usr/local/opt/openssl/include $HDRS_IN" + elif [ -d "/opt/homebrew/Cellar" ]; then + LIBS_IN="/opt/homebrew/Cellar $LIBS_IN" + HDRS_IN="/opt/homebrew/Cellar $HDRS_IN" + fi +fi + +print_step "Checking dependencies" + +# User specified path of openssl, if not given it's empty +OPENSSL_LIB=$(find_dir_of_lib ssl) +# Inconvenient to check these headers in baidu-internal +#PTHREAD_HDR=$(find_dir_of_header_or_die pthread.h) +OPENSSL_HDR=$(find_dir_of_header_or_die openssl/ssl.h mesalink/openssl/ssl.h) +print_success "Found openssl: lib=${OPENSSL_LIB:-system}, hdr=${OPENSSL_HDR}" + +if [ $WITH_MESALINK != 0 ]; then + MESALINK_HDR=$(find_dir_of_header_or_die mesalink/openssl/ssl.h) + OPENSSL_HDR="$OPENSSL_HDR\n$MESALINK_HDR" +fi + +STATIC_LINKINGS= +DYNAMIC_LINKINGS="-lpthread -lssl -lcrypto -ldl -lz" + +if [ $WITH_MESALINK != 0 ]; then + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -lmesalink" +fi + +if [ "$SYSTEM" = "Linux" ]; then + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -lrt" +fi +if [ "$SYSTEM" = "Darwin" ]; then + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework CoreFoundation" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework CoreGraphics" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework CoreData" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework CoreText" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework Security" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -framework Foundation" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_MallocExtension_ReleaseFreeMemory" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_ProfilerStart" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_ProfilerStop" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,__Z13GetStackTracePPvii" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_RegisterThriftProtocol" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_mallctl" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -Wl,-U,_malloc_stats_print" +fi +append_linking() { + if [ -f $1/lib${2}.a ]; then + if [ "$SYSTEM" = "Darwin" ]; then + # *.a must be explicitly specified in clang + STATIC_LINKINGS="$STATIC_LINKINGS $1/lib${2}.a" + else + STATIC_LINKINGS="$STATIC_LINKINGS -l$2" + fi + export STATICALLY_LINKED_$2=1 + else + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -l$2" + export STATICALLY_LINKED_$2=0 + fi +} + +GFLAGS_LIB=$(find_dir_of_lib_or_die gflags) +append_linking $GFLAGS_LIB gflags +print_success "Found gflags: $GFLAGS_LIB" + +PROTOBUF_LIB=$(find_dir_of_lib_or_die protobuf) +append_linking $PROTOBUF_LIB protobuf +print_success "Found protobuf: $PROTOBUF_LIB" + +LEVELDB_LIB=$(find_dir_of_lib_or_die leveldb) +print_success "Found leveldb: $LEVELDB_LIB" +# required by leveldb +if [ -f $LEVELDB_LIB/libleveldb.a ]; then + if [ -f $LEVELDB_LIB/libleveldb.$SO ]; then + if $LDD $LEVELDB_LIB/libleveldb.$SO | grep -q libsnappy; then + SNAPPY_LIB=$(find_dir_of_lib snappy) + REQUIRE_SNAPPY="yes" + fi + fi + if [ -z "$REQUIRE_SNAPPY" ]; then + if [ "$SYSTEM" = "Darwin" ]; then + STATIC_LINKINGS="$STATIC_LINKINGS $LEVELDB_LIB/libleveldb.a" + else + STATIC_LINKINGS="$STATIC_LINKINGS -lleveldb" + fi + elif [ -f $SNAPPY_LIB/libsnappy.a ]; then + if [ "$SYSTEM" = "Darwin" ]; then + STATIC_LINKINGS="$STATIC_LINKINGS $LEVELDB_LIB/libleveldb.a $SNAPPY_LIB/libsnappy.a" + else + STATIC_LINKINGS="$STATIC_LINKINGS -lleveldb -lsnappy" + fi + else + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -lleveldb" + fi +else + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -lleveldb" +fi + +PROTOC=$(find_bin_or_die protoc) +print_success "Found protoc: $PROTOC" + +GFLAGS_HDR=$(find_dir_of_header_or_die gflags/gflags.h) + +PROTOBUF_HDR=$(find_dir_of_header_or_die google/protobuf/message.h) +PROTOBUF_VERSION=$(grep '#define GOOGLE_PROTOBUF_VERSION [0-9]\+' $PROTOBUF_HDR/google/protobuf/stubs/common.h | awk '{print $3}') +if [ "$PROTOBUF_VERSION" -ge 4022000 ]; then + # from v22, utf8_validity should be explicitly linked + # https://github.com/protocolbuffers/protobuf/blob/a847a8dc4ba1d99e7ba917146c84438b4de7d085/cmake/libprotobuf.cmake#L47 + UTF8_VALIDITY_LIB=$(find_dir_of_lib utf8_validity) + append_linking "$UTF8_VALIDITY_LIB" utf8_validity + + ABSL_HDR=$(find_dir_of_header_or_die absl/base/config.h) + ABSL_LIB=$(find_dir_of_lib_or_die absl_strings) + ABSL_TARGET_NAMES=" + absl_bad_optional_access + absl_bad_variant_access + absl_base + absl_city + absl_civil_time + absl_cord + absl_cord_internal + absl_cordz_functions + absl_cordz_handle + absl_cordz_info + absl_crc32c + absl_crc_cord_state + absl_crc_cpu_detect + absl_crc_internal + absl_debugging_internal + absl_demangle_internal + absl_die_if_null + absl_examine_stack + absl_exponential_biased + absl_flags + absl_flags_commandlineflag + absl_flags_commandlineflag_internal + absl_flags_config + absl_flags_internal + absl_flags_marshalling + absl_flags_private_handle_accessor + absl_flags_program_name + absl_flags_reflection + absl_graphcycles_internal + absl_hash + absl_hashtablez_sampler + absl_int128 + absl_kernel_timeout_internal + absl_leak_check + absl_log_entry + absl_log_globals + absl_log_initialize + absl_log_internal_check_op + absl_log_internal_conditions + absl_log_internal_format + absl_log_internal_globals + absl_log_internal_log_sink_set + absl_log_internal_message + absl_log_internal_nullguard + absl_log_internal_proto + absl_log_severity + absl_log_sink + absl_low_level_hash + absl_malloc_internal + absl_raw_hash_set + absl_raw_logging_internal + absl_spinlock_wait + absl_stacktrace + absl_status + absl_statusor + absl_str_format_internal + absl_strerror + absl_string_view + absl_strings + absl_strings_internal + absl_symbolize + absl_synchronization + absl_throw_delegate + absl_time + absl_time_zone + " + for i in $ABSL_TARGET_NAMES; do + # ignore interface targets + if [ -n "$(find_dir_of_lib $i)" ]; then + append_linking "$ABSL_LIB" "$i" + fi + done + CXXFLAGS="-std=c++17" + print_success "Found protobuf version $PROTOBUF_VERSION (>= v22, using C++17 with abseil)" +else + CXXFLAGS="-std=c++0x" + print_success "Found protobuf version $PROTOBUF_VERSION" +fi + +CPPFLAGS= + +if [ $WITH_ASAN != 0 ]; then + CPPFLAGS="${CPPFLAGS} -fsanitize=address" + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -fsanitize=address" +fi + +LEVELDB_HDR=$(find_dir_of_header_or_die leveldb/db.h) + +if [ $WITH_BTHREAD_TRACER != 0 ]; then + if [ "$SYSTEM" != "Linux" ] || [ "$(uname -m)" != "x86_64" ]; then + >&2 $ECHO "bthread tracer is only supported on Linux x86_64 platform" + exit 1 + fi + LIBUNWIND_HDR=$(find_dir_of_header_or_die libunwind.h) + LIBUNWIND_LIB=$(find_dir_of_lib_or_die unwind) + ABSL_HDR=$(find_dir_of_header_or_die absl/base/config.h) + ABSL_LIB=$(find_dir_of_lib_or_die absl_symbolize) + + CPPFLAGS="${CPPFLAGS} -DBRPC_BTHREAD_TRACER" + + if [ -f "$LIBUNWIND_LIB/libunwind.$SO" ]; then + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -lunwind -lunwind-x86_64" + else + STATIC_LINKINGS="$STATIC_LINKINGS -lunwind -lunwind-x86_64" + fi + if [ -f "$ABSL_LIB/libabsl_base.$SO" ]; then + DYNAMIC_LINKINGS="$DYNAMIC_LINKINGS -labsl_stacktrace -labsl_symbolize -labsl_debugging_internal -labsl_demangle_internal -labsl_malloc_internal -labsl_raw_logging_internal -labsl_spinlock_wait -labsl_base" + else + STATIC_LINKINGS="$STATIC_LINKINGS -labsl_stacktrace -labsl_symbolize -labsl_debugging_internal -labsl_demangle_internal -labsl_malloc_internal -labsl_raw_logging_internal -labsl_spinlock_wait -labsl_base" + fi +fi + +HDRS=$($ECHO "$LIBUNWIND_HDR\n$GFLAGS_HDR\n$PROTOBUF_HDR\n$ABSL_HDR\n$LEVELDB_HDR\n$OPENSSL_HDR" | sort | uniq) +LIBS=$($ECHO "$LIBUNWIND_LIB\n$GFLAGS_LIB\n$PROTOBUF_LIB\n$ABSL_LIB\n$LEVELDB_LIB\n$OPENSSL_LIB\n$SNAPPY_LIB" | sort | uniq) + +absent_in_the_list() { + TMP=`$ECHO "$1\n$2" | sort | uniq` + if [ "${TMP}" = "$2" ]; then + return 1 + fi + return 0 +} + +OUTPUT_CONTENT="# Generated by config_brpc.sh, don't modify manually" +append_to_output() { + OUTPUT_CONTENT="${OUTPUT_CONTENT}\n$*" +} +# $1: libname, $2: indentation +append_to_output_headers() { + if absent_in_the_list "$1" "$HDRS"; then + append_to_output "${2}HDRS+=$1" + HDRS=`$ECHO "${HDRS}\n$1" | sort | uniq` + fi +} +# $1: libname, $2: indentation +append_to_output_libs() { + if absent_in_the_list "$1" "$LIBS"; then + append_to_output "${2}LIBS+=$1" + LIBS=`$ECHO "${LIBS}\n$1" | sort | uniq` + fi +} +# $1: libdir, $2: libname, $3: indentation +append_to_output_linkings() { + if [ -f $1/lib$2.a ]; then + append_to_output_libs $1 $3 + if [ "$SYSTEM" = "Darwin" ]; then + append_to_output "${3}STATIC_LINKINGS+=$1/lib$2.a" + else + append_to_output "${3}STATIC_LINKINGS+=-l$2" + fi + export STATICALLY_LINKED_$2=1 + else + append_to_output_libs $1 $3 + append_to_output "${3}DYNAMIC_LINKINGS+=-l$2" + export STATICALLY_LINKED_$2=0 + fi +} + +#can't use \n in texts because sh does not support -e +append_to_output "SYSTEM=$SYSTEM" +append_to_output "HDRS=$($ECHO $HDRS)" +append_to_output "LIBS=$($ECHO $LIBS)" +append_to_output "PROTOC=$PROTOC" +append_to_output "PROTOBUF_HDR=$PROTOBUF_HDR" +append_to_output "CC=$CC" +append_to_output "CXX=$CXX" +append_to_output "GCC_VERSION=$GCC_VERSION" +append_to_output "STATIC_LINKINGS=$STATIC_LINKINGS" +append_to_output "DYNAMIC_LINKINGS=$DYNAMIC_LINKINGS" + +# CPP means C PreProcessing, not C PlusPlus +CPPFLAGS="${CPPFLAGS} -DBRPC_WITH_GLOG=$WITH_GLOG -DBRPC_DEBUG_BTHREAD_SCHE_SAFETY=$BRPC_DEBUG_BTHREAD_SCHE_SAFETY -DBRPC_DEBUG_LOCK=$BRPC_DEBUG_LOCK" + +# Avoid over-optimizations of TLS variables by GCC>=4.8 +# See: https://github.com/apache/brpc/issues/1693 +CPPFLAGS="${CPPFLAGS} -D__const__=__unused__" + +if [ ! -z "$DEBUGSYMBOLS" ]; then + CPPFLAGS="${CPPFLAGS} $DEBUGSYMBOLS" +fi +if [ ! -z "$WERROR" ]; then + CPPFLAGS="${CPPFLAGS} $WERROR" +fi +if [ "$SYSTEM" = "Darwin" ]; then + CPPFLAGS="${CPPFLAGS} -Wno-deprecated-declarations -Wno-inconsistent-missing-override" + version=`sw_vers -productVersion | awk -F '.' '{print $1 "." $2}'` + if [[ `echo "$version<10.12" | bc -l` == 1 ]]; then + CPPFLAGS="${CPPFLAGS} -DNO_CLOCK_GETTIME_IN_MAC" + fi +fi + +if [ $WITH_THRIFT != 0 ]; then + THRIFT_LIB=$(find_dir_of_lib_or_die thriftnb) + THRIFT_HDR=$(find_dir_of_header_or_die thrift/Thrift.h) + append_to_output_libs "$THRIFT_LIB" + append_to_output_headers "$THRIFT_HDR" + + CPPFLAGS="${CPPFLAGS} -DENABLE_THRIFT_FRAMED_PROTOCOL" + + if [ -f "$THRIFT_LIB/libthriftnb.$SO" ]; then + append_to_output "DYNAMIC_LINKINGS+=-lthriftnb -levent -lthrift" + else + append_to_output "STATIC_LINKINGS+=-lthriftnb" + fi + # get thrift version + thrift_version=$(thrift --version | awk '{print $3}') + major=$(echo "$thrift_version" | awk -F '.' '{print $1}') + minor=$(echo "$thrift_version" | awk -F '.' '{print $2}') + if [ $((major)) -eq 0 -a $((minor)) -lt 11 ]; then + CPPFLAGS="${CPPFLAGS} -D_THRIFT_VERSION_LOWER_THAN_0_11_0_" + echo "less" + else + echo "greater" + fi +fi + +if [ $WITH_RDMA != 0 ]; then + RDMA_LIB=$(find_dir_of_lib_or_die ibverbs) + RDMA_HDR=$(find_dir_of_header_or_die infiniband/verbs.h) + append_to_output_libs "$RDMA_LIB" + append_to_output_headers "$RDMA_HDR" + + CPPFLAGS="${CPPFLAGS} -DBRPC_WITH_RDMA" + + append_to_output "DYNAMIC_LINKINGS+=-libverbs" + append_to_output "WITH_RDMA=1" +fi + +if [ $WITH_MESALINK != 0 ]; then + CPPFLAGS="${CPPFLAGS} -DUSE_MESALINK" +fi + +append_to_output "CPPFLAGS=${CPPFLAGS}" +append_to_output "# without the flag, linux+arm64 may crash due to folding on TLS. +ifeq (\$(CC),gcc) + ifeq (\$(shell uname -p),aarch64) + CPPFLAGS+=-fno-gcse + endif +endif +" + +# RISC-V Zvbc/Zbc support +if [ "$(uname -m)" = "riscv64" ]; then + if [ $WITH_RISCV_ZVBC != 0 ]; then + CXXFLAGS="${CXXFLAGS} -march=rv64gcv_zbc_zvbc" + print_success "RISC-V Zvbc enabled: -march=rv64gcv_zbc_zvbc" + elif [ $WITH_RISCV_ZBC != 0 ]; then + CXXFLAGS="${CXXFLAGS} -march=rv64gc_zbc" + print_success "RISC-V Zbc enabled: -march=rv64gc_zbc" + fi +fi + +append_to_output "CXXFLAGS=${CXXFLAGS}" + +append_to_output "ifeq (\$(NEED_LIBPROTOC), 1)" +PROTOC_LIB=$(find $PROTOBUF_LIB -name "libprotoc.*" | head -n1) +if [ -z "$PROTOC_LIB" ]; then + append_to_output " \$(error \"Fail to find libprotoc\")" +else + # libprotobuf and libprotoc must be linked same statically or dynamically + # otherwise the bin will crash. + if [ $STATICALLY_LINKED_protobuf -gt 0 ]; then + if [ "$SYSTEM" = "Darwin" ]; then + append_to_output " STATIC_LINKINGS+=$(find $PROTOBUF_LIB -name "libprotoc.a" | head -n1)" + else + append_to_output " STATIC_LINKINGS+=-lprotoc" + fi + else + append_to_output " DYNAMIC_LINKINGS+=-lprotoc" + fi +fi +append_to_output "endif" + +OLD_HDRS=$HDRS +OLD_LIBS=$LIBS +append_to_output "ifeq (\$(NEED_GPERFTOOLS), 1)" +# required by cpu/heap profiler +TCMALLOC_LIB=$(find_dir_of_lib tcmalloc_and_profiler) +if [ -z "$TCMALLOC_LIB" ]; then + append_to_output " \$(error \"Fail to find gperftools\")" +elif [ $WITH_ASAN != 0 ]; then + append_to_output " \$(error \"gperftools is not compatible with ASAN\")" +else + append_to_output " CPPFLAGS+=-DBRPC_ENABLE_CPU_PROFILER" + append_to_output_libs "$TCMALLOC_LIB" " " + if [ -f $TCMALLOC_LIB/libtcmalloc.$SO ]; then + append_to_output " DYNAMIC_LINKINGS+=-ltcmalloc_and_profiler" + else + if [ "$SYSTEM" = "Darwin" ]; then + append_to_output " STATIC_LINKINGS+=$TCMALLOC_LIB/libtcmalloc.a" + else + append_to_output " STATIC_LINKINGS+=-ltcmalloc_and_profiler" + fi + fi +fi +append_to_output "endif" + +if [ $WITH_GLOG != 0 ]; then + GLOG_LIB=$(find_dir_of_lib_or_die glog) + GLOG_HDR=$(find_dir_of_header_or_die glog/logging.h windows/glog/logging.h) + append_to_output_libs "$GLOG_LIB" + append_to_output_headers "$GLOG_HDR" + if [ -f "$GLOG_LIB/libglog.$SO" ]; then + append_to_output "DYNAMIC_LINKINGS+=-lglog" + else + if [ "$SYSTEM" = "Darwin" ]; then + append_to_output "STATIC_LINKINGS+=$GLOG_LIB/libglog.a" + else + append_to_output "STATIC_LINKINGS+=-lglog" + fi + fi +fi + +# required by UT +#gtest +GTEST_LIB=$(find_dir_of_lib gtest) +HDRS=$OLD_HDRS +LIBS=$OLD_LIBS +append_to_output "ifeq (\$(NEED_GTEST), 1)" +if [ -z "$GTEST_LIB" ]; then + append_to_output " \$(error \"Fail to find gtest\")" +else + GTEST_HDR=$(find_dir_of_header_or_die gtest/gtest.h) + append_to_output_libs $GTEST_LIB " " + append_to_output_headers $GTEST_HDR " " + append_to_output_linkings $GTEST_LIB gtest " " + append_to_output_linkings $GTEST_LIB gtest_main " " +fi +append_to_output "endif" + +# generate src/butil/config.h +cat << EOF > src/butil/config.h +// This file is auto-generated by $(basename "$0"). DON'T edit it! +#ifndef BUTIL_CONFIG_H +#define BUTIL_CONFIG_H + +#ifdef BRPC_WITH_GLOG +#undef BRPC_WITH_GLOG +#endif +#define BRPC_WITH_GLOG $WITH_GLOG + +#endif // BUTIL_CONFIG_H +EOF + +print_step "Generating output files" + +# write to config.mk +$ECHO "$OUTPUT_CONTENT" > config.mk +print_success "Generated config.mk" +print_success "Generated src/butil/config.h" + +printf "\n" +print_step "Configuration complete" +print_info "Compiler: $CC / $CXX" +print_info "C++ std: $CXXFLAGS" +print_info "System: $SYSTEM" +if [ $WITH_GLOG -ne 0 ]; then print_info "With glog: yes"; fi +if [ $WITH_THRIFT -ne 0 ]; then print_info "With thrift: yes"; fi +if [ $WITH_RDMA -ne 0 ]; then print_info "With RDMA: yes"; fi +if [ $WITH_MESALINK -ne 0 ]; then print_info "With MesaLink: yes"; fi +if [ $WITH_BTHREAD_TRACER -ne 0 ]; then print_info "With bthread tracer: yes"; fi +if [ $WITH_ASAN -ne 0 ]; then print_info "With ASAN: yes"; fi +printf "\n${GREEN}brpc is now configured. You can build it with 'make'.${NC}\n" diff --git a/docs/cn/atomic_instructions.md b/docs/cn/atomic_instructions.md new file mode 100644 index 0000000..e5a14cb --- /dev/null +++ b/docs/cn/atomic_instructions.md @@ -0,0 +1,107 @@ +[English version](../en/atomic_instructions.md) + +我们都知é“多核编程常用é”é¿å…多个线程在修改åŒä¸€ä¸ªæ•°æ®æ—¶äº§ç”Ÿ[race condition](http://en.wikipedia.org/wiki/Race_condition)ã€‚å½“é”æˆä¸ºæ€§èƒ½ç“¶é¢ˆæ—¶ï¼Œæˆ‘ä»¬åˆæ€»æƒ³è¯•ç€ç»•开它,而ä¸å¯é¿å…åœ°æŽ¥è§¦äº†åŽŸå­æŒ‡ä»¤ã€‚ä½†åœ¨å®žè·µä¸­ï¼Œç”¨åŽŸå­æŒ‡ä»¤å†™å‡ºæ­£ç¡®çš„ä»£ç æ˜¯ä¸€ä»¶éžå¸¸å›°éš¾çš„事,ç¢ç£¨ä¸é€çš„race conditionã€[ABA problem](https://en.wikipedia.org/wiki/ABA_problem)ã€[memory fence](https://en.wikipedia.org/wiki/Memory_barrier)很烧脑,这篇文章试图通过介ç»[SMP](http://en.wikipedia.org/wiki/Symmetric_multiprocessing)æž¶æž„ä¸‹çš„åŽŸå­æŒ‡ä»¤å¸®åŠ©å¤§å®¶å…¥é—¨ã€‚C++11æ­£å¼å¼•入了[åŽŸå­æŒ‡ä»¤](http://en.cppreference.com/w/cpp/atomic/atomic),我们就以其语法æè¿°ã€‚ + +é¡¾åæ€ä¹‰ï¼ŒåŽŸå­æŒ‡ä»¤æ˜¯**对软件**ä¸å¯å†åˆ†çš„æŒ‡ä»¤ï¼Œæ¯”如x.fetch_add(n)指原å­åœ°ç»™x加上n,这个指令**对软件**è¦ä¹ˆæ²¡åšï¼Œè¦ä¹ˆå®Œæˆï¼Œä¸ä¼šè§‚察到中间状æ€ã€‚常è§çš„åŽŸå­æŒ‡ä»¤æœ‰ï¼š + +| åŽŸå­æŒ‡ä»¤ (xå‡ä¸ºstd::atomic) | 作用 | +| ---------------------------------------- | ---------------------------------------- | +| x.load() | 返回x的值。 | +| x.store(n) | 把x设为n,什么都ä¸è¿”回。 | +| x.exchange(n) | 把x设为n,返回设定之å‰çš„值。 | +| x.compare_exchange_strong(expected_ref, desired) | è‹¥x等于expected_ref,则设为desired,返回æˆåŠŸï¼›å¦åˆ™æŠŠæœ€æ–°å€¼å†™å…¥expected_ref,返回失败。 | +| x.compare_exchange_weak(expected_ref, desired) | 相比compare_exchange_strongå¯èƒ½æœ‰[spurious wakeup](http://en.wikipedia.org/wiki/Spurious_wakeup)。 | +| x.fetch_add(n), x.fetch_sub(n) | 原å­åœ°åšx += n, x-= n,返回修改之å‰çš„值。 | + +ä½ å·²ç»å¯ä»¥ç”¨è¿™äº›æŒ‡ä»¤åšåŽŸå­è®¡æ•°ï¼Œæ¯”å¦‚å¤šä¸ªçº¿ç¨‹åŒæ—¶ç´¯åŠ ä¸€ä¸ªåŽŸå­å˜é‡ï¼Œä»¥ç»Ÿè®¡è¿™äº›çº¿ç¨‹å¯¹ä¸€äº›èµ„æºçš„æ“ä½œæ¬¡æ•°ã€‚ä½†æ˜¯ï¼Œè¿™å¯èƒ½ä¼šæœ‰ä¸¤ä¸ªé—®é¢˜ï¼š + +- 这个æ“作没有你想象地快。 +- 如果你å°è¯•通过看似简å•çš„åŽŸå­æ“作控制对一些资æºçš„è®¿é—®ï¼Œä½ çš„ç¨‹åºæœ‰å¾ˆå¤§å‡ çŽ‡ä¼šcrash。 + +# Cacheline + +没有任何竞争或åªè¢«ä¸€ä¸ªçº¿ç¨‹è®¿é—®çš„åŽŸå­æ“ä½œæ˜¯æ¯”è¾ƒå¿«çš„ï¼Œâ€œç«žäº‰â€æŒ‡çš„æ˜¯å¤šä¸ªçº¿ç¨‹åŒæ—¶è®¿é—®åŒä¸€ä¸ª[cacheline](https://en.wikipedia.org/wiki/CPU_cache#Cache_entries)。现代CPU为了以低价格获得高性能,大é‡ä½¿ç”¨äº†cache,并把cache分了多级。百度内常è§çš„Intel E5-2620拥有32Kçš„L1 dcacheå’Œicache,256Kçš„L2 cacheå’Œ15Mçš„L3 cache。其中L1å’ŒL2 cache为æ¯ä¸ªæ ¸å¿ƒç‹¬æœ‰ï¼ŒL3则所有核心共享。一个核心写入自己的L1 cache是æžå¿«çš„(4 cycles, ~2ns),但当å¦ä¸€ä¸ªæ ¸å¿ƒè¯»æˆ–写åŒä¸€å¤„内存时,它得确认看到其他核心中对应的cacheline。对于软件æ¥è¯´ï¼Œè¿™ä¸ªè¿‡ç¨‹æ˜¯åŽŸå­çš„,ä¸èƒ½åœ¨ä¸­é—´ç©¿æ’其他代ç ï¼Œåªèƒ½ç­‰å¾…CPU完æˆ[ä¸€è‡´æ€§åŒæ­¥](https://en.wikipedia.org/wiki/Cache_coherence)ï¼Œè¿™ä¸ªå¤æ‚çš„ç¡¬ä»¶ç®—æ³•ä½¿å¾—åŽŸå­æ“作会å˜å¾—很慢,在E5-2620上竞争激烈时fetch_add会耗费700纳秒左å³ã€‚访问被多个线程频ç¹å…±äº«çš„内存往往是比较慢的。比如åƒä¸€äº›åœºæ™¯ä¸´ç•ŒåŒºçœ‹ç€å¾ˆå°ï¼Œä½†ä¿æŠ¤å®ƒçš„spinlock性能ä¸ä½³ï¼Œå› ä¸ºspinlock使用的exchange, fetch_add等指令必须等待最新的cachelineï¼Œçœ‹ä¸ŠåŽ»åªæœ‰å‡ æ¡æŒ‡ä»¤ï¼ŒèŠ±è´¹è‹¥å¹²å¾®ç§’å¹¶ä¸å¥‡æ€ªã€‚ + +è¦æé«˜æ€§èƒ½ï¼Œå°±è¦é¿å…让CPU频ç¹åŒæ­¥cacheline。这ä¸å•å’ŒåŽŸå­æŒ‡ä»¤æœ¬èº«çš„æ€§èƒ½æœ‰å…³ï¼Œè¿˜ä¼šå½±å“到程åºçš„æ•´ä½“性能。最有效的解决方法很直白:**å°½é‡é¿å…共享**。 + +- 一个ä¾èµ–全局多生产者多消费者队列(MPMC)的程åºéš¾æœ‰å¾ˆå¥½çš„多核扩展性,因为这个队列的æžé™åžåå–å†³äºŽåŒæ­¥cacheçš„å»¶æ—¶ï¼Œè€Œä¸æ˜¯æ ¸å¿ƒçš„个数。最好是用多个SPMC或多个MPSC队列,甚至多个SPSC队列代替,在æºå¤´å°±è§„é¿æŽ‰ç«žäº‰ã€‚ +- å¦ä¸€ä¸ªä¾‹å­æ˜¯è®¡æ•°å™¨ï¼Œå¦‚果所有线程都频ç¹ä¿®æ”¹ä¸€ä¸ªè®¡æ•°å™¨ï¼Œæ€§èƒ½å°±ä¼šå¾ˆå·®ï¼ŒåŽŸå› åŒæ ·åœ¨äºŽä¸åŒçš„æ ¸å¿ƒåœ¨ä¸åœåœ°åŒæ­¥åŒä¸€ä¸ªcachelineã€‚å¦‚æžœè¿™ä¸ªè®¡æ•°å™¨åªæ˜¯ç”¨ä½œæ‰“打日志之类的,那我们完全å¯ä»¥è®©æ¯ä¸ªçº¿ç¨‹ä¿®æ”¹thread-localå˜é‡ï¼Œåœ¨éœ€è¦æ—¶å†åˆå¹¶æ‰€æœ‰çº¿ç¨‹ä¸­çš„值,性能å¯èƒ½æœ‰[几åå€çš„差别](bvar.md)。 + +一个相关的编程陷阱是false sharingï¼šå¯¹é‚£äº›ä¸æ€Žä¹ˆè¢«ä¿®æ”¹ç”šè‡³åªè¯»å˜é‡çš„访问,由于åŒä¸€ä¸ªcacheline中的其他å˜é‡è¢«é¢‘ç¹ä¿®æ”¹ï¼Œè€Œä¸å¾—ä¸ç»å¸¸ç­‰å¾…cachelineåŒæ­¥è€Œæ˜¾è‘—å˜æ…¢äº†ã€‚多线程中的å˜é‡å°½é‡æŒ‰è®¿é—®è§„律排列,频ç¹è¢«å…¶ä»–线程修改的å˜é‡è¦æ”¾åœ¨ç‹¬ç«‹çš„cacheline中。è¦è®©ä¸€ä¸ªå˜é‡æˆ–结构体按cacheline对é½ï¼Œå¯ä»¥include \åŽä½¿ç”¨BAIDU_CACHELINE_ALIGNMENTå®ï¼Œè¯·è‡ªè¡Œgrep brpc的代ç äº†è§£ç”¨æ³•。 + +# Memory fence + +ä»…é åŽŸå­æŠ€æœ¯å®žçŽ°ä¸äº†å¯¹èµ„æºçš„访问控制,å³ä½¿ç®€å•如[spinlock](https://en.wikipedia.org/wiki/Spinlock)或[引用计数](https://en.wikipedia.org/wiki/Reference_counting),看上去正确的代ç ä¹Ÿå¯èƒ½ä¼šcrash。这里的关键在于**é‡æŽ’æŒ‡ä»¤**导致了读写顺åºçš„å˜åŒ–。åªè¦æ²¡æœ‰ä¾èµ–,代ç ä¸­åœ¨åŽé¢çš„æŒ‡ä»¤å°±å¯èƒ½è·‘到å‰é¢åŽ»ï¼Œ[编译器](http://preshing.com/20120625/memory-ordering-at-compile-time/)å’Œ[CPU](https://en.wikipedia.org/wiki/Out-of-order_execution)都会这么åšã€‚ + +这么åšçš„动机éžå¸¸è‡ªç„¶ï¼ŒCPUè¦å°½é‡å¡žæ»¡æ¯ä¸ªcycle,在å•使—¶é—´å†…è¿è¡Œå°½é‡å¤šçš„æŒ‡ä»¤ã€‚如上节中æåˆ°çš„,访存指令在等待cachelineåŒæ­¥æ—¶è¦èŠ±è´¹æ•°ç™¾çº³ç§’ï¼Œæœ€é«˜æ•ˆåœ°è‡ªç„¶æ˜¯åŒæ—¶åŒæ­¥å¤šä¸ªcachelineï¼Œè€Œä¸æ˜¯ä¸€ä¸ªä¸ªåšã€‚一个线程在代ç ä¸­å¯¹å¤šä¸ªå˜é‡çš„便¬¡ä¿®æ”¹ï¼Œå¯èƒ½ä¼šä»¥ä¸åŒçš„æ¬¡åºåŒæ­¥åˆ°å¦ä¸€ä¸ªçº¿ç¨‹æ‰€åœ¨çš„æ ¸å¿ƒä¸Šã€‚ä¸åŒçº¿ç¨‹å¯¹æ•°æ®çš„需求ä¸åŒï¼ŒæŒ‰éœ€åŒæ­¥ä¹Ÿä¼šå¯¼è‡´cacheline的读åºå’Œå†™åºä¸åŒã€‚ + +如果其中第一个å˜é‡æ‰®æ¼”了开关的作用,控制对åŽç»­å˜é‡çš„访问。那么当这些å˜é‡è¢«ä¸€èµ·åŒæ­¥åˆ°å…¶ä»–核心时,更新顺åºå¯èƒ½å˜äº†ï¼Œç¬¬ä¸€ä¸ªå˜é‡æœªå¿…是第一个更新的,然而其他线程还认为它代表ç€å…¶ä»–å˜é‡æœ‰æ•ˆï¼ŒåŽ»è®¿é—®äº†å®žé™…å·²è¢«åˆ é™¤çš„å˜é‡ï¼Œä»Žè€Œå¯¼è‡´æœªå®šä¹‰çš„行为。比如下é¢çš„代ç ç‰‡æ®µï¼š + +```c++ +// Thread 1 +// bool ready was initialized to false +p.init(); +ready = true; +``` + +```c++ +// Thread2 +if (ready) { + p.bar(); +} +``` +从人的角度,这是对的,因为线程2在ready为trueæ—¶æ‰ä¼šè®¿é—®p,按线程1的逻辑,此时p应该åˆå§‹åŒ–好了。但对多核机器而言,这段代ç å¯èƒ½éš¾ä»¥æ­£å¸¸è¿è¡Œï¼š + +- 线程1中的ready = trueå¯èƒ½ä¼šè¢«ç¼–译器或cpué‡æŽ’åˆ°p.init()之å‰ï¼Œä»Žè€Œä½¿çº¿ç¨‹2看到ready为true时,pä»ç„¶æœªåˆå§‹åŒ–ã€‚è¿™ç§æƒ…å†µåŒæ ·ä¹Ÿä¼šåœ¨çº¿ç¨‹2中å‘生,p.bar()中的一些代ç å¯èƒ½è¢«é‡æŽ’到检查ready之å‰ã€‚ +- å³ä½¿æ²¡æœ‰é‡æŽ’,readyå’Œpçš„å€¼ä¹Ÿä¼šç‹¬ç«‹åœ°åŒæ­¥åˆ°çº¿ç¨‹2所在核心的cache,线程2ä»ç„¶å¯èƒ½åœ¨çœ‹åˆ°ready为true时看到未åˆå§‹åŒ–çš„p。 + +注:x86/x64çš„load带acquire语æ„,store带release语æ„,上é¢çš„代ç åˆ¨é™¤ç¼–译器和CPUå› ç´ å¯ä»¥æ­£ç¡®è¿è¡Œã€‚ + +通过这个简å•例å­ï¼Œä½ å¯ä»¥çª¥è§åŽŸå­æŒ‡ä»¤ç¼–ç¨‹çš„å¤æ‚性了å§ã€‚为了解决这个问题,CPU和编译器æä¾›äº†[memory fence](http://en.wikipedia.org/wiki/Memory_barrier),让用户å¯ä»¥å£°æ˜Žè®¿å­˜æŒ‡ä»¤é—´çš„å¯è§æ€§(visibility)关系,boostå’ŒC++11对memory fenceåšäº†æŠ½è±¡ï¼Œæ€»ç»“为如下几ç§[memory order](http://en.cppreference.com/w/cpp/atomic/memory_order). + +| memory order | 作用 | +| -------------------- | ---------------------------------------- | +| memory_order_relaxed | 没有fencing作用 | +| memory_order_consume | åŽé¢ä¾èµ–此原å­å˜é‡çš„è®¿å­˜æŒ‡ä»¤å‹¿é‡æŽ’è‡³æ­¤æ¡æŒ‡ä»¤ä¹‹å‰ | +| memory_order_acquire | åŽé¢è®¿å­˜æŒ‡ä»¤å‹¿é‡æŽ’è‡³æ­¤æ¡æŒ‡ä»¤ä¹‹å‰ | +| memory_order_release | å‰é¢è®¿å­˜æŒ‡ä»¤å‹¿é‡æŽ’è‡³æ­¤æ¡æŒ‡ä»¤ä¹‹åŽã€‚å½“æ­¤æ¡æŒ‡ä»¤çš„结果对其他线程å¯è§åŽï¼Œä¹‹å‰çš„æ‰€æœ‰æŒ‡ä»¤éƒ½å¯è§ | +| memory_order_acq_rel | acquire + releaseè¯­æ„ | +| memory_order_seq_cst | acq_rel语æ„外加所有使用seq_cst的指令有严格地全åºå…³ç³» | + +有了memory order,上é¢çš„例å­å¯ä»¥è¿™ä¹ˆæ›´æ­£ï¼š + +```c++ +// Thread1 +// std::atomic ready was initialized to false +p.init(); +ready.store(true, std::memory_order_release); +``` + +```c++ +// Thread2 +if (ready.load(std::memory_order_acquire)) { + p.bar(); +} +``` + +线程2中的acquire和线程1çš„releaseé…对,确ä¿çº¿ç¨‹2在看到ready==true时能看到线程1 release之剿‰€æœ‰çš„访存æ“作。 + +注æ„,memory fenceä¸ç­‰äºŽå¯è§æ€§ï¼Œå³ä½¿çº¿ç¨‹2æ°å¥½åœ¨çº¿ç¨‹1在把ready设置为trueåŽè¯»å–了readyä¹Ÿä¸æ„味ç€å®ƒèƒ½çœ‹åˆ°trueï¼Œå› ä¸ºåŒæ­¥cache是有延时的。memory fenceä¿è¯çš„æ˜¯å¯è§æ€§çš„顺åºï¼šâ€œå‡å¦‚我看到了a的最新值,那么我一定也得看到b的最新值â€ã€‚ + +一个相关问题是:如何知é“çœ‹åˆ°çš„å€¼æ˜¯æ–°è¿˜æ˜¯æ—§ï¼Ÿä¸€èˆ¬åˆ†ä¸¤ç§æƒ…况: + +- 值是特殊的。比如在上é¢çš„例å­ä¸­ï¼Œready=true是个特殊值,åªè¦çº¿ç¨‹2看到ready为trueå°±æ„å‘³ç€æ›´æ–°äº†ã€‚åªè¦è®¾å®šäº†ç‰¹æ®Šå€¼ï¼Œè¯»åˆ°æˆ–没有读到特殊值都代表了一ç§å«ä¹‰ã€‚ +- 总是累加。一些场景下没有特殊值,那我们就用fetch_add之类的指令累加一个å˜é‡ï¼Œåªè¦å˜é‡çš„å€¼åŸŸè¶³å¤Ÿå¤§ï¼Œåœ¨å¾ˆé•¿ä¸€æ®µæ—¶é—´å†…ï¼Œæ–°å€¼å’Œä¹‹å‰æ‰€æœ‰çš„æ—§å€¼éƒ½ä¼šä¸ç›¸åŒï¼Œæˆ‘们就能区分彼此了。 + +åŽŸå­æŒ‡ä»¤çš„例å­å¯ä»¥çœ‹boost.atomicçš„[Example](http://www.boost.org/doc/libs/1_56_0/doc/html/atomic/usage_examples.html),atomic的官方æè¿°å¯ä»¥çœ‹[这里](http://en.cppreference.com/w/cpp/atomic/atomic)。 + +# wait-free & lock-free + +åŽŸå­æŒ‡ä»¤èƒ½ä¸ºæˆ‘们的æœåŠ¡èµ‹äºˆä¸¤ä¸ªé‡è¦å±žæ€§ï¼š[wait-free](http://en.wikipedia.org/wiki/Non-blocking_algorithm#Wait-freedom)å’Œ[lock-free](http://en.wikipedia.org/wiki/Non-blocking_algorithm#Lock-freedom)。å‰è€…指ä¸ç®¡OS如何调度线程,æ¯ä¸ªçº¿ç¨‹éƒ½å§‹ç»ˆåœ¨åšæœ‰ç”¨çš„äº‹ï¼›åŽè€…比å‰è€…弱一些,指ä¸ç®¡OSå¦‚ä½•è°ƒåº¦çº¿ç¨‹ï¼Œè‡³å°‘æœ‰ä¸€ä¸ªçº¿ç¨‹åœ¨åšæœ‰ç”¨çš„事。如果我们的æœåŠ¡ä¸­ä½¿ç”¨äº†é”,那么OSå¯èƒ½æŠŠä¸€ä¸ªåˆšèŽ·å¾—é”的线程切æ¢å‡ºåŽ»ï¼Œè¿™æ—¶å€™æ‰€æœ‰ä¾èµ–这个é”çš„çº¿ç¨‹éƒ½åœ¨ç­‰å¾…ï¼Œè€Œæ²¡æœ‰åšæœ‰ç”¨çš„事,所以用了é”就䏿˜¯lock-free,更ä¸ä¼šæ˜¯wait-free。为了确ä¿ä¸€ä»¶äº‹æƒ…总在确定时间内完æˆï¼Œå®žæ—¶ç³»ç»Ÿçš„关键代ç è‡³å°‘是lock-free的。在百度广泛åˆå¤šæ ·çš„在线æœåŠ¡ä¸­ï¼Œå¯¹æ—¶æ•ˆæ€§ä¹Ÿæœ‰ç€ä¸¥è‹›çš„è¦æ±‚,如果RPC中最关键的部分满足wait-free或lock-free,就å¯ä»¥æä¾›æ›´ç¨³å®šçš„æœåŠ¡è´¨é‡ã€‚事实上,brpc中的读写都是wait-free的,具体è§[IO](io.md)。 + +值得æé†’çš„æ˜¯ï¼Œå¸¸è§æƒ³æ³•是lock-free或wait-free的算法会更快,但事实å¯èƒ½ç›¸å,因为: + +- lock-freeå’Œwait-freeå¿…é¡»å¤„ç†æ›´å¤šæ›´å¤æ‚çš„race conditionå’ŒABA problem,完æˆç›¸åŒç›®çš„çš„ä»£ç æ¯”ç”¨é”æ›´å¤æ‚。代ç è¶Šå¤šï¼Œè€—时就越长。 +- 使用mutex的算法å˜ç›¸å¸¦â€œåŽé€€â€æ•ˆæžœã€‚åŽé€€(backoff)指出现竞争时å°è¯•å¦ä¸€ä¸ªé€”径以临时é¿å…竞争,mutex出现竞争时会使调用者ç¡çœ ï¼Œä½¿æ‹¿åˆ°é”的那个线程å¯ä»¥å¾ˆå¿«åœ°ç‹¬å å®Œæˆä¸€ç³»åˆ—æµç¨‹ï¼Œæ€»ä½“åžåå¯èƒ½å而高了。 + +mutex导致低性能往往是因为临界区过大(é™åˆ¶äº†å¹¶å‘度),或竞争过于激烈(上下文切æ¢å¼€é”€å˜å¾—çªå‡ºï¼‰ã€‚lock-free/wait-free算法的价值在于其ä¿è¯äº†ä¸€ä¸ªæˆ–æ‰€æœ‰çº¿ç¨‹å§‹ç»ˆåœ¨åšæœ‰ç”¨çš„äº‹ï¼Œè€Œä¸æ˜¯ç»å¯¹çš„é«˜æ€§èƒ½ã€‚ä½†åœ¨ä¸€ç§æƒ…况下lock-freeå’Œwait-freeç®—æ³•çš„æ€§èƒ½å¤šåŠæ›´é«˜ï¼šå°±æ˜¯ç®—法本身å¯ä»¥ç”¨å°‘é‡åŽŸå­æŒ‡ä»¤å®žçŽ°ã€‚å®žçŽ°é”也是è¦ç”¨åŽŸå­æŒ‡ä»¤çš„ï¼Œå½“ç®—æ³•æœ¬èº«ç”¨ä¸€ä¸¤æ¡æŒ‡ä»¤å°±èƒ½å®Œæˆçš„æ—¶å€™ï¼Œç›¸æ¯”é¢å¤–用é”肯定是更快了。 diff --git a/docs/cn/auto_concurrency_limiter.md b/docs/cn/auto_concurrency_limiter.md new file mode 100644 index 0000000..342e9ba --- /dev/null +++ b/docs/cn/auto_concurrency_limiter.md @@ -0,0 +1,174 @@ +# è‡ªé€‚åº”é™æµ + +æœåŠ¡çš„å¤„ç†èƒ½åŠ›æ˜¯æœ‰å®¢è§‚ä¸Šé™çš„。当请求速度超过æœåŠ¡çš„å¤„ç†é€Ÿåº¦æ—¶ï¼ŒæœåŠ¡å°±ä¼šè¿‡è½½ã€‚ + +如果æœåŠ¡æŒç»­è¿‡è½½ï¼Œä¼šå¯¼è‡´è¶Šæ¥è¶Šå¤šçš„请求积压,最终所有的请求都必须等待较长时间æ‰èƒ½è¢«å¤„ç†ï¼Œä»Žè€Œä½¿æ•´ä¸ªæœåŠ¡å¤„äºŽç˜«ç—ªçŠ¶æ€ã€‚ + +ä¸Žä¹‹ç›¸å¯¹çš„ï¼Œå¦‚æžœç›´æŽ¥æ‹’ç»æŽ‰ä¸€éƒ¨åˆ†è¯·æ±‚ï¼Œå而能够让æœåŠ¡èƒ½å¤Ÿ"åŠæ—¶"å¤„ç†æ›´å¤šçš„请求。对应的方法就是[设置最大并å‘](https://github.com/apache/brpc/blob/master/docs/cn/server.md#%E9%99%90%E5%88%B6%E6%9C%80%E5%A4%A7%E5%B9%B6%E5%8F%91)。 + +è‡ªé€‚åº”é™æµèƒ½åЍæ€è°ƒæ•´æœåŠ¡çš„æœ€å¤§å¹¶å‘,在ä¿è¯æœåŠ¡ä¸è¿‡è½½çš„å‰æä¸‹ï¼Œè®©æœåС尽å¯èƒ½å¤šçš„处ç†è¯·æ±‚。 + +## 使用场景 +通常情况下è¦è®©æœåŠ¡ä¸è¿‡è½½ï¼Œåªéœ€åœ¨ä¸Šçº¿å‰è¿›è¡ŒåŽ‹åŠ›æµ‹è¯•ï¼Œå¹¶é€šè¿‡little's law计算出best_max_concurrencyå°±å¯ä»¥äº†ã€‚但在æœåŠ¡æ•°é‡å¤šï¼Œæ‹“æ‰‘å¤æ‚,且处ç†èƒ½åŠ›ä¼šé€æ¸å˜åŒ–的局é¢ä¸‹ï¼Œä½¿ç”¨å›ºå®šçš„æœ€å¤§å¹¶å‘会带æ¥å·¨å¤§çš„æµ‹è¯•工作é‡ï¼Œå¾ˆä¸æ–¹ä¾¿ã€‚è‡ªé€‚åº”é™æµå°±æ˜¯ä¸ºäº†è§£å†³è¿™ä¸ªé—®é¢˜ã€‚ + +ä½¿ç”¨è‡ªé€‚åº”é™æµå‰å»ºè®®åšåˆ°ï¼š +1. 客户端开å¯äº†é‡è¯•功能。 + +2. æœåŠ¡ç«¯æœ‰å¤šä¸ªèŠ‚ç‚¹ã€‚ + +这样当一个节点返回过载时,客户端å¯ä»¥å‘其他的节点å‘èµ·é‡è¯•,从而尽é‡ä¸ä¸¢å¤±æµé‡ã€‚ + +## 开坿–¹æ³• +ç›®å‰åªæœ‰method级别支æŒè‡ªé€‚åº”é™æµã€‚如果è¦ä¸ºæŸä¸ªmethodå¼€å¯è‡ªé€‚åº”é™æµï¼Œåªéœ€è¦å°†å®ƒçš„æœ€å¤§å¹¶å‘设置为"auto"å³å¯ã€‚ + +```c++ +// Set auto concurrency limiter for all methods +brpc::ServerOptions options; +options.method_max_concurrency = "auto"; + +// Set auto concurrency limiter for specific method +server.MaxConcurrencyOf("example.EchoService.Echo") = "auto"; +``` + +## åŽŸç† + +### åè¯ +**concurrency**: åŒæ—¶å¤„ç†çš„请求数,åˆè¢«ç§°ä¸ºâ€œå¹¶å‘度â€ã€‚ + +**max_concurrency**: 设置的最大并å‘度。超过并å‘的请求会被拒ç»ï¼ˆè¿”回ELIMIT错误),在集群层é¢ï¼Œclient应é‡è¯•到å¦ä¸€å°server上去。 + +**best_max_concurrency**: å¹¶å‘的物ç†å«ä¹‰æ˜¯ä»»åŠ¡å¤„ç†æ§½ä½ï¼Œå¤©ç„¶å­˜åœ¨ä¸Šé™ï¼Œè¿™ä¸ªä¸Šé™å°±æ˜¯best_max_concurrency。若max_concurrency设置的过大,则concurrencyå¯èƒ½å¤§äºŽbest_max_concurrencyï¼Œä»»åŠ¡å°†æ— æ³•è¢«åŠæ—¶å¤„ç†è€Œæš‚存在å„ç§é˜Ÿåˆ—中排队,系统也会进入拥塞状æ€ã€‚è‹¥max_concurrency设置的过å°ï¼Œåˆ™concurrency总是会å°äºŽbest_max_concurrency,é™åˆ¶ç³»ç»Ÿè¾¾åˆ°æœ¬å¯ä»¥è¾¾åˆ°çš„æ›´é«˜åžå。 + +**noload_latency**: å•纯处ç†ä»»åŠ¡çš„å»¶æ—¶ï¼Œä¸åŒ…括排队时间。å¦ä¸€ç§è§£é‡Šæ˜¯ä½Žè´Ÿè½½çš„延时。由于正确处ç†ä»»åС得ç»åŽ†å¿…è¦çš„环节,其中会耗费cpu或等待下游返回,noload_latency是一个æœåŠ¡å›ºæœ‰çš„å±žæ€§ï¼Œä½†å¯èƒ½é𿗶间逿¸æ”¹å˜ï¼ˆç”±äºŽå†…存碎片,压力å˜åŒ–,业务数æ®å˜åŒ–等因素)。 + +**min_latency**: 实际测定的latency中的较å°å€¼çš„ema,当concurrencyä¸å¤§äºŽbest_max_concurrency时,min_latencyå’Œnoload_latency接近(å¯èƒ½è½»å¾®ä¸Šå‡ï¼‰ã€‚ + +**peak_qps**: qps的上é™ã€‚æ³¨æ„æ˜¯å¤„ç†æˆ–回å¤çš„qpsè€Œä¸æ˜¯æŽ¥æ”¶çš„qps。值å–决于best_max_concurrency / noload_latency,这两个é‡éƒ½æ˜¯æœåŠ¡çš„å›ºæœ‰å±žæ€§ï¼Œæ•…peak_qps也是æœåŠ¡çš„å›ºæœ‰å±žæ€§ï¼Œå’Œæ‹¥å¡žçŠ¶å†µæ— å…³ï¼Œä½†å¯èƒ½é𿗶间逿¸æ”¹å˜ã€‚ + +**max_qps**: 实际测定的qps中的较大值。由于qps具有上é™ï¼Œmax_qps总是会å°äºŽpeak_qps,ä¸è®ºæ‹¥å¡žä¸Žå¦ã€‚ + +### Little's Law +在æœåŠ¡å¤„äºŽç¨³å®šçŠ¶æ€æ—¶: concurrency = latency * qps。 è¿™æ˜¯è‡ªé€‚åº”é™æµçš„ç†è®ºåŸºç¡€ã€‚ + +当æœåŠ¡æ²¡æœ‰è¶…è½½æ—¶ï¼Œéšç€æµé‡çš„上å‡ï¼Œlatency基本稳定(接近noload_latency),qpså’Œconcurrency呈线性关系一起上å‡ã€‚ + +当æµé‡è¶…过æœåŠ¡çš„peak_qps时,则concurrencyå’Œlatency会一起上å‡ï¼Œè€Œqps会稳定在peak_qps。 + +å‡å¦‚一个æœåŠ¡çš„peak_qpså’Œnoload_latency都比较稳定,那么它的best_max_concurrency = noload_latency * peak_qps。 + +è‡ªé€‚åº”é™æµå°±æ˜¯è¦æ‰¾åˆ°æœåŠ¡çš„noload_latencyå’Œpeak_qps, 并将最大并å‘设置为é è¿‘两者乘积的一个值。 + +### è®¡ç®—å…¬å¼ + +è‡ªé€‚åº”é™æµä¼šä¸æ–­çš„对请求进行采样,当采样窗å£çš„æ ·æœ¬æ•°é‡è¶³å¤Ÿæ—¶ï¼Œä¼šæ ¹æ®æ ·æœ¬çš„å¹³å‡å»¶è¿Ÿå’ŒæœåС当å‰çš„qps计算出下一个采样窗å£çš„max_concurrency: + +> max_concurrency = max_qps * ((2+alpha) * min_latency - latency) + +alphaä¸ºå¯æŽ¥å—的延时上å‡å¹…度,默认0.3。 + +latency是当å‰é‡‡æ ·çª—å£å†…所有请求的平å‡latency。 + +max_qps是最近一段时间测é‡åˆ°çš„qpsçš„æžå¤§å€¼ã€‚ + +min_latency是最近一段时间测é‡åˆ°çš„latency较å°å€¼çš„ema,是noload_latency的估算值。 + +注æ„:当计算出æ¥çš„ max_concurrency 和当å‰çš„ max_concurrency 的值ä¸åŒæ—¶ï¼Œæ¯æ¬¡å¯¹ max_concurrency 的调整的比例有一个上é™ï¼Œè®© max_concurrency +çš„[å˜åŒ–更为平滑](https://github.com/apache/brpc/blob/master/src/brpc/policy/auto_concurrency_limiter.cpp#L249)。 + +当æœåŠ¡å¤„äºŽä½Žè´Ÿè½½æ—¶ï¼Œmin_latency约等于noload_latency,此时计算出æ¥çš„max_concurrency会高于concurrency,但低于best_max_concurrency,给æµé‡ä¸Šæ¶¨ç•™æŽ¢ç´¢ç©ºé—´ã€‚而当æœåŠ¡è¿‡è½½æ—¶ï¼ŒæœåŠ¡çš„qps约等于max_qpsï¼ŒåŒæ—¶latency开始明显超过min_latency,此时max_concurrency则会接近concurrency,并通过定期衰å‡é¿å…远离best_max_concurrency,ä¿è¯æœåŠ¡ä¸ä¼šè¿‡è½½ã€‚ + + +### ä¼°ç®—noload_latency +æœåŠ¡çš„noload_latencyå¹¶éžæ˜¯ä¸€æˆä¸å˜çš„ï¼Œè‡ªé€‚åº”é™æµå¿…须能够正确的探测noload_latencyçš„å˜åŒ–。当noload_latency䏋陿—¶ï¼Œæ˜¯å¾ˆå®¹æ„ŸçŸ¥åˆ°çš„,因为这个时候latency也会下é™ã€‚难点在于当latency上涨时,需è¦èƒ½å¤Ÿæ­£ç¡®çš„辨别到底是æœåŠ¡è¿‡è½½äº†ï¼Œè¿˜æ˜¯noload_latency上涨了。 + +å¯èƒ½çš„æ–¹æ¡ˆæœ‰ï¼š +1. å–æœ€è¿‘一段时间的最å°latencyæ¥è¿‘ä¼¼noload_latency +2. å–æœ€è¿‘一段时间的latencyçš„å„ç§å¹³å‡å€¼æ¥é¢„测noload_latency +3. æ”¶é›†è¯·æ±‚çš„å¹³å‡æŽ’é˜Ÿç­‰å¾…æ—¶é—´ï¼Œä½¿ç”¨latency - queue_time作为noload_latency +4. æ¯éš”一段时间缩å°max_concurrencyï¼Œè¿‡ä¸€å°æ®µæ—¶é—´åŽä»¥æ­¤æ—¶çš„latency作为noload_latency + +方案1和方案2的问题在于:å‡å¦‚æœåŠ¡æŒç»­å¤„于高负载,那么最近的所有latency都会高出noload_latency,从而使得算法估计的noload_latency䏿–­å‡é«˜ã€‚ + +方案3的问题在于,å‡å¦‚æœåŠ¡çš„æ€§èƒ½ç“¶é¢ˆåœ¨ä¸‹æ¸¸æœåŠ¡ï¼Œé‚£ä¹ˆè¯·æ±‚åœ¨æœåŠ¡æœ¬èº«çš„æŽ’é˜Ÿç­‰å¾…æ—¶é—´æ— æ³•å应整体的负载情况。 + +方案4是最通用的,也ç»è¿‡äº†å¤§é‡å®žéªŒçš„考验。缩å°max_concurrency和公å¼ä¸­çš„alpha存在关è”。让我们åšä¸ªå‡æƒ³å®žéªŒï¼Œè‹¥latencyæžä¸ºç¨³å®šå¹¶éƒ½ç­‰äºŽmin_latency,那么公å¼ç®€åŒ–为max_concurrency = max_qps * latency * (1 + alpha)。根æ®little's law,qps最多为max_qps * (1 + alpha). alpha是qpsçš„"探索空间",若alpha为0,则qps被é”定为max_qps,算法å¯èƒ½æ— æ³•探索到peak_qps。但在qpså·²ç»è¾¾åˆ°peak_qps时,alpha会使延时上å‡ï¼ˆå·²æ‹¥å¡žï¼‰ï¼Œæ­¤æ—¶æµ‹å®šçš„min_latency会大于noload_latency,一轮轮下去最终会导致min_latency䏿”¶æ•›ã€‚定期é™ä½Žmax_concurrency就是阻止这个过程,并给min_latency䏋陿供"探索空间"。 + +#### å‡å°‘釿µ‹æ—¶çš„æµé‡æŸå¤± + +æ¯éš”ä¸€æ®µæ—¶é—´ï¼Œè‡ªé€‚åº”é™æµç®—法都会缩å°max_concurrency,并æŒç»­ä¸€æ®µæ—¶é—´ï¼Œç„¶åŽå°†æ­¤æ—¶çš„latency作为æœåŠ¡çš„noload_latency,以处ç†noload_latency上涨了的情况。测é‡noload_latency时,必须让先æœåŠ¡å¤„äºŽä½Žè´Ÿè½½çš„çŠ¶æ€ï¼Œå› æ­¤å¯¹max_concurrencyçš„ç¼©å°æ˜¯éš¾ä»¥é¿å…的。 + +由于max_concurrency < concurrency时,æœåŠ¡ä¼šæ‹’ç»æŽ‰æ‰€æœ‰çš„è¯·æ±‚ï¼Œé™æµç®—法将"排空所有的ç»åŽ†è¿‡æŽ’é˜Ÿç­‰å¾…çš„è¯·æ±‚çš„æ—¶é—´" 设置为 latency * 2 ,以确ä¿ç”¨äºŽè®¡ç®—min_latency的样本ç»å¤§éƒ¨åˆ†éƒ½æ˜¯æ²¡æœ‰ç»è¿‡æŽ’队等待的。 + +由于æœåŠ¡çš„latency通常都ä¸ä¼šå¤ªé•¿ï¼Œè¿™ç§åšæ³•æ‰€å¸¦æ¥çš„æµé‡æŸå¤±ä¹Ÿå¾ˆå°ã€‚ + +#### 应对抖动 +å³ä½¿æœåŠ¡è‡ªèº«æ²¡æœ‰è¿‡è½½ï¼Œlatency也会å‘生波动,根æ®Little's Law,latency的波动会导致serverçš„concurrencyå‘生波动。 + +æˆ‘ä»¬åœ¨è®¾è®¡è‡ªé€‚åº”é™æµçš„è®¡ç®—å…¬å¼æ—¶ï¼Œè€ƒè™‘到了latencyå‘生抖动的情况: +当latency与min_latency很接近时,根æ®è®¡ç®—å…¬å¼ä¼šå¾—到一个较高max_concurrencyæ¥é€‚应concurrency的波动,从而尽å¯èƒ½çš„å‡å°‘“误æ€â€ã€‚åŒæ—¶ï¼Œéšç€latencyçš„å‡é«˜ï¼Œmax_concurrencyä¼šé€æ¸é™ä½Žï¼Œä»¥ä¿æŠ¤æœåŠ¡ä¸ä¼šè¿‡è½½ã€‚ + +从å¦ä¸€ä¸ªè§’度æ¥è¯´ï¼Œå½“latency也开始å‡é«˜æ—¶ï¼Œé€šå¸¸æ„å‘³ç€æŸå¤„(ä¸ä¸€å®šæ˜¯æœåŠ¡æœ¬èº«ï¼Œä¹Ÿæœ‰å¯èƒ½æ˜¯ä¸‹æ¸¸æœåŠ¡)消耗了大é‡CPU资æºï¼Œè¿™ä¸ªæ—¶å€™ç¼©å°max_concurrency也是åˆç†çš„。 + +#### å¹³æ»‘å¤„ç† +为了å‡å°‘个别窗å£çš„æŠ–åŠ¨å¯¹é™æµç®—法的影å“ï¼ŒåŒæ—¶å°½é‡é™ä½Žè®¡ç®—开销,计算min_latency时会通过使用[EMA](https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average)æ¥è¿›è¡Œå¹³æ»‘处ç†ï¼š + +``` +if latency < min_latency: + min_latency = latency * ema_alpha + (1 - ema_alpha) * min_latency +else: + do_nothing +``` + +### ä¼°ç®—peak_qps + +#### æé«˜qps增长的速度 +当æœåŠ¡å¯åŠ¨æ—¶ï¼Œç”±äºŽæœåŠ¡æœ¬èº«éœ€è¦è¿›è¡Œä¸€ç³»åˆ—çš„åˆå§‹åŒ–,tcp本身也有慢å¯åŠ¨ç­‰ä¸€ç³»åˆ—åŽŸå› ã€‚æœåŠ¡åœ¨åˆšå¯åŠ¨æ—¶çš„qps一定会很低。这就导致了æœåŠ¡å¯åŠ¨æ—¶çš„max_concurrency也很低。而按照上é¢çš„计算公å¼ï¼Œå½“max_concurrency很低的时候,预留给qps增长的冗余concurrency也很低(å³ï¼šalpha * max_qps * min_latency)。从而会影å“当æµé‡å¢žåŠ æ—¶ï¼ŒæœåŠ¡max_concurrency的增加速度。 + +å‡å¦‚从å¯åŠ¨åˆ°æ‰“æ»¡qps的时间过长,这期间会æŸå¤±å¤§é‡æµé‡ã€‚在这里我们采å–的措施有两个, + +1. 采样方é¢ï¼Œä¸€æ—¦é‡‡åˆ°çš„请求数é‡è¶³å¤Ÿå¤šï¼Œç›´æŽ¥æäº¤å½“å‰é‡‡æ ·çª—å£ï¼Œè€Œä¸æ˜¯ç­‰å¾…采样窗å£çš„åˆ°æ—¶é—´äº†æ‰æäº¤ +2. è®¡ç®—å…¬å¼æ–¹é¢ï¼Œå½“current_qps > ä¿å­˜çš„max_qps时,直接进行更新,ä¸è¿›è¡Œå¹³æ»‘处ç†ã€‚ + +在进行了这两个处ç†ä¹‹åŽï¼Œç»å¤§éƒ¨åˆ†æƒ…况下都能够在2ç§’å·¦å³å°†qps打满。 + +#### å¹³æ»‘å¤„ç† +为了å‡å°‘个别窗å£çš„æŠ–åŠ¨å¯¹é™æµç®—法的影å“ï¼ŒåŒæ—¶å°½é‡é™ä½Žè®¡ç®—开销,在计算max_qps时,会通过使用[EMA](https://en.wikipedia.org/wiki/Moving_average#Exponential_moving_average)æ¥è¿›è¡Œå¹³æ»‘处ç†ï¼š + +``` +if current_qps > max_qps: + max_qps = current_qps +else: + max_qps = current_qps * ema_alpha / 10 + (1 - ema_alpha / 10) * max_qps +``` +å°†max_qpsçš„ema傿•°ç½®ä¸ºmin_latencyçš„ema傿•°çš„å分之一的原因是: max_qps 下é™äº†é€šå¸¸å¹¶ä¸æ„å‘³ç€æžé™qps也下é™äº†ã€‚而min_latency下é™äº†ï¼Œé€šå¸¸æ„味ç€noload_latency确实下é™äº†ã€‚ + +### 与netflix gradient算法的对比 + +netflix中的gradient算法公å¼ä¸ºï¼šmax_concurrency = min_latency / latency * max_concurrency + queue_size。 + +其中latency是采样窗å£çš„æœ€å°latency,min_latency是最近多个采样窗å£çš„æœ€å°latency。min_latency / latency就是算法中的"梯度",当latency大于min_latency时,max_concurrencyä¼šé€æ¸å‡å°‘ï¼›å之,max_concurrencyä¼šé€æ¸ä¸Šå‡ï¼Œä»Žè€Œè®©max_concurrency围绕在best_max_concurrency附近。 + +这个公å¼å¯ä»¥å’Œæœ¬æ–‡çš„算法进行类比: + +* gradient算法中的latency和本算法的ä¸åŒï¼Œå‰è€…çš„latency是最å°å€¼ï¼ŒåŽè€…是平å‡å€¼ã€‚netflixçš„åŽŸæ„æ˜¯æœ€å°å€¼èƒ½æ›´å¥½åœ°ä»£è¡¨noload_latency,但实际上åªè¦ä¸å¯¹max_concurrencyåšå®šæœŸè¡°å‡ï¼Œä¸ç®¡æœ€å°å€¼è¿˜æ˜¯å¹³å‡å€¼éƒ½æœ‰å¯èƒ½ä¸æ–­ä¸Šå‡ä½¿ç®—æ³•ä¸æ”¶æ•›ã€‚最å°å€¼å¹¶ä¸èƒ½å¸¦æ¥é¢å¤–的好处,å而会使算法更ä¸ç¨³å®šã€‚ +* gradient算法中的max_concurrency / latency从概念上和qps有关è”(根æ®little's law),但å¯èƒ½ä¸¥é‡è„±èŠ‚ã€‚æ¯”å¦‚åœ¨é‡æµ‹ +min_latencyå‰ï¼Œè‹¥æ‰€æœ‰latency都å°äºŽmin_latency,那么max_concurrencyä¼šä¸æ–­ä¸‹é™ç”šè‡³åˆ°0;但按照本算法,max_qpså’Œmin_latencyä»ç„¶æ˜¯ç¨³å®šçš„,它们计算出的max_concurrency也ä¸ä¼šå‰§çƒˆå˜åŠ¨ã€‚ç©¶å…¶æœ¬è´¨ï¼Œgradient算法在迭代max_concurrency时,latencyå¹¶ä¸èƒ½ä»£è¡¨å®žé™…å¹¶å‘为max_concurrency时的延时,两者是脱节的,所以max_concurrency / latency的实际物ç†å«ä¹‰ä¸æ˜Žï¼Œä¸Žqpså¯èƒ½å·®å¼‚甚大,最åŽå¯¼è‡´äº†å¾ˆå¤§çš„å差。 +* gradient算法的queue_size推è为sqrt(max_concurrency),这是ä¸åˆç†çš„。netflix对queue_sizeçš„ç†è§£å¤§æ¦‚是代表å„ç§ä¸å¯æŽ§çŽ¯èŠ‚çš„ç¼“å­˜ï¼Œæ¯”å¦‚socket里的,和max_concurrency存在一定的正å‘关系情有å¯åŽŸã€‚ä½†åœ¨æˆ‘ä»¬çš„ç†è§£ä¸­ï¼Œè¿™éƒ¨åˆ†queue_size作用微乎其微,没有或用常é‡å³å¯ã€‚我们关注的queue_size是给concurrency上å‡ç•™å‡ºçš„æŽ¢ç´¢ç©ºé—´: max_concurrency的更新是有延迟的,在并å‘从低到高的增长过程中,queue_size的作用就是在max_concurrencyæ›´æ–°å‰ä¸é™åˆ¶qps上å‡ã€‚而当concurrency高时,æœåŠ¡å¯èƒ½å·²ç»è¿‡è½½äº†ï¼Œqueue_size就应该å°ä¸€ç‚¹ï¼Œé˜²æ­¢è¿›ä¸€æ­¥æ¶åŒ–延时。这里的queue_sizeå’Œå¹¶å‘æ˜¯åå‘关系。 + +## 错误率惩罚阈值 + +`auto_cl_error_rate_punish_threshold`用于设置错误率"死区",低于该阈值的错误率ä¸ä¼šäº§ç”Ÿæƒ©ç½šï¼Œé¿å…å°‘é‡é”™è¯¯è¯·æ±‚对max_concurrency的过度影å“。 + +| GFlag | 默认值 | 有效范围 | 说明 | +|-------|--------|----------|------| +| auto_cl_error_rate_punish_threshold | 0 | [0, 1) | 错误率惩罚阈值,0表示ç¦ç”¨ | + +- **默认值为0**:ç¦ç”¨è¯¥åŠŸèƒ½ï¼Œä¿æŒåŽŸæœ‰è¡Œä¸º +- **设置为有效值(如0.1)**:错误率 ≤ 阈值时惩罚为0;错误率 > 阈值时惩罚线性增长 +- **无效值处ç†**:≥1 的值会被忽略,等åŒäºŽ0 + +**示例**: +``` +# 错误率低于10%æ—¶ä¸æƒ©ç½šï¼Œé«˜äºŽ10%时线性增加惩罚 +--auto_cl_error_rate_punish_threshold=0.1 +``` diff --git a/docs/cn/avalanche.md b/docs/cn/avalanche.md new file mode 100644 index 0000000..568feba --- /dev/null +++ b/docs/cn/avalanche.md @@ -0,0 +1,21 @@ +â€œé›ªå´©â€æŒ‡çš„æ˜¯è®¿é—®æœåŠ¡é›†ç¾¤æ—¶ç»å¤§éƒ¨åˆ†è¯·æ±‚都超时,且在æµé‡å‡å°‘æ—¶ä»æ— æ³•æ¢å¤çš„现象。下é¢è§£é‡Šè¿™ä¸ªçŽ°è±¡çš„æ¥æºã€‚ + +当æµé‡è¶…出æœåŠ¡çš„æœ€å¤§qps时,æœåŠ¡å°†æ— æ³•æ­£å¸¸æœåŠ¡ï¼›å½“æµé‡æ¢å¤æ­£å¸¸æ—¶ï¼ˆå°äºŽæœåŠ¡çš„å¤„ç†èƒ½åŠ›ï¼‰ï¼Œç§¯åŽ‹çš„è¯·æ±‚ä¼šè¢«å¤„ç†ï¼Œè™½ç„¶å…¶ä¸­å¾ˆå¤§ä¸€éƒ¨åˆ†å¯èƒ½ä¼šå› ä¸ºå¤„ç†çš„ä¸åŠæ—¶è€Œè¶…时,但æœåŠ¡æœ¬èº«ä¸€èˆ¬è¿˜æ˜¯ä¼šæ¢å¤æ­£å¸¸çš„。这就相当于一个水池有一个入水å£å’Œä¸€ä¸ªå‡ºæ°´å£ï¼Œå¦‚果入水é‡å¤§äºŽå‡ºæ°´é‡ï¼Œæ°´æ± å­ç»ˆå°†ç››æ»¡ï¼Œå¤šå‡ºçš„æ°´ä¼šæº¢å‡ºæ¥ã€‚但如果入水é‡é™åˆ°å‡ºæ°´é‡ä¹‹ä¸‹ï¼Œä¸€æ®µæ—¶é—´åŽæ°´æ± æ€»ä¼šæŽ’ç©ºã€‚é›ªå´©å¹¶ä¸æ˜¯å•一æœåŠ¡èƒ½äº§ç”Ÿçš„ã€‚ + +如果一个请求ç»è¿‡ä¸¤ä¸ªæœåŠ¡ï¼Œæƒ…å†µå°±æœ‰æ‰€ä¸åŒäº†ã€‚比如请求访问AæœåŠ¡ï¼ŒAæœåŠ¡åˆè®¿é—®äº†BæœåŠ¡ã€‚å½“B被打满时,A处的client会大é‡è¶…时,如果A处的client在等待B返回时也阻塞了Açš„æœåŠ¡çº¿ç¨‹ï¼ˆå¸¸è§ï¼‰ï¼Œä¸”使用了固定个数的线程池(常è§ï¼‰ï¼Œé‚£ä¹ˆA处的最大qps就从**线程数 / å¹³å‡å»¶æ—¶**,é™åˆ°äº†**线程数 / è¶…æ—¶**。由于超时往往是平å‡å»¶æ—¶çš„3至4å€ï¼ŒA处的最大qps会相应地下é™3至4å€ï¼Œä»Žè€Œäº§ç”Ÿæ¯”B处更激烈的拥塞。如果Aè¿˜æœ‰ç±»ä¼¼çš„ä¸Šæ¸¸ï¼Œæ‹¥å¡žä¼šç»§ç»­ä¼ é€’ä¸ŠåŽ»ã€‚ä½†è¿™ä¸ªè¿‡ç¨‹è¿˜æ˜¯å¯æ¢å¤çš„。B处的æµé‡ç»ˆç©¶ç”±æœ€å‰ç«¯çš„æµé‡è§¦å‘,åªè¦æœ€å‰ç«¯çš„æµé‡å›žå½’正常,B处的æµé‡æ€»ä¼šæ…¢æ…¢é™ä¸‹æ¥ç›´åˆ°èƒ½æ­£å¸¸å›žå¤å¤§å¤šæ•°è¯·æ±‚,从而让Aæ¢å¤æ­£å¸¸ã€‚ + +但有两个例外: + +1. Aå¯èƒ½å¯¹Bå‘起了过于频ç¹çš„基于超时的é‡è¯•。这ä¸ä»…会让A的最大qpsé™åˆ°**线程数 / è¶…æ—¶**,还会让B处的qpsç¿»**é‡è¯•次数**å€ã€‚这就å¯èƒ½é™·å…¥æ¶æ€§å¾ªçŽ¯äº†ï¼šåªè¦**线程数 / è¶…æ—¶ \* é‡è¯•次数**大于B的最大qps,B就无法æ¢å¤ -> A处的client会继续超时 -> Aç»§ç»­é‡è¯• -> B继续无法æ¢å¤ã€‚ +2. A或B没有é™åˆ¶æŸä¸ªç¼“冲或队列的长度,或é™åˆ¶è¿‡äºŽå®½æ¾ã€‚拥塞请求会大é‡åœ°ç§¯åŽ‹åœ¨é‚£é‡Œï¼Œè¦æ¢å¤å°±å¾—全部处ç†å®Œï¼Œæ—¶é—´å¯èƒ½é•¿å¾—无法接å—。由于有é™é•¿çš„缓冲或队列需è¦åœ¨å¡«æ»¡æ—¶è§£å†³ç­‰å¾…ã€å”¤é†’等问题,有时为了简å•,代ç å¯èƒ½ä¼šå‡å®šç¼“冲或队列ä¸ä¼šæ»¡ï¼Œè¿™å°±åŸ‹ä¸‹äº†ç§å­ã€‚å³ä½¿é˜Ÿåˆ—是有é™é•¿çš„,æ¢å¤æ—¶é—´ä¹Ÿå¯èƒ½å¾ˆé•¿ï¼Œå› ä¸ºæ¸…空队列的过程是个追赶问题,排空的时间å–决于**积压的请求数 / (最大qps - 当å‰qps)**,如果当å‰qps和最大qps差的ä¸å¤šï¼Œç§¯åŽ‹çš„è¯·æ±‚åˆæ¯”较多,那排空时间就é¥é¥æ— æœŸäº†ã€‚ + +了解这些因素åŽå¯ä»¥æ›´å¥½çš„ç†è§£brpc中相关的设计。 + +1. 拥塞时AæœåŠ¡æœ€å¤§qpsçš„è·³å˜æ˜¯å› ä¸ºçº¿ç¨‹ä¸ªæ•°æ˜¯**硬é™**,å•ä¸ªè¯·æ±‚çš„å¤„ç†æ—¶é—´å¾ˆå¤§ç¨‹åº¦ä¸Šå†³å®šäº†æœ€å¤§qps。而brpc server端默认在bthread中处ç†è¯·æ±‚,个数是软é™ï¼Œå•ä¸ªè¯·æ±‚è¶…æ—¶åªæ˜¯é˜»å¡žæ‰€åœ¨çš„bthread,并ä¸ä¼šå½±å“为新请求建立新的bthread。brpc也æä¾›äº†å®Œæ•´çš„异步接å£ï¼Œè®©ç”¨æˆ·å¯ä»¥è¿›ä¸€æ­¥æé«˜io-boundæœåŠ¡çš„å¹¶å‘度,é™ä½ŽæœåŠ¡è¢«æ‰“æ»¡çš„å¯èƒ½æ€§ã€‚ +2. brpc中[é‡è¯•](client.md#é‡è¯•)默认åªåœ¨è¿žæŽ¥å‡ºé”™æ—¶å‘起,é¿å…了æµé‡æ”¾å¤§ï¼Œè¿™æ˜¯æ¯”较有效率的é‡è¯•æ–¹å¼ã€‚如果需è¦åŸºäºŽè¶…æ—¶é‡è¯•,å¯ä»¥è®¾ç½®[backup request](client.md#é‡è¯•),这类é‡è¯•æœ€å¤šåªæœ‰ä¸€æ¬¡ï¼Œæ”¾å¤§ç¨‹åº¦é™åˆ°äº†æœ€ä½Žã€‚brpc中的RPC超时是deadline,超过åŽRPC一定会结æŸï¼Œè¿™è®©ç”¨æˆ·å¯¹æœåŠ¡çš„è¡Œä¸ºæœ‰æ›´å¥½çš„é¢„åˆ¤ã€‚åœ¨ä¹‹å‰çš„一些实现中,RPCè¶…æ—¶æ˜¯å•æ¬¡è¶…æ—¶*é‡è¯•次数,在实践中容易误判。 +3. brpc server端的[max_concurrency选项](server.md#é™åˆ¶æœ€å¤§å¹¶å‘)控制了server的最大并å‘ï¼šå½“åŒæ—¶å¤„ç†çš„请求数超过max_concurrency时,server会回å¤clienté”™è¯¯ï¼Œè€Œä¸æ˜¯ç»§ç»­ç§¯åŽ‹ã€‚è¿™ä¸€æ–¹é¢åœ¨æœåŠ¡å¼€å§‹çš„æºå¤´æŽ§åˆ¶ä½äº†ç§¯åŽ‹çš„è¯·æ±‚æ•°ï¼Œå°½é‡é¿å…延生到用户缓冲或队列中,å¦ä¸€æ–¹é¢ä¹Ÿè®©client尽快地去é‡è¯•å…¶ä»–server,对集群æ¥è¯´æ˜¯ä¸ªæ›´å¥½çš„策略。 + +对于brpc的用户æ¥è¯´ï¼Œè¦é˜²æ­¢é›ªå´©ï¼Œä¸»è¦æ³¨æ„两点: + +1. 评估server的最大并å‘,设置åˆç†çš„max_concurrency值。这个默认是ä¸è®¾çš„,也就是ä¸é™åˆ¶ã€‚æ— è®ºç¨‹åºæ˜¯åŒæ­¥è¿˜æ˜¯å¼‚步,用户都å¯ä»¥é€šè¿‡ **最大qps \* éžæ‹¥å¡žæ—¶çš„å»¶æ—¶**(秒)æ¥è¯„估最大并å‘,原ç†è§[little's law](https://en.wikipedia.org/wiki/Little%27s_law),这两个é‡éƒ½å¯ä»¥åœ¨brpc中的内置æœåŠ¡ä¸­çœ‹åˆ°ã€‚max_concurrency与最大并å‘相等或大一些就行了。 +2. 注æ„考察é‡è¯•å‘生时的行为,特别是在定制RetryPolicyæ—¶ã€‚å¦‚æžœä½ åªæ˜¯ç”¨é»˜è®¤çš„brpcé‡è¯•,一般是安全的。但用户程åºä¹Ÿå¸¸ä¼šè‡ªå·±åšé‡è¯•,比如通过一个Channel访问失败åŽï¼ŒåŽ»è®¿é—®å¦å¤–一个Channelï¼Œè¿™ç§æƒ…å†µä¸‹è¦æƒ³æ¸…楚é‡è¯•å‘生时最差情况下请求é‡ä¼šæ”¾å¤§å‡ å€ï¼ŒæœåŠ¡æ˜¯å¦å¯æ‰¿å—。 diff --git a/docs/cn/backup_request.md b/docs/cn/backup_request.md new file mode 100644 index 0000000..b2e0bb6 --- /dev/null +++ b/docs/cn/backup_request.md @@ -0,0 +1,120 @@ +有时为了ä¿è¯å¯ç”¨æ€§ï¼Œéœ€è¦åŒæ—¶è®¿é—®ä¸¤è·¯æœåŠ¡ï¼Œå“ªä¸ªå…ˆè¿”å›žå°±å–哪个。在brpc中,这有多ç§åšæ³•ï¼š + +# 当åŽç«¯serverå¯ä»¥æŒ‚åœ¨ä¸€ä¸ªå‘½åæœåŠ¡å†…æ—¶ + +Channelå¼€å¯backup request。这个Channel会先å‘其中一个serverå‘é€è¯·æ±‚,如果在ChannelOptions.backup_request_msåŽè¿˜æ²¡å›žæ¥ï¼Œå†å‘å¦ä¸€ä¸ªserverå‘é€ã€‚之åŽå“ªä¸ªå…ˆå›žæ¥å°±å–哪个。在设置了åˆç†çš„backup_request_msåŽï¼Œå¤§éƒ¨åˆ†æ—¶å€™åªä¼šå‘一个请求,对åŽç«¯æœåŠ¡åªæœ‰ä¸€å€åŽ‹åŠ›ã€‚ + +示例代ç è§[example/backup_request_c++](https://github.com/apache/brpc/blob/master/example/backup_request_c++)。这个例å­ä¸­ï¼Œclient设定了在2msåŽå‘é€backup request,serveråœ¨ç¢°åˆ°å¶æ•°ä½çš„请求åŽä¼šæ•…æ„ç¡çœ 20ms以触å‘backup request。 + +è¿è¡ŒåŽï¼Œclient端和server端的日志分别如下,"index"是请求的编å·ã€‚å¯ä»¥çœ‹åˆ°server端在收到第一个请求åŽä¼šæ•…æ„sleep 20ms,client端之åŽå‘é€å¦ä¸€ä¸ªåŒæ ·index的请求,最终的延时并没有å—到故æ„sleep的影å“。 + +![img](../images/backup_request_1.png) + +![img](../images/backup_request_2.png) + +/rpcz也显示client在2msåŽè§¦å‘了backupè¶…æ—¶å¹¶å‘出了第二个请求。 + +![img](../images/backup_request_3.png) + +## 选择åˆç†çš„backup_request_ms + +å¯ä»¥è§‚察brpc默认æä¾›çš„latency_cdf图,或自行添加。cdf图的y轴是延时(默认微秒),x轴是å°äºŽy轴延时的请求的比例。在下图中,选择backup_request_ms=2mså¯ä»¥å¤§çº¦è¦†ç›–95.5%的请求,选择backup_request_ms=10ms则å¯ä»¥è¦†ç›–99.99%的请求。 + +![img](../images/backup_request_4.png) + +自行添加的方法: + +```c++ +#include +#include +... +bvar::LatencyRecorder my_func_latency("my_func"); +... +butil::Timer tm; +tm.start(); +my_func(); +tm.stop(); +my_func_latency << tm.u_elapsed(); // u代表微秒,还有s_elapsed(), m_elapsed(), n_elapsed()分别对应秒,毫秒,纳秒。 + +// 好了,在/vars中会显示my_func_qps, my_func_latency, my_func_latency_cdf等很多计数器。 +``` + +## Backup Request 陿µ + +如需é™åˆ¶ backup request çš„å‘逿¯”例,å¯ä½¿ç”¨å†…ç½®å·¥åŽ‚å‡½æ•°åˆ›å»ºé™æµç­–略,也å¯è‡ªè¡Œå®žçް `BackupRequestPolicy` 接å£ã€‚ + +优先级顺åºï¼š`backup_request_policy` > `backup_request_ms`。 + +### ä½¿ç”¨å†…ç½®é™æµç­–ç•¥ + +调用 `CreateRateLimitedBackupPolicy` åˆ›å»ºé™æµç­–略,并将其设置到 `ChannelOptions.backup_request_policy`: + +```c++ +#include "brpc/backup_request_policy.h" +#include + +brpc::RateLimitedBackupPolicyOptions opts; +opts.backup_request_ms = 10; // 超过10ms未返回时å‘é€backup请求 +opts.max_backup_ratio = 0.3; // backup请求比例上é™30% +opts.window_size_seconds = 10; // 滑动窗å£å®½åº¦ï¼ˆç§’) +opts.update_interval_seconds = 5; // 缓存比例的刷新间隔(秒) + +// CreateRateLimitedBackupPolicy返回的指针由调用方负责释放。 +// policy的生命周期必须长于channel——先销æ¯channel,å†é”€æ¯policy。 +std::unique_ptr policy( + brpc::CreateRateLimitedBackupPolicy(opts)); + +brpc::ChannelOptions options; +options.backup_request_policy = policy.get(); // Channel䏿‹¥æœ‰è¯¥å¯¹è±¡ +channel.Init(..., &options); +// channel必须在policyæžæž„之å‰é”€æ¯ã€‚ +``` + +傿•°è¯´æ˜Žï¼ˆ`RateLimitedBackupPolicyOptions`): + +| 字段 | 默认值 | 说明 | +|------|--------|------| +| `backup_request_ms` | -1 | 超时阈值(毫秒)。-1 表示继承 `ChannelOptions.backup_request_ms`(仅在通过 `ChannelOptions.backup_request_policy` 设置策略时有效;通过 Controller 注入时没有 channel çº§çš„å›žé€€å€¼ï¼Œåº”æ˜¾å¼æŒ‡å®š >= 0 的值)。必须 >= -1。 | +| `max_backup_ratio` | 0.1 | backup比例上é™ï¼Œå–值范围 (0, 1] | +| `window_size_seconds` | 10 | 滑动窗å£å®½åº¦ï¼ˆç§’),å–值范围 [1, 3600] | +| `update_interval_seconds` | 5 | 缓存刷新间隔(秒),必须 >= 1 | + +傿•°ä¸åˆæ³•æ—¶ `CreateRateLimitedBackupPolicy` 返回 `NULL`。 + +### 使用自定义 BackupRequestPolicy + +如需完全控制,å¯å®žçް `BackupRequestPolicy` 接å£å¹¶è®¾ç½®åˆ° `ChannelOptions.backup_request_policy`: + +```c++ +#include "brpc/backup_request_policy.h" + +class MyBackupPolicy : public brpc::BackupRequestPolicy { +public: + int32_t GetBackupRequestMs(const brpc::Controller*) const override { + return 10; // 10msåŽå‘é€backup + } + bool DoBackup(const brpc::Controller*) const override { + return should_allow_backup(); // 自定义逻辑 + } + void OnRPCEnd(const brpc::Controller*) override { + // æ¯æ¬¡RPCç»“æŸæ—¶è°ƒç”¨ï¼Œå¯åœ¨æ­¤æ›´æ–°ç»Ÿè®¡ + } +}; + +MyBackupPolicy my_policy; +brpc::ChannelOptions options; +options.backup_request_policy = &my_policy; // Channel䏿‹¥æœ‰è¯¥å¯¹è±¡ï¼Œéœ€ä¿è¯å…¶ç”Ÿå‘½å‘¨æœŸé•¿äºŽChannel +channel.Init(..., &options); +``` + +### 实现说明 + +- 比例通过bvar计数器在滑动时间窗å£å†…统计。缓存值通过无é”CASé€‰ä¸¾æœ€å¤šæ¯ `update_interval_seconds` åˆ·æ–°ä¸€æ¬¡ï¼Œå› æ­¤æ¯æ¬¡RPC的开销æžä½Žï¼ˆå…¬å…±è·¯å¾„仅有两次原å­è¯»ï¼‰ã€‚ +- Backup决策在åšå‡ºæ—¶ç«‹å³è®¡æ•°ï¼ˆRPC完æˆå‰ï¼‰ï¼Œä»¥ä¾¿åœ¨å»¶è¿ŸæŠ–动期间更快地å馈。总RPCæ•°åœ¨å®Œæˆæ—¶ç»Ÿè®¡ã€‚è¿™æ„å‘³ç€æ¯”例在抖动期间å¯èƒ½çŸ­æš‚滞åŽï¼Œè¿™æ˜¯è®¾è®¡æœ‰æ„ä¸ºä¹‹â€”â€”é™æµå™¨çš„目标是近似的尽力而为的节æµï¼Œè€Œéžç²¾ç¡®æ‰§è¡Œã€‚ +- æ¯ä¸ªä½¿ç”¨é™æµçš„Channel会维护两个 `bvar::Window` 采样任务,在Channelæ•°é‡æžå¤šçš„éƒ¨ç½²ä¸­è¯·ç•™æ„æ­¤å¼€é”€ã€‚ + +# 当åŽç«¯serverä¸èƒ½æŒ‚åœ¨ä¸€ä¸ªå‘½åæœåŠ¡å†…æ—¶ + +ã€æŽ¨è】建立一个开å¯backup requestçš„SelectiveChannel,其中包å«ä¸¤ä¸ªsub channel。访问这个SelectiveChannel和上é¢çš„æƒ…况类似,会先访问一个sub channel,如果在ChannelOptions.backup_request_msåŽæ²¡è¿”回,å†è®¿é—®å¦ä¸€ä¸ªsub channel。如果一个sub channel对应一个集群,这个方法就是在两个集群间åšäº’备。SelectiveChannel的例å­è§[example/selective_echo_c++](https://github.com/apache/brpc/tree/master/example/selective_echo_c++)ï¼Œå…·ä½“åšæ³•请å‚考上é¢çš„过程。 + +ã€ä¸æŽ¨è】å‘起两个异步RPCåŽJoin它们,它们的doneå†…æ˜¯ç›¸äº’å–æ¶ˆçš„逻辑。示例代ç è§[example/cancel_c++](https://github.com/apache/brpc/tree/master/example/cancel_c++)ã€‚è¿™ç§æ–¹æ³•的问题是总会å‘两个请求,对åŽç«¯æœåŠ¡æœ‰ä¸¤å€åŽ‹åŠ›ï¼Œè¿™ä¸ªæ–¹æ³•æ€Žä¹ˆç®—éƒ½æ˜¯ä¸ç»æµŽçš„,你应该尽é‡é¿å…用这个方法。 diff --git a/docs/cn/baidu_std.md b/docs/cn/baidu_std.md new file mode 100644 index 0000000..0f901e5 --- /dev/null +++ b/docs/cn/baidu_std.md @@ -0,0 +1,159 @@ +# ä»‹ç» + +baidu_std是一ç§åŸºäºŽTCPå议的二进制RPC通信å议。它以Protobuf作为基本的数æ®äº¤æ¢æ ¼å¼ï¼Œå¹¶åŸºäºŽProtobuf内置的RPC Serviceå½¢å¼ï¼Œè§„å®šäº†é€šä¿¡åŒæ–¹ä¹‹é—´çš„æ•°æ®äº¤æ¢å议,以实现完整的RPC调用。 + +baidu_stdä¸è€ƒè™‘è·¨TCP连接的情况。 + +# 基本åè®® + +## æœåŠ¡ + +所有RPCæœåŠ¡éƒ½åœ¨æŸä¸ªIP地å€ä¸Šé€šè¿‡æŸä¸ªç«¯å£å‘布。 + +一个端å£å¯ä»¥åŒæ—¶å‘布多个æœåŠ¡ã€‚æœåС以å字标识。æœåŠ¡å必须是UpperCamelCase,由大å°å†™å­—æ¯å’Œæ•°å­—组æˆï¼Œé•¿åº¦ä¸è¶…过64个字符。 + +一个æœåŠ¡å¯ä»¥åŒ…å«ä¸€ä¸ªæˆ–多个方法。æ¯ä¸ªæ–¹æ³•以å字标识,由大å°å†™å­—æ¯ã€æ•°å­—和下划线组æˆï¼Œé•¿åº¦ä¸è¶…过64个字符。考虑到ä¸åŒè¯­è¨€é£Žæ ¼å·®å¼‚è¾ƒå¤§ï¼Œè¿™é‡Œå¯¹æ–¹æ³•å‘½åæ ¼å¼ä¸åšå¼ºåˆ¶è§„定。 + +四元组唯一地标识了一个RPC方法。 + +è°ƒç”¨æ–¹æ³•æ‰€éœ€å‚æ•°åº”放在一个Protobuf消æ¯å†…ã€‚å¦‚æžœæ–¹æ³•æœ‰è¿”å›žç»“æžœï¼Œä¹ŸåŒæ ·åº”放在一个Protobuf消æ¯å†…ã€‚å…·ä½“å®šä¹‰ç”±é€šä¿¡åŒæ–¹è‡ªè¡Œçº¦å®šã€‚特别地,å¯ä»¥ä½¿ç”¨ç©ºçš„Protobufæ¶ˆæ¯æ¥è¡¨ç¤ºè¯·æ±‚/å“应为空的情况。 + +## 包 + +包是baidu_std的基本数æ®äº¤æ¢å•ä½ã€‚æ¯ä¸ªåŒ…由包头和包体组æˆï¼Œå…¶ä¸­åŒ…体åˆåˆ†ä¸ºå…ƒæ•°æ®ã€æ•°æ®ã€é™„ä»¶ä¸‰éƒ¨åˆ†ã€‚å…·ä½“çš„å‚æ•°å’Œè¿”回结果放在数æ®éƒ¨åˆ†ã€‚ + +包分为请求包和å“应包两ç§ã€‚它们的包头格å¼ä¸€è‡´ï¼Œä½†å…ƒæ•°æ®éƒ¨åˆ†çš„定义ä¸åŒã€‚ + +## 包头 + +包头长度固定为12字节。å‰å››å­—节为å议标识PRPC,中间四字节是一个32使•´æ•°ï¼Œè¡¨ç¤ºåŒ…体长度(ä¸åŒ…括包头的12字节),最åŽå››å­—节是一个32使•´æ•°ï¼Œè¡¨ç¤ºåŒ…体中的元数æ®åŒ…长度。整数å‡é‡‡ç”¨ç½‘络字节åºè¡¨ç¤ºã€‚ + +## å…ƒæ•°æ® + +元数æ®ç”¨äºŽæè¿°è¯·æ±‚/å“应。 + +``` +message RpcMeta { + optional RpcRequestMeta request = 1; + optional RpcResponseMeta response = 2; + optional int32 compress_type = 3; + optional int64 correlation_id = 4; + optional int32 attachment_size = 5; + optional ChunkInfo chuck_info = 6; + optional bytes authentication_data = 7; +}; +``` + +è¯·æ±‚åŒ…ä¸­åªæœ‰request,å“åº”åŒ…ä¸­åªæœ‰response。实现å¯ä»¥æ ¹æ®åŸŸçš„存在性æ¥åŒºåˆ†è¯·æ±‚包和å“应包。 + +| 傿•° | 说明 | +| ------------------- | ---------------------------------------- | +| request | è¯·æ±‚åŒ…å…ƒæ•°æ® | +| response | å“åº”åŒ…å…ƒæ•°æ® | +| compress_type | 详è§é™„录[压缩算法](#compress_algorithm) | +| correlation_id | 请求包中的该域由请求方设置,用于唯一标识一个RPC请求。请求方有义务ä¿è¯å…¶å”¯ä¸€æ€§ï¼Œå议本身对此ä¸åšä»»ä½•检查。å“应方需è¦åœ¨å¯¹åº”çš„å“应包里é¢å°†correlation_idè®¾ä¸ºåŒæ ·çš„值。 | +| attachment_size | 附件大å°ï¼Œè¯¦è§[附件](#attachment) | +| chuck_info | 详è§[Chunk模å¼](#chunk-mode) | +| authentication_data | 用于存放身份认è¯ç›¸å…³ä¿¡æ¯ | + +### è¯·æ±‚åŒ…å…ƒæ•°æ® + +请求包的元数æ®ä¸»è¦æè¿°äº†éœ€è¦è°ƒç”¨çš„RPC方法信æ¯ï¼ŒProtobuf如下 + +``` +message RpcRequestMeta { + required string service_name = 1; + required string method_name = 2; + optional int64 log_id = 3; +}; +``` + +| 傿•° | 说明 | +| ------------ | ---------------------------- | +| service_name | æœåŠ¡å,约æŸè§ä¸Šæ–‡ | +| method_name | 方法å,约æŸè§ä¸Šæ–‡ | +| log_id | ç”¨äºŽæ‰“å°æ—¥å¿—。å¯ç”¨äºŽå­˜æ”¾BFE_LOGIDã€‚è¯¥å‚æ•°å¯é€‰ã€‚ | + +### å“åº”åŒ…å…ƒæ•°æ® + +å“åº”åŒ…çš„å…ƒæ•°æ®æ˜¯å¯¹è¿”回结果的æè¿°ã€‚如果出现任何异常,错误也会放在元数æ®ä¸­ã€‚å…¶Protobufæè¿°å¦‚下 + +``` +message RpcResponseMeta { + optional int32 error_code = 1; + optional string error_text = 2; +}; +``` + +| 傿•° | 说明 | +| ---------- | ------------------------------------ | +| error_code | å‘生错误时的错误å·ï¼Œ0表示正常,éž0表示错误。具体å«ä¹‰ç”±åº”用方自行定义。 | +| error_text | 错误的文本æè¿° | + +### 对元数æ®çš„æ‰©å±• + +æŸäº›å®žçŽ°éœ€è¦åœ¨å…ƒæ•°æ®ä¸­å¢žåŠ è‡ªå·±ä¸“æœ‰çš„å­—æ®µã€‚ä¸ºäº†é¿å…冲çªï¼Œå¹¶ä¿è¯ä¸åŒå®žçŽ°ä¹‹é—´ç›¸äº’è°ƒç”¨çš„å…¼å®¹æ€§ï¼Œæ‰€æœ‰å®žçŽ°éƒ½éœ€è¦å‘接å£è§„范委员会申请一个专用的åºå·ç”¨äºŽå­˜æ”¾è‡ªå·±çš„æ‰©å±•字段。 + +以Hulu为例,被分é…çš„åºå·ä¸º100。因此Huluå¯ä»¥ä½¿ç”¨è¿™æ ·çš„proto定义: + +``` +message RpcMeta { + optional RpcRequestMeta request = 1; + optional RpcResponseMeta response = 2; + optional int32 compress_type = 3; + optional int64 correlation_id = 4; + optional int32 attachment_size = 5; + optional ChunkInfo chuck_info = 6; + optional HuluMeta hulu_meta = 100; +}; +message RpcRequestMeta { + required string service_name = 1; + required string method_name = 2; + optional int64 log_id = 3; + optional HuluRequestMeta hulu_request_meta = 100; +}; +message RpcResponseMeta { + optional int32 error_code = 1; + optional string error_text = 2; + optional HuluResponseMeta hulu_response_meta = 100; +}; +``` + +å› ä¸ºåªæ˜¯å°†100这个åºå·ä¿ç•™ç»™Hulu使用,因此Huluå¯ä»¥è‡ªç”±å†³å®šæ˜¯å¦æ·»åŠ è¿™äº›å­—æ®µï¼Œä»¥åŠä½¿ç”¨ä»€ä¹ˆæ ·çš„å字。其余实现使用的proto中ä¸å­˜åœ¨è¿™äº›å®šä¹‰ï¼Œä¼šç›´æŽ¥ä½œä¸ºUnknown字段忽略。 + +当å‰åˆ†é…çš„åºå·å¦‚下 + +| åºå· | 实现 | +| ---- | ---- | +| 100 | Hulu | +| 101 | Sofa | + +## æ•°æ® + +自定义的Protobuf Messageã€‚ç”¨äºŽå­˜æ”¾å‚æ•°æˆ–返回结果。 + +## Attachment + +æŸäº›åœºæ™¯ä¸‹éœ€è¦é€šè¿‡RPCæ¥ä¼ é€’二进制数æ®ï¼Œä¾‹å¦‚文件上传下载,多媒体转ç ç­‰ç­‰ã€‚å°†è¿™äº›äºŒè¿›åˆ¶æ•°æ®æ‰“包在Protobuf内会增加ä¸å¿…è¦çš„内存拷è´ã€‚å› æ­¤åè®®å…许使用附件的方å¼ç›´æŽ¥ä¼ é€äºŒè¿›åˆ¶æ•°æ®ã€‚ + +附件总是放在包体的最åŽï¼Œç´§è·Ÿæ•°æ®éƒ¨åˆ†ã€‚消æ¯åŒ…éœ€è¦æºå¸¦é™„件时,应将RpcMeta中的attachment_size设为附件的实际字节数。 + +## 压缩算法 + +å¯ä»¥ä½¿ç”¨æŒ‡å®šçš„压缩算法æ¥åŽ‹ç¼©æ¶ˆæ¯åŒ…中的数æ®éƒ¨åˆ†ã€‚ + +| 值 | å«ä¹‰ | +| ---- | -------- | +| 0 | ä¸åŽ‹ç¼© | +| 1 | 使用Snappy | +| 2 | 使用gzip | + +# HTTPæŽ¥å£ + +æœåŠ¡åº”ä»¥æ ‡å‡†çš„HTTPå议对外å‘布接å£ã€‚ + +æ•°æ®äº¤æ¢æ ¼å¼é»˜è®¤åº”使用JSON。Content-Type使用application/json。有特殊需求的接å£ä¸å—æ­¤é™åˆ¶ã€‚例如上传文件å¯ä»¥ä½¿ç”¨multipart/form-data;下载文件å¯ä»¥æ ¹æ®å®žé™…内容选用åˆé€‚çš„Content-Type。 + +URLå’ŒJSON中的字符编ç ä¸€å¾‹ä½¿ç”¨UTF-8。 + +建议使用RESTfulå½¢å¼çš„Web Service接å£ã€‚由于RESTfulå¹¶éžä¸€ä¸ªä¸¥æ ¼çš„规范,本规范对此ä¸åšå¼ºåˆ¶è§„定。 \ No newline at end of file diff --git a/docs/cn/bazel_support.md b/docs/cn/bazel_support.md new file mode 100644 index 0000000..0ff8611 --- /dev/null +++ b/docs/cn/bazel_support.md @@ -0,0 +1,20 @@ +## bRPC 作为Bazel第三方ä¾èµ– +1. bRPC ä¾èµ–于一些开æºåº“, 但这些库并没有æä¾›bazel支æŒ, 所以需è¦ä½ æ‰‹åŠ¨å°†ä¸€éƒ¨åˆ†ä¾èµ–加入到你的构建项目中. +2. å°† /example/build_with_bazel/*.BUILD å’Œ brpc_workspace.bzl 该文件移动到你的项目根目录下, å°† +```c++ + load("@//:brpc_workspace.bzl", "brpc_workspace") + brpc_workspace(); +``` +内容添加到你的WORKSPACE中. + +3. 链接请使用 + ```c++ + ... + deps = [ + "@apache_brpc//:bthread", + "@apache_brpc//:brpc", + "@apache_brpc//:butil", + "@apache_brpc//:bvar", + ] + ... + ``` diff --git a/docs/cn/benchmark.md b/docs/cn/benchmark.md new file mode 100644 index 0000000..f02a5af --- /dev/null +++ b/docs/cn/benchmark.md @@ -0,0 +1,221 @@ +NOTE: following tests were done in 2015, which may not reflect latest status of the package. + +# åºè¨€ + +åœ¨å¤šæ ¸çš„å‰æä¸‹ï¼Œæ€§èƒ½å’Œçº¿ç¨‹æ˜¯ç´§å¯†è”系在一起的。线程间的跳转对高频IOæ“作的性能有决定性作用: 一次跳转æ„味ç€è‡³å°‘3-20微秒的延时,由于æ¯ä¸ªæ ¸å¿ƒçš„L1 cache独立(我们的cpu L2 cache也是独立的),éšä¹‹è€Œæ¥æ˜¯å¤§é‡çš„cache miss,一些å˜é‡çš„读å–ã€å†™å…¥å»¶æ—¶ä¼šä»Žçº³ç§’级上å‡å‡ ç™¾å€è‡³å¾®ç§’级: 等待cpu把对应的cachelineåŒæ­¥è¿‡æ¥ã€‚有时这带æ¥äº†ä¸€ä¸ªå‡ºä¹Žæ„æ–™çš„ç»“æžœï¼Œå½“æ¯æ¬¡çš„处ç†éƒ½å¾ˆç®€çŸ­æ—¶ï¼Œä¸€ä¸ªå¤šçº¿ç¨‹ç¨‹åºæœªå¿…比一个å•çº¿ç¨‹ç¨‹åºæ›´å¿«ã€‚因为å‰è€…å¯èƒ½åœ¨æ¯æ¬¡ä»˜å‡ºäº†å¤§çš„切æ¢ä»£ä»·åŽåªåšäº†ä¸€ç‚¹ç‚¹â€œæ­£äº‹â€ï¼Œè€ŒåŽè€…在ä¸åœåœ°åšâ€œæ­£äº‹â€ã€‚ä¸è¿‡å•çº¿ç¨‹ä¹Ÿæ˜¯æœ‰ä»£ä»·çš„ï¼Œå®ƒå·¥ä½œè‰¯å¥½çš„å‰ææ˜¯â€œæ­£äº‹â€éƒ½å¾ˆå¿«ï¼Œå¦åˆ™ä¸€æ—¦æŸæ¬¡å˜æ…¢å°±ä½¿åŽç»­çš„æ‰€æœ‰â€œæ­£äº‹â€éƒ½è¢«å»¶è¿Ÿäº†ã€‚åœ¨ä¸€äº›å¤„ç†æ—¶é—´æ™®é较短的程åºä¸­ï¼Œä½¿ç”¨ï¼ˆå¤šä¸ªä¸ç›¸äº¤çš„)å•线程能最大程度地â€åšæ­£äº‹â€œï¼Œç”±äºŽæ¯ä¸ªè¯·æ±‚çš„å¤„ç†æ—¶é—´ç¡®å®šï¼Œå»¶æ—¶è¡¨çŽ°ä¹Ÿå¾ˆç¨³å®šï¼Œå„ç§http server正是这样。但我们的检索æœåŠ¡è¦åšçš„事情å¯å°±å¤æ‚多了,有大é‡çš„åŽç«¯æœåŠ¡éœ€è¦è®¿é—®ï¼Œå¹¿æ³›å­˜åœ¨çš„é•¿å°¾è¯·æ±‚ä½¿æ¯æ¬¡å¤„ç†çš„æ—¶é—´æ— æ³•确定,排åºç­–略也越æ¥è¶Šå¤æ‚。如果还是使用(多个ä¸ç›¸äº¤çš„)å•线程的è¯ï¼Œä¸€æ¬¡éš¾ä»¥é¢„计的性能抖动,或是一个大请求å¯èƒ½å¯¼è‡´åŽç»­ä¸€å †è¯·æ±‚被延迟。 + +为了é¿å…请求之间相互影å“,请求级的线程跳转是brpc必须付出的代价,我们能åšçš„æ˜¯ä½¿[线程跳转最优化](io.md#the-full-picture)。ä¸è¿‡ï¼Œå¯¹æœåŠ¡çš„æ€§èƒ½æµ‹è¯•è¿˜ä¸èƒ½å¾ˆå¥½åœ°ä½“现这点。测试中的处ç†å¾€å¾€æžä¸ºç®€å•,使得线程切æ¢çš„å½±å“空å‰å·¨å¤§ï¼Œé€šè¿‡æŽ§åˆ¶å¤šçº¿ç¨‹å’Œå•线程处ç†çš„æ¯”例,我们å¯ä»¥æŠŠä¸€ä¸ªæµ‹è¯•æœåŠ¡çš„qps从100万到500万æ“çºµè‡ªå¦‚ï¼ˆåŒæœºï¼‰ï¼Œè¿™æŸä¼¤äº†æ€§èƒ½æµ‹è¯•结果的å¯ä¿¡åº¦ã€‚è¦çŸ¥é“,真实的æœåС并䏿˜¯åœ¨ç´¯åŠ ä¸€ä¸ªæ•°å­—ï¼Œæˆ–è€…echo一个字符串,一个qps几百万的echoç¨‹åºæ²¡æœ‰æŒ‡å¯¼æ„义。鉴于此,在å‘起性能测试一年åŽï¼ˆ15年底),在brpcåˆç»åŽ†äº†1200多次改动åŽï¼Œæˆ‘们需è¦review所有的测试,加强其中的线程因素,以获得对真实场景有明确æ„义的结果。具体æ¥è¯´: + +- 请求ä¸åº”ç­‰é•¿ï¼Œè¦æœ‰é•¿å°¾ã€‚这能考察RPC能å¦è®©è¯·æ±‚å¹¶å‘,å¦åˆ™ä¸€ä¸ªæ…¢è¯·æ±‚会影å“大é‡åŽç»­è¯·æ±‚。 +- è¦æœ‰å¤šçº§server的场景。server内用client访问下游server,这能考察serverå’Œclient的综åˆè¡¨çŽ°ã€‚ +- è¦æœ‰ä¸€ä¸ªclient访问多个server的场景。这能考察负载å‡è¡¡æ˜¯å¦è¶³å¤Ÿå¹¶å‘,真实场景中很少一个clientåªè®¿é—®ä¸€ä¸ªserver。 + +我们希望这套测试场景对其他æœåŠ¡çš„æ€§èƒ½æµ‹è¯•æœ‰å€Ÿé‰´æ„义。 + +# 测试目标 + +## UB + +百度在08å¹´å¼€å‘çš„RPC框架,在百度产å“线广泛使用,已被brpc代替。UBçš„æ¯ä¸ªè¯·æ±‚独å ä¸€ä¸ªè¿žæŽ¥(连接池),在大规模æœåС䏭æ¯å°æœºå™¨éƒ½éœ€è¦ä¿æŒå¤§é‡çš„连接,é™åˆ¶äº†å…¶ä½¿ç”¨åœºæ™¯ï¼Œåƒç™¾åº¦çš„分布å¼ç³»ç»Ÿæ²¡æœ‰ç”¨UB。UBåªæ”¯æŒnshead+mcpackå议,也没怎么考虑扩展性,所以增加新å议和新功能往往è¦è°ƒæ•´å¤§æ®µä»£ç ï¼Œåœ¨å®žè·µä¸­å¤§éƒ¨åˆ†äººâ€œçŸ¥éš¾è€Œé€€â€äº†ã€‚UB缺ä¹è°ƒè¯•å’Œè¿ç»´æŽ¥å£ï¼ŒæœåŠ¡çš„è¿è¡Œçжæ€å¯¹ç”¨æˆ·åŸºæœ¬æ˜¯é»‘盒,åªèƒ½é ä½Žæ•ˆåœ°æ‰“日志æ¥è¿½è¸ªé—®é¢˜ï¼ŒæœåŠ¡å‡ºçŽ°é—®é¢˜æ—¶å¸¸è¦æ‹‰ä¸Šç»´æŠ¤è€…一起排查,效率很低。UB有多个å˜ç§: + +* ubrpc: 百度在10年基于UBå¼€å‘çš„RPC框架,用.idl文件(类似.proto)æè¿°æ•°æ®çš„schemaï¼Œè€Œä¸æ˜¯æ‰‹åŠ¨æ‰“åŒ…ã€‚è¿™ä¸ªRPC有被使用,但ä¸å¹¿æ³›ã€‚ + +- nova_pbrpc: 百度网盟团队在12年基于UBå¼€å‘çš„RPC框架,用protobuf代替mcpack作为åºåˆ—化方法,å议是nshead + user's protobuf。 +- public_pbrpc: 百度在13å¹´åˆåŸºäºŽUBå¼€å‘çš„RPC框架,用protobuf代替mcpack作为åºåˆ—化方法,但å议与nova_pbrpcä¸åŒï¼Œå¤§è‡´æ˜¯nshead + meta protobuf。meta protobuf中有个string字段包å«user's protobuf。由于用户数æ®è¦åºåˆ—化两次,这个RPC的性能很差,没有被推广开æ¥ã€‚ + +我们以在百度网盟团队广泛使用的nova_pbrpc为UB的代表。测试时其代ç ä¸ºr10500。早期的UB支æŒCPOOLå’ŒXPOOL,分别使用[select](http://linux.die.net/man/2/select)å’Œ[leader-follower模型](http://kircher-schwanninger.de/michael/publications/lf.pdf)ï¼ŒåŽæ¥æä¾›äº†EPOLL,使用[epoll](http://man7.org/linux/man-pages/man7/epoll.7.html)处ç†å¤šè·¯è¿žæŽ¥ã€‚鉴于产å“线大都是用EPOLL模型,我们的UBé…置也使用EPOLL。UBåªæ”¯æŒ[连接池](client.md#连接方å¼),结果用“**ubrpc_mc**"指代(mc代表"multiple +connection")。虽然这个åç§°ä¸å¤ªå‡†ç¡®ï¼ˆè§ä¸Šæ–‡å¯¹ubrpc的介ç»ï¼‰ï¼Œä½†åœ¨æœ¬æ–‡çš„语境下,请默认ubrpc = UB。 + +## hulu-pbrpc + +百度在13年基于saber(kylinå˜ç§)å’Œprotobuf实现的RPC框架,hulu在多线程实现上有较多问题,已被brpc代替,测试时其代ç ä¸º`pbrpc_2-0-15-27959_PD_BL`。hulu-pbrpcåªæ”¯æŒå•连接,结果用“**hulu-pbrpc**"指代。 + +## brpc + +INF在2014年底开å‘至今的rpc产å“,支æŒç™¾åº¦å†…所有å议(ä¸é™äºŽprotobuf),并第一次统一了百度主è¦åˆ†å¸ƒå¼ç³»ç»Ÿå’Œä¸šåŠ¡çº¿çš„RPC框架。测试时代ç ä¸ºr31906。brpc既支æŒå•连接也支æŒè¿žæŽ¥æ± ï¼Œå‰è€…的结果用"**baidu-rpc**"指代,åŽè€…用“**baidu-rpc_mc**"指代。 + +## sofa-pbrpc + +百度大æœå›¢é˜Ÿåœ¨13年基于boost::asioå’Œprotobuf实现的RPC框架,有多个版本,咨询相关åŒå­¦åŽï¼Œç¡®è®¤ps/opensource下的和githubä¸Šçš„è¾ƒæ–°ï¼Œä¸”ä¼šå®šæœŸåŒæ­¥ã€‚故测试使用使用ps/opensource下的版本。测试时其代ç ä¸º`sofa-pbrpc_1-0-2_BRANCH`。sofa-pbrpcåªæ”¯æŒå•连接,结果用“**sofa-pbrpc**â€æŒ‡ä»£ã€‚ + +## apache thrift + +thrift是由facebook最早在07å¹´å¼€å‘çš„åºåˆ—化方法和rpc框架,包å«ç‹¬ç‰¹çš„åºåˆ—化格å¼å’ŒIDL,支æŒå¾ˆå¤šç¼–程语言。开æºåŽæ”¹å[apache thrift](https://thrift.apache.org/),fb自己有一个[fbthrift分支](https://github.com/facebook/fbthrift),我们使用的是apache thrift。测试时其代ç ä¸º`thrift_0-9-1-400_PD_BL`。thrift的缺点是: 代ç çœ‹ä¼¼åˆ†å±‚清晰,clientå’Œserver选择很多,但没有一个足够通用,æ¯ä¸ªserver实现都åªèƒ½è§£å†³å¾ˆå°ä¸€å—场景,æ¯ä¸ªclient都线程ä¸å®‰å…¨ï¼Œå®žé™…使用很麻烦。由于thrift没有线程安全的client,所以æ¯ä¸ªçº¿ç¨‹ä¸­éƒ½å¾—建立一个client,使用独立的连接。在测试中thrift其实是å äº†å…¶ä»–实现的便宜: 它的clientä¸éœ€è¦å¤„ç†å¤šçº¿ç¨‹é—®é¢˜ã€‚thrift的结果用"**thrift_mc**"指代。 + +## gRPC + +ç”±googleå¼€å‘çš„rpc框架,使用http/2å’Œprotobuf 3.0,测试时其代ç ä¸ºã€‚gRPC并䏿˜¯stubbyï¼Œå®šä½æ›´åƒæ˜¯ä¸ºäº†æŽ¨å¹¿http/2å’Œprotobuf 3.0,但鉴于很多人对它的表现很感兴趣,我们也(很麻烦地)把它加了进æ¥ã€‚gRPC的结果用"**grpc**"指代。 + +# 测试方法 + +如åºè¨€ä¸­è§£é‡Šçš„那样,性能数字有巨大的调整空间。这里的关键在于,我们对RPCçš„åº•çº¿è¦æ±‚是什么,脱离了这个底线,测试中的表现就严é‡å离真实环境中的了。 + +这个底线我们认为是**RPC必须能处ç†é•¿å°¾**。 + +在百度的环境中,这是å¥å¤§ç™½è¯ï¼Œå“ªä¸ªäº§å“线,哪个系统没有长尾呢?作为承载大部分æœåŠ¡çš„RPC框架自然得处ç†å¥½é•¿å°¾ï¼Œå‡å°‘长尾对正常请求的影å“。但在实现层é¢ï¼Œè¿™ä¸ªé—®é¢˜å¯¹è®¾è®¡çš„å½±å“太大了。如果测试中没有长尾,那么RPC实现就å¯ä»¥å‡è®¾æ¯ä¸ªè¯·æ±‚都差ä¸å¤šå¿«ï¼Œè¿™æ—¶å€™æœ€ä¼˜çš„æ–¹æ³•是用多个线程独立地处ç†è¯·æ±‚。由于没有上下文切æ¢å’Œcacheä¸€è‡´æ€§åŒæ­¥ï¼Œç¨‹åºçš„æ€§èƒ½ä¼šæ˜¾è‘—高于多个线程å作时的表现。 + +比如简å•çš„echo程åºï¼Œå¤„ç†ä¸€ä¸ªè¯·æ±‚åªéœ€è¦200-300纳秒,å•个线程å¯ä»¥è¾¾åˆ°300-500万的åžå。但如果多个线程å作,å³ä½¿åœ¨æžå…¶æµç•…的系统中,也è¦ä»˜å‡º3-5微秒的上下文切æ¢ä»£ä»·å’Œ1微秒的cacheåŒæ­¥ä»£ä»·ï¼Œè¿™è¿˜æ²¡æœ‰è€ƒè™‘多个线程间的其他互斥逻辑,一般æ¥è¯´å•个线程的åžå很难超过10万,å³ä½¿24核全部用满,åžåä¹Ÿåªæœ‰240万,ä¸åŠä¸€ä¸ªçº¿ç¨‹ã€‚这正是以http server为典型的æœåŠ¡é€‰ç”¨[å•线程模型](threading_overview.md#å•线程reactor)的原因(多个线程独立è¿è¡Œeventloop): 大部分httpè¯·æ±‚çš„å¤„ç†æ—¶é—´æ˜¯å¯é¢„测的,对下游的访问也ä¸ä¼šæœ‰ä»»ä½•阻塞代ç ã€‚这个模型å¯ä»¥æœ€å¤§åŒ–cpuåˆ©ç”¨çŽ‡ï¼ŒåŒæ—¶æä¾›å¯æŽ¥å—的延时。 + +多线程付出这么大的代价是为了**隔离请求间的影å“**ã€‚ä¸€ä¸ªè®¡ç®—å¤æ‚或索性阻塞的过程ä¸ä¼šå½±å“到其他请求,1%的长尾最终åªä¼šå½±å“到1%的性能。而多个独立的线程是ä¿è¯ä¸äº†è¿™ç‚¹çš„,一个请求进入了一个线程就等于“定了终生â€ï¼Œå¦‚æžœå‰é¢çš„请求慢了一下,那也åªèƒ½è·Ÿç€æ…¢äº†ã€‚1%的长尾会影å“远超1%的请求,最终表现ä¸ä½³ã€‚æ¢å¥è¯è¯´ï¼Œä¹çœ‹ä¸ŠåŽ»å¤šçº¿ç¨‹æ¨¡åž‹â€œæ…¢â€äº†ï¼Œä½†åœ¨çœŸå®žåº”用中åè€Œä¼šèŽ·å¾—æ›´å¥½çš„ç»¼åˆæ€§èƒ½ã€‚ + +延时能精确地体现出长尾的干扰作用,如果普通请求的延时没有被长尾请求干扰,就说明RPCæˆåŠŸåœ°éš”ç¦»äº†è¯·æ±‚ã€‚è€ŒQPS无法体现这点,åªè¦CPU都在忙,å³ä½¿ä¸€ä¸ªæ­£å¸¸è¯·æ±‚进入了挤满长尾的队列而被严é‡å»¶è¿Ÿï¼Œæœ€ç»ˆçš„QPS也å˜åŒ–ä¸å¤§ã€‚为了测é‡é•¿å°¾çš„干扰作用,我们在涉åŠåˆ°å»¶æ—¶çš„æµ‹è¯•中都增加了1%的长尾请求。 + +# 开始测试 + +## 环境 + +性能测试使用的机器é…置为: + +- 啿œº1: CPU开超线程24核,E5-2620 @ 2.00GHzï¼›64GB内存;OS linux 2.6.32_1-15-0-0 +- 多机1(15å°+8å°ï¼‰: CPU凿œªå¼€è¶…线程12核,其中15å°çš„CPU为E5-2420 @ 1.90GHz.,64GB内存,åƒå…†ç½‘å¡ï¼Œæ— æ³•å¼€å¯å¤šé˜Ÿåˆ—。其余8å°ä¸ºE5-2620 2.0GHz,åƒå…†ç½‘å¡ï¼Œç»‘定多队列到å‰8个核。这些长期测试机器比较æ‚,跨了多个机房,测试中延时在1ms以上的就是这批机器。 +- 多机2(30å°ï¼‰: CPU未开超线程12核,E5-2620 v3 @ 2.40GHz.ï¼›96GB内存;OS linux 2.6.32_1-17-0-0;万兆网å¡ï¼Œç»‘定多队列到å‰8个核。这是临时借用的新机器,é…ç½®éžå¸¸å¥½ï¼Œéƒ½åœ¨å¹¿å·žæœºæˆ¿ï¼Œå»¶æ—¶éžå¸¸çŸ­ï¼Œæµ‹è¯•中延时在几百微秒的就是这批机器。 + +䏋颿‰€æœ‰çš„æ›²çº¿å›¾æ˜¯ä½¿ç”¨brpcå¼€å‘çš„dashboard程åºç»˜åˆ¶çš„,去掉路径åŽå¯ä»¥çœ‹åˆ°å’Œæ‰€æœ‰brpc +server一样的[内置æœåŠ¡](builtin_service.md)。 + +## é…ç½® + +如无特殊说明,所有测试中的é…ç½®åªæ˜¯æ•°é‡å·®å¼‚(线程数,请求大å°ï¼Œclient个数etcï¼‰ï¼Œè€Œä¸æ˜¯æ¨¡åž‹å·®å¼‚。我们确ä¿ç”¨æˆ·çœ‹åˆ°çš„qps和延时是åŒä¸€ä¸ªåœºæ™¯çš„ä¸åŒç»´åº¦ï¼Œè€Œä¸æ˜¯æ— æ³•统一的两个场景。 + +所有RPC server都é…置了24个工作线程,这些线程一般è¿è¡Œç”¨æˆ·çš„处ç†é€»è¾‘。关于æ¯ç§RPC的特殊说明: + +- UB: é…置了12个reactor线程,使用EPOOL模型。连接池é™åˆ¶æ•°é…置为线程个数(24) +- hulu-pbrpc: é¢å¤–é…置了12个IO线程。这些线程会处ç†fd读å–,请求解æžç­‰ä»»åŠ¡ã€‚hulu有个“共享队列“的é…ç½®é¡¹ï¼Œé»˜è®¤ä¸æ‰“开,作用是把fd陿€æ•£åˆ—到多个线程中,由于线程间ä¸å†äº‰æŠ¢ï¼Œhuluçš„qps会显著æé«˜ï¼Œä½†ä¼šæ˜Žæ˜¾åœ°è¢«é•¿å°¾å½±å“(原因è§[测试方法](#测试方法))。考虑到大部分使用者并ä¸ä¼šåŽ»æ”¹é…ç½®ï¼Œæˆ‘ä»¬ä¹Ÿé€‰æ‹©ä¸æ‰“开。 +- thrift: é¢å¤–é…置了12个IO线程。这些线程会处ç†fd读å–,请求解æžç­‰ä»»åŠ¡ã€‚thriftçš„client䏿”¯æŒå¤šçº¿ç¨‹ï¼Œæ¯ä¸ªçº¿ç¨‹å¾—使用独立的client,连接也都是分开的。 +- sofa-pbrpc: 按照sofaåŒå­¦çš„è¦æ±‚,把io_service_pool_sizeé…置为24,work_thread_numé…置为1。大概å«ä¹‰æ˜¯ä½¿ç”¨ç‹¬ç«‹çš„24组线程池,æ¯ç»„1个worker thread。和hulu䏿‰“å¼€â€œå…±äº«é˜Ÿåˆ—â€æ—¶ç±»ä¼¼ï¼Œè¿™ä¸ªé…置会显著æé«˜sofa-pbrpcçš„QPSï¼Œä½†åŒæ—¶ä½¿å®ƒå¤±åŽ»äº†å¤„ç†é•¿å°¾çš„能力。如果你在真实产å“中使用,我们ä¸å»ºè®®è¿™ä¸ªé…置。(而应该用io_service_pool_size=1, work_thread_num=24) +- brpc: 尽管brpcçš„clientè¿è¡Œåœ¨bthread中时会获得10%~20%çš„QPSæå‡å’Œæ›´ä½Žçš„延时,但测试中的client都è¿è¡Œç»Ÿä¸€çš„pthread中。 + +所有的RPC clientéƒ½ä»¥å¤šä¸ªçº¿ç¨‹åŒæ­¥æ–¹å¼å‘é€ï¼Œè¿™ç§æ–¹æ³•最接近于真实系统中的情况,在考察QPS时也兼顾了延时因素。 + +ä¸€ç§æµè¡Œçš„æ–¹æ¡ˆæ˜¯clientä¸åœåœ°å¾€è¿žæŽ¥ä¸­å†™å…¥æ•°æ®çœ‹server表现,这个方法的弊端在于: server一下å­èƒ½è¯»å‡ºå¤§é‡è¯·æ±‚,ä¸åŒRPCçš„æ¯”æ‹¼å˜æˆäº†â€œfor循环执行用户代ç â€çš„æ¯”æ‹¼ï¼Œè€Œä¸æ˜¯åˆ†å‘请求的效率。在真实系统中serverå¾ˆå°‘èƒ½åŒæ—¶è¯»åˆ°è¶…过4个请求。这个方法也完全放弃了延时,client其实是让server陷入了雪崩时æ‰ä¼šè¿›å…¥çš„状æ€ï¼Œæ‰€æœ‰è¯·æ±‚éƒ½å› å¤§é‡æŽ’é˜Ÿè€Œè¶…æ—¶äº†ã€‚ + +## åŒæœºå•client→å•server在ä¸åŒè¯·æ±‚下的QPS(越高越好) + +本测试è¿è¡Œåœ¨[啿œº1](#环境)上。图中的数值å‡ä¸ºç”¨æˆ·æ•°æ®çš„字节数,实际的请求尺寸还è¦åŒ…括å议头,一般会增加40字节左å³ã€‚ + +(X轴是用户数æ®çš„字节数,Y轴是对应的QPS) + +![img](../images/qps_vs_reqsize.png) + +以_mc结尾的曲线代表clientå’Œserverä¿æŒå¤šä¸ªè¿žæŽ¥ï¼ˆçº¿ç¨‹æ•°ä¸ªï¼‰ï¼Œåœ¨æœ¬æµ‹è¯•中会有更好的表现。 + +**分æž** + + * brpc: 当请求包å°äºŽ16KB时,å•连接下的åžå超过了多连接的ubrpc_mcå’Œthrift_mc,éšç€è¯·æ±‚包å˜å¤§ï¼Œå†…核对å•个连接的写入速度æˆä¸ºç“¶é¢ˆã€‚而多连接下的brpc则达到了测试中最高的2.3GB/s。注æ„: 虽然使用连接池的brpc在å‘é€å¤§åŒ…æ—¶åžå更高,但也会耗费更多的CPU(UBå’Œthrift也是这样)。下图中的å•连接brpcå·²ç»å¯ä»¥æä¾›800多兆的åžå,足以打满万兆网å¡ï¼Œè€Œä½¿ç”¨çš„CPUå¯èƒ½åªæœ‰å¤šé“¾æŽ¥ä¸‹çš„1/2(写出过程是[wait-freeçš„](io.md#呿¶ˆæ¯)),真实系统中请优先使用å•链接。 +* thrift: åˆæœŸæ˜Žæ˜¾ä½ŽäºŽbrpc,éšç€åŒ…å˜å¤§è¶…过了å•连接的brpc。 +* UB:å’Œthrift类似的曲线,但平å‡è¦ä½Ž4-5万QPS,在32K包时超过了å•连接的brpc。整个过程中QPS几乎没å˜è¿‡ã€‚ +* gRPC: åˆæœŸå‡ ä¹Žä¸ŽUB平行,但低1万左å³ï¼Œè¶…过8K开始下é™ã€‚ +* hulu-pbrpcå’Œsofa-pbrpc: 512字节å‰é«˜äºŽUBå’ŒgRPC,但之åŽå°±æ€¥è½¬ç›´ä¸‹ï¼Œç›¸ç»§åž«åº•。这个趋势是写ä¸å¤Ÿå¹¶å‘的迹象。 + +## åŒæœºå•client→å•server在ä¸åŒçº¿ç¨‹æ•°ä¸‹çš„QPS(越高越好) + +本测试è¿è¡Œåœ¨[啿œº1](#环境)上。 + +(X轴是线程数,Y轴是对应的QPS) + +![img](../images/qps_vs_threadnum.png) + +**分æž** + +brpc: éšç€å‘é€çº¿ç¨‹å¢žåŠ ï¼ŒQPS在快速增加,有很好的多线程扩展性。 + +UBå’Œthrift: 8个线程下高于brpc,但超过8个线程åŽè¢«brpc迅速超过,thrift继续“平移â€ï¼ŒUB出现了明显下é™ã€‚ + +gRPC,hulu-pbrpc,sofa-pbrpc: 几乎é‡åˆï¼Œ256个线程时相比1ä¸ªçº¿ç¨‹æ—¶åªæœ‰1å€çš„æå‡ï¼Œå¤šçº¿ç¨‹æ‰©å±•性ä¸ä½³ã€‚ + +## åŒæœºå•client→å•server在固定QPS下的延时[CDF](vars.md#统计和查看分ä½å€¼)(越左越好,越直越好) +本测试è¿è¡Œåœ¨[啿œº1](#环境)上。考虑到ä¸åŒRPC的处ç†èƒ½åŠ›ï¼Œæˆ‘ä»¬é€‰æ‹©äº†ä¸€ä¸ªè¾ƒä½Žã€åœ¨ä¸å°‘系统中会达到的的QPS: 1万。 + +本测试中有1%的长尾请求耗时5毫秒,长尾请求的延时ä¸è®¡å…¥ç»“果,因为我们考察的是普通请求是å¦è¢«åŠæ—¶å¤„ç†äº†ã€‚ + +(X轴是延时(微秒),Y轴是å°äºŽX轴延时的请求比例) + +![img](../images/latency_cdf.png) + +**分æž** +- brpc: å¹³å‡å»¶æ—¶çŸ­ï¼Œå‡ ä¹Žæ²¡æœ‰è¢«é•¿å°¾å½±å“。 +- UBå’Œthrift: å¹³å‡å»¶æ—¶æ¯”brpc高1毫秒,å—长尾影å“ä¸å¤§ã€‚ +- hulu-pbrpc: èµ°å‘å’ŒUBå’Œthrift类似,但平å‡å»¶æ—¶è¿›ä¸€æ­¥å¢žåŠ äº†1毫秒。 +- gRPC : åˆæœŸä¸é”™ï¼Œåˆ°é•¿å°¾åŒºåŸŸåŽè¡¨çŽ°ç³Ÿç³•ï¼Œç›´æŽ¥æœ‰ä¸€éƒ¨åˆ†è¯·æ±‚è¶…æ—¶äº†ã€‚ï¼ˆå夿µ‹è¯•éƒ½æ˜¯è¿™æ ·ï¼Œåƒæ˜¯æœ‰bug) +- sofa-pbrpc: 30%的普通请求(上图未显示)被长尾严é‡å¹²æ‰°ã€‚ + +## 跨机多client→å•serverçš„QPS(越高越好) + +本测试è¿è¡Œåœ¨[多机1](#环境)上。 + +(X轴是client数,Y轴是对应的QPS) + +![img](../images/qps_vs_multi_client.png) + +**分æž** +* brpc: éšç€cilent增加,serverçš„QPS在快速增加,有ä¸é”™çš„client扩展性。 +* sofa-pbrpc: éšç€client增加,serverçš„QPS也在快速增加,但幅度ä¸å¦‚brpc,client扩展性也ä¸é”™ã€‚从16个client到32个clientæ—¶çš„æå‡è¾ƒå°ã€‚ +* hulu-pbrpc: éšç€client增加,serverçš„QPS在增加,但幅度进一步å°äºŽsofa-pbrpc。 +* UB: 增加client几乎ä¸èƒ½å¢žåŠ serverçš„QPS。 +* thrift: å¹³å‡QPS低于UB,增加client几乎ä¸èƒ½å¢žåŠ serverçš„QPS。 +* gRPC: 垫底ã€å¢žåŠ client几乎ä¸èƒ½å¢žåŠ serverçš„QPS。 + +## 跨机多client→å•server在固定QPS下的延时[CDF](vars.md#统计和查看分ä½å€¼)(越左越好,越直越好) + +本测试è¿è¡Œåœ¨[多机1](#环境)上。负载å‡è¡¡ç®—法为round-robin或RPC默认æä¾›çš„。由于有32个client且一些RPCçš„å•client能力ä¸ä½³ï¼Œæˆ‘们为æ¯ä¸ªclient仅设定了2500QPS,这是一个真实业务系统能达到的数字。 + +本测试中有1%的长尾请求耗时15毫秒,长尾请求的延时ä¸è®¡å…¥ç»“果,因为我们考察的是普通请求是å¦è¢«åŠæ—¶å¤„ç†äº†ã€‚ + +(X轴是延时(微秒),Y轴是å°äºŽX轴延时的请求比例) + +![img](../images/multi_client_latency_cdf.png) + +**分æž** +- brpc: å¹³å‡å»¶æ—¶çŸ­ï¼Œå‡ ä¹Žæ²¡æœ‰è¢«é•¿å°¾å½±å“。 +- UBå’Œthrift: å¹³å‡å»¶æ—¶çŸ­ï¼Œå—长尾影å“å°ï¼Œå¹³å‡å»¶æ—¶é«˜äºŽbrpc +- sofa-pbrpc: 14%的普通请求被长尾严é‡å¹²æ‰°ã€‚ +- hulu-pbrpc: 15%的普通请求被长尾严é‡å¹²æ‰°ã€‚ +- gRPC: å·²ç»å®Œå…¨å¤±æŽ§ï¼Œéžå¸¸ç³Ÿç³•。 + +## 跨机多client→多server在固定QPS下的延时[CDF](vars.md#统计和查看分ä½å€¼)(越左越好,越直越好) + +本测试è¿è¡Œåœ¨[多机2](#环境)上。20å°æ¯å°è¿è¡Œ4个clientï¼Œå¤šçº¿ç¨‹åŒæ­¥è®¿é—®10å°server。负载å‡è¡¡ç®—法为round-robin或RPC默认æä¾›çš„。由于gRPC访问多server较麻烦且有很大概率ä»è¡¨çްä¸ä½³ï¼Œè¿™ä¸ªæµ‹è¯•ä¸åŒ…å«gRPC。 + +本测试中有1%的长尾请求耗时10毫秒,长尾请求的延时ä¸è®¡å…¥ç»“果,因为我们考察的是普通请求是å¦è¢«åŠæ—¶å¤„ç†äº†ã€‚ + +(X轴是延时(微秒),Y轴是å°äºŽX轴延时的请求比例) + +![img](../images/multi_server_latency_cdf.png) + +**分æž** +- brpcå’ŒUB: å¹³å‡å»¶æ—¶çŸ­ï¼Œå‡ ä¹Žæ²¡æœ‰è¢«é•¿å°¾å½±å“。 +- thrift: å¹³å‡å»¶æ—¶æ˜¾è‘—高于brpcå’ŒUB。 +- sofa-pbrpc: 2.5%的普通请求被长尾严é‡å¹²æ‰°ã€‚ +- hulu-pbrpc: 22%的普通请求被长尾严é‡å¹²æ‰°ã€‚ + +## 跨机多client→多server→多server在固定QPS下的延时[CDF](vars.md#统计和查看分ä½å€¼)(越左越好,越直越好) + +本测试è¿è¡Œåœ¨[多机2](#环境)上。14å°æ¯å°è¿è¡Œ4个clientï¼Œå¤šçº¿ç¨‹åŒæ­¥è®¿é—®8å°server,这些serverè¿˜ä¼šåŒæ­¥è®¿é—®å¦å¤–8å°server。负载å‡è¡¡ç®—法为round-robin或RPC默认æä¾›çš„。由于gRPC访问多server较麻烦且有很大概率ä»è¡¨çްä¸ä½³ï¼Œè¿™ä¸ªæµ‹è¯•ä¸åŒ…å«gRPC。 + +本测试中有1%的长尾请求耗时10毫秒,长尾请求的延时ä¸è®¡å…¥ç»“果,因为我们考察的是普通请求是å¦è¢«åŠæ—¶å¤„ç†äº†ã€‚ + +(X轴是延时(微秒),Y轴是å°äºŽX轴延时的请求比例) + +![img](../images/twolevel_server_latency_cdf.png) + +**分æž** +- brpc: å¹³å‡å»¶æ—¶çŸ­ï¼Œå‡ ä¹Žæ²¡æœ‰è¢«é•¿å°¾å½±å“。 +- UB: å¹³å‡å»¶æ—¶çŸ­ï¼Œé•¿å°¾åŒºåŸŸç•¥å·®äºŽbrpc。 +- thrift: å¹³å‡å»¶æ—¶æ˜¾è‘—高于brpcå’ŒUB。 +- sofa-pbrpc: 17%的普通请求被长尾严é‡å¹²æ‰°ï¼Œå…¶ä¸­2%的请求延时æžé•¿ã€‚ +- hulu-pbrpc: 基本消失在视野中,已无法正常工作。 + +# 结论 + +brpc: 在åžå,平å‡å»¶æ—¶ï¼Œé•¿å°¾å¤„ç†ä¸Šéƒ½è¡¨çŽ°ä¼˜ç§€ã€‚ + +UB: å¹³å‡å»¶æ—¶å’Œé•¿å°¾å¤„ç†çš„表现都ä¸é”™ï¼Œåžå的扩展性较差,æé«˜çº¿ç¨‹æ•°å’Œclient数几乎ä¸èƒ½æå‡åžå。 + +thrift: 啿œºçš„å¹³å‡å»¶æ—¶å’Œåžåå°šå¯ï¼Œå¤šæœºçš„å¹³å‡å»¶æ—¶æ˜Žæ˜¾é«˜äºŽbrpcå’ŒUB。åžå的扩展性较差,æé«˜çº¿ç¨‹æ•°å’Œclient数几乎ä¸èƒ½æå‡åžå。 + +sofa-pbrpc: 处ç†å°åŒ…çš„åžåå°šå¯ï¼Œå¤§åŒ…çš„åžå显著低于其他RPC,延时å—长尾影å“很大。 + +hulu-pbrpc: 啿œºè¡¨çŽ°å’Œsofa-pbrpc类似,但多机的延时表现æžå·®ã€‚ + +gRPC: 几乎在所有å‚与的测试中垫底,å¯èƒ½å®ƒçš„å®šä½æ˜¯ç»™google cloud platform的用户æä¾›ä¸€ä¸ªå¤šè¯­è¨€ï¼Œå¯¹ç½‘络å‹å¥½çš„å®žçŽ°ï¼Œæ€§èƒ½è¿˜ä¸æ˜¯è¦åŠ¡ã€‚ + diff --git a/docs/cn/benchmark_http.md b/docs/cn/benchmark_http.md new file mode 100644 index 0000000..36086fc --- /dev/null +++ b/docs/cn/benchmark_http.md @@ -0,0 +1,5 @@ +å¯ä»£æ›¿[ab](https://httpd.apache.org/docs/2.2/programs/ab.html)测试http serveræžé™æ€§èƒ½ã€‚ab功能较多但年代久远,有时本身å¯èƒ½ä¼šæˆä¸ºç“¶é¢ˆã€‚benchmark_http基本上就是一个brpc http client,性能很高,功能较少,一般压测够用了。 + +使用方法: + +首先你得[下载和编译](getting_started.md)了brpcæºç ï¼Œç„¶åŽåŽ»example/http_c++目录编译,æˆåŠŸåŽåº”该能看到benchmark_http。 diff --git a/docs/cn/brpc_intro.pptx b/docs/cn/brpc_intro.pptx new file mode 100644 index 0000000000000000000000000000000000000000..b3bd4b22b326460ba833d6eda571c75d7d537ff5 GIT binary patch literal 1715846 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 NOWfoVi40Vuh#1u1&D^$P@PPA_O&cu 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