testing: drop SO_REUSEADDR from the port-availability probe (#214)
PickAvailablePort()/PickAvailableEndpoint() probe a candidate port by binding to it, but the probe socket set SO_REUSEADDR before binding 0.0.0.0:port. On macOS/BSD that lets the probe succeed even while another process (e.g. a sibling test’s server) already holds 127.0.0.1:port, falsely reporting the port as free. The caller then binds its real server to the same port and fails with EADDRINUSE.
This only surfaces under parallel test execution, where multiple tests grab ports concurrently – e.g. logging_test failing with “Cannot bind socket to [127.0.0.1:5136]. : Address already in use” when run alongside server_test/server_group_test/integration_test.
An availability probe must observe the port exactly as a fresh server bind would, so it must not set SO_REUSEADDR. Without it, an occupied port is correctly rejected and PickAvailablePort() retries another random port. Verified with a deterministic repro (occupied 127.0.0.1:P; probe with SO_REUSEADDR reports free, without it reports occupied) and by stress-running the four port-grabbing rpc tests in parallel.
Co-authored-by: Claude Opus 4.8 noreply@anthropic.com
版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9
京公网安备 11010802047560号
Flare 后台服务开发框架
Flare Backend Service Framework
English Document
腾讯广告 是腾讯公司最重要的业务之一,其后台大量采用 C++ 开发。
Flare 是我们在汲取自研服务框架经验、参考业界开源项目和最新研究成果的基础上,开发的现代化后台服务开发框架。目标是在当今主流软硬件环境下,提供易用、高性能、平稳的服务开发能力。
Flare 项目始于 2019 年,目前广泛应用于腾讯广告的各类后台服务,拥有数以万计的运行实例,在生产系统上经受了充分的考验。
2021 年 5 月,我们本着回馈社区、技术共享的精神正式将 Flare 开源。
特点
系统要求
Linux
std::atomic<T>::wait/notify_*的 libstdc++ 版本,参见 P1135)macOS
std::atomic<T>::wait/notify_*运行期符号)开始使用
Flare 是开箱即用的,已经自带了所需的第三方库,通常不需要额外安装依赖。
thirdparty/下的源码包通过 Git LFS 存储,因此拉取代码前请确保git-lfs已正确安装。构建
我们使用
blade进行日常开发:./blade build ..../blade test ...Flare 也支持
bazel作为构建系统,参见 bazel support。之后可以参考入门导引,搭建一个简单的 RPC 服务。
调试
我们认为调试体验是开发维护过程中很重要的一环,为此提供了:
测试
为改善编写单测的体验,我们提供了一些测试工具,包括但不限于:
示例
我们提供了一些使用示例,下面是一个简单的转发服务(同时演示了 RPC 客户端与服务端的使用):
Flare 内部基于 M:N 用户态线程实现,因此通过 Flare 同步请求外部服务、调用 Flare 内置的各种客户端 的同步接口都不会带来性能问题。如有更复杂的并发或异步需求,可参考 Fiber 文档。
另外,示例中的
*.flare.pb.h通过 Flare 的 Protocol Buffers 插件 生成。相对于 Protocol Buffers 原生的cc_generic_services,这种方式生成的接口更易用。更复杂的示例
实际使用中往往需要并发请求多种后端,下面的示例展示了如何在 Flare 中实现这种模式:
这个示例中,我们:
flare::fiber::BlockingGet同步等待所有请求完成——这里只会阻塞用户态线程,不会有性能问题出于展示目的,这里请求的是三个异构服务。如有需要,也可以用同样的方式请求同构服务、或同构异构混合的服务。
参与开发
我们非常欢迎共建。希望了解 Flare 更多内部设计的开发者、或需要对 Flare 进行二次开发的开发者,可参考
flare/doc/下的技术文档。详情请参考 CONTRIBUTING.md。
性能
由于业务需求的特点,我们在设计中更倾向于优化延迟及其平稳性,而非吞吐;但在这一前提下也尽力兼顾性能。
简单的对比数据可见初步性能数据。
致谢
在此向上述项目一并致以谢意。