惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
Help Net Security
Help Net Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
GbyAI
GbyAI
博客园_首页
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
L
LINUX DO - 最新话题
PCI Perspectives
PCI Perspectives
博客园 - 三生石上(FineUI控件)
V2EX - 技术
V2EX - 技术
Spread Privacy
Spread Privacy
T
Tor Project blog
量子位
阮一峰的网络日志
阮一峰的网络日志
S
SegmentFault 最新的问题
小众软件
小众软件
博客园 - 叶小钗
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Blog — PlanetScale
Blog — PlanetScale
H
Help Net Security
Y
Y Combinator Blog
N
News | PayPal Newsroom
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Tenable Blog
Scott Helme
Scott Helme
G
GRAHAM CLULEY
大猫的无限游戏
大猫的无限游戏
aimingoo的专栏
aimingoo的专栏
IT之家
IT之家
Schneier on Security
Schneier on Security
F
Fortinet All Blogs
Martin Fowler
Martin Fowler
T
Threat Research - Cisco Blogs
博客园 - 司徒正美
Application and Cybersecurity Blog
Application and Cybersecurity Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Attack and Defense Labs
Attack and Defense Labs
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Last Watchdog
The Last Watchdog
L
LangChain Blog
C
Check Point Blog
Google Online Security Blog
Google Online Security Blog
V
Visual Studio Blog
Latest news
Latest news

I'm OWenT

国产大模型(GLM 5.1、Kimi K2.6)真实场景效果和 Coding Plan 额度测试 新版本libatapp的连接管理——从etcd服务发现到拓扑驱动的自动重连 新版本libatbus的设计变更——从树形路由到拓扑驱动 Protobuf又一坑 - C++标准和ABI兼容性 AI真好用-给Blog主题统一加mermaid,chart.js,excalidraw,draw.io的多种引入方式支持 给内网部署Squid-通用HTTP下载缓存 UE使用CodeChecker和clang-tidy生成静态分析报告 找出UE的循环依赖 C++小协程栈和临时变量及作用域的栈溢出问题分析 游戏服务的可观测性能力建设(C++生态) 指标上报的多线程优化和多拉取源点优化 协程(libcopp)的Channel功能和CPU命中率优化 通用RPC代码生成器 实现strong_rc_ptr(比shared_ptr更快的引用计数智能指针) 手夯一个STL allocator和对象内存分析组件 std::condition_variable 的信号丢失问题 踩坑一处(GCC)STL std::async 实现BUG导致的crash问题 GCC 14的一个warning to error BUG 给xresloader(Excel导表工具)增强UE读表支持(包含蓝图,Blueprint) Opentelemetry社区在gRPC的几个链接问题(静态库和动态库混用,musl工具链,符号裁剪) Excel转表工具(xresloader)的新验证器(验证外部Excel和文本数据,唯一性和自定义规则) 关于protobuf近期版本(v20/v3.20+)和 gRPC v1.54版本在某些编译环境下的一些链接和编译问题 xresloader-Excel导表工具链的近期变更汇总 打通游戏服务端框架的C++20协程改造的最后一环 Opentelemetry-cpp的Logs模块标准更新(涉及近期版本:1.8-1.9的BREAK CHANGES) 给cmake-toolset和工具链(curl等)加HTTP/2和HTTP/3支持 又开新坑之 coredns 插件: nftables和filter 关于opentelemetry-cpp社区对于C++ Head Only组件单例和符号可见性的讨论小记 填个转表工具 xresloader 去年的坑(数组尾部裁剪) 集成 upb 和 lua binding 的踩坑小记 libcopp对C++20协程的接入和接口设计 再度优化GCC、LLVM、Clang、libc++、libc++abi等套件的构建脚本 游戏服务的分布式事务优化(二)- 事务管理 游戏服务的分布式事务优化(一)- Write Ahead Log(WAL) 模块 记录一些bazel适配用编译选项 测试现代化硬件C++浮点数性能和一致性 适配Boringssl和OpenSSL 3.0 近期cmake-toolset的一些适配问题 C++20 Text Formatting/fmtlib 适配问题小记 再次重构LLVM+Clang+libcxx+libc++abi+其他相关工具的构建流程 重构基于CMake的构建工具链 新版GCC和LLVM+Clang终于Release啦 折腾一下nftables下的双拨 [C++20] Module partitions和符号交叉引用(声明和实现分离) [Rust] 实现一个线程安全且迭代器可以保存的链表 基于protobuf的代码生成 几个使用protobuf中C++接口的Arena的坑 Amazon Aurora DB存储引擎论文阅读小记 近期对libatapp的一些优化调整(增加服务发现和连接管理,支持yaml等) xresloader转表工具链增加了一些新功能(map,oneof支持,输出矩阵,基于模板引擎的加载代码生成等) 在游戏服务器中使用分布式事务 libcopp接入C++20 Coroutine和一些过渡期的设计 libatbus 的大幅优化 nftables初体验 容器配置开发环境小计 PALM Tree - 适合多核并发架构的B+树 - 论文阅读小记 跨平台协程库 - libcopp 简介 C++20 Coroutine 性能测试 (附带和libcopp/libco/libgo/goroutine/linux ucontext对比) 尝鲜Github Action 一些xresloader(转表工具)的改进 protobuf、flatbuffer、msgpack 针对小数据包的简单对比 协程框架(libcopp) 小幅优化 Excel转表工具(xresloader) 增加protobuf插件功能和集成 UnrealEngine 支持 Anna(支持任意扩展和超高性能的KV数据库系统)阅读笔记 C++20 Coroutine libcopp merge boost.context 1.69.0 Google去中心化分布式系统论文三件套(Percolator、Spanner、F1)读后感 Rust玩具-企业微信机器人通用服务 使用ELK辅助监控开发测试环境服务质量和问题定位 2018年的新通用伪随机数算法(xoshiro / xoroshiro)的C++(head only)实现 Webpack+vue+boostrap+ejs构建Web版GM工具 Rust的第二次接触-写个小服务器程序 理解和适配AEAD加密套件 atsf4g-co的进化:协程框架v2、对象路由系统和一些其他细节优化 协程框架(libcopp)v2优化、自适应栈池和同类库的Benchmark对比 可执行文件压缩 初识Rust 使用restructedtext编写xresloader文档 atframework的etcd模块化重构 C++的backtrace ECDH椭圆双曲线(比DH快10倍的密钥交换)算法简介和封装 protobuf-net的动态Message实现 pbc的proto3接入 atgateway内置协议流程优化-加密、算法协商和ECDH 整理一波软件源镜像同步工具+DevOps工具 Blog切换到Hugo libcopp v2的第一波优化完成 libcopp(v2) vs goroutine性能测试 libcopp的线程安全、栈池和merge boost.context 1.64.0 GCC 7和LLVM+Clang+libc++abi 4.0的构建脚本 libatbus的几个藏得很深的bug 用cmake交叉编译到iOS和Android 开源项目得一些小维护 atapp的c binding和c#适配 对象路由系统设计 2016年总结 近期的一个协程流程BUG 重写了llvm+clang+libc++和libc++abi的构建脚本 atsf4g完整游戏工程示例|I'm OWenT atframework基本框架已经完成|I'm OWenT
protobuf v22和gRPC v1.55版本升级的依赖变化和upb适配
owent · 2023-06-18 · via I'm OWenT

blog-website

前言

近期的 protobuf v22和 gRPC v1.55 版本在构建流程层面引入了一些比较大的变化。 最初我关注到这个问题是在我参与的一个社区项目 opentelemetry-cpp 的issue中( https://github.com/open-telemetry/opentelemetry-cpp/issues/2095 )。 直到后来,我们在自己的构建系统 cmake-toolsetprotobufgRPC 也进行了升级。所以顺带给社区的项目也提交了一些相关的Patch,在这里分享一下可能其他同学也会碰到。

protobuf 从v22开始引入了对 abseil-cpp 的依赖。和 gRPC 类似,它也可以通过 "-Dprotobuf_ABSL_PROVIDER=package" 告知构建系统从已安装位置查找,而不是自己重新构建一套。 另外对构建流程的影响就是,我在 cmake-toolset 中把 abseil-cpp 单独抽离出来并放在了 protobuf 之前了。 同时在我们的UE工程里依赖protobuf的位置也要链接 abseil-cpp 的相关依赖库,比如 absl_strings, absl_bad_variant_access 等等。

同时,它还移除了一些和 abseil-cpp 内重复的接口,比如说原来做Base64转换的接口被移除了,现在适配 Base64Escape 的代码更长了, 比如下面对 opentelemetry-cpp 的PR #2163

#if defined(HAVE_ABSEIL)
#  include "absl/strings/escaping.h"
#elif defined(GOOGLE_PROTOBUF_VERSION) && GOOGLE_PROTOBUF_VERSION >= 3007000
#  include "google/protobuf/stubs/strutil.h"
#else
#  include "google/protobuf/stubs/port.h"
#  include "google/protobuf/stubs/stringpiece.h"
namespace google
{
namespace protobuf
{
LIBPROTOBUF_EXPORT void Base64Escape(StringPiece src, std::string *dest);
}  // namespace protobuf
}  // namespace google
#endif

// ...
      std::string base64_value;
#if defined(HAVE_ABSEIL)
      absl::Base64Escape(bytes, &base64_value);
#else
      google::protobuf::Base64Escape(bytes, &base64_value);
#endif

gRPC v1.55 和 upb

去年我们项目组尝试使用 protobuf 官方的 upb 来实现lua集成,并写了一篇相关的分享: 《集成 upb 和 lua binding 的踩坑小记》 。 当时的主要问题是 gRPC 中集成了一个精简版的 upb,只包含运行时,不包含protoc-upb,protoc-upbdefs和protoc-upblua插件。 当我们要使用完整版本时,就需要自己编译出这几个组件,并且和 gRPC 混用的时候还需要版本保持一致,以防出现ABI兼容性问题。

upb 主要使用的是 bazel 构建系统,而我们使用 cmakegRPC 也支持 cmake。由于 upb 的外部依赖只有一项,且使用的功能比较简单。所以在 upb 的仓库里有一个简单的工具,去hook了 bazel 的基础接口,输出 cmake 的工程文件。 由于这个输出的 cmake 的工程文件只包含了运行时,不包含上面提到的几个插件的编译,所以我们就需要是修改这个工具,让它也能输出插件和常见的 protobuf 的well known type的upb支持文件。

在之前版本中,几乎是手夯了这几个工具及依赖构建流程。然后由于依赖中有直接源码引入第三方库 utf8_range,并且文件的位置相当随意。所以当时也是重新调整了一些依赖文件的位置,以减少未来冲突的可能性。另外由于原有导出的 cmake 工程文件不支持导出现代化 cmake 的CONFIG的package文件,所以也需要我们自己做支持来实现更好的依赖关系管理。 这些修订都可以在 https://github.com/atframework/cmake-toolset/blob/8c8659f2d64283b02a24b7c34ffcd0d24eb03ca6/ports/grpc/upb-e4635f223e7d36dfbea3b722a4ca4807a7e882e2.patch 。这里面除了上述功能外还有一些对于高版本 lua 适配和某些接口使用是UB的修订。(这些修订已经推送上游,详见:https://github.com/protocolbuffers/upb/pull/735https://github.com/protocolbuffers/upb/issues/734 。)

在新版本的 protobufgRPC 中,protobuf 在开启单元测试时也依赖 utf8_range 了,但是我们出预编译包可以不开启单元测试。而新版本 gRPC 也更新了新版的 upb,这个变化就比较大了。

首先是bootstrap编译的过程增加了多个stage。stage0用预制的 descriptor.upb.hdescriptor.upb.cc 等等编译 protoc-upb 插件;然后用这个插件生成stage1阶段的 descriptor.upb.hdescriptor.upb.cc 编译 protoc-upb 插件;最后用stage1阶段生成的 protoc-upb 插件生成 descriptor.upb.hdescriptor.upb.cc 等去生成stage2阶段的protoc-upb 插件、protoc-upbdefs 插件和protoc-upblua 插件等等。最后发布的是stage2阶段的库和工具。同时每个stage都有一系列的依赖组件,需要去设置依赖链。

同时 upb 也升级了对 utf8_range 的版本引用。新版本 utf8_range 已经支持 cmake 的CONFIG的package包管理了。

为了我们整体可以用统一并且兼容性更好的管理方式,并且上面bootstrap编译过程全部手夯以后太难维护了,所以我干脆实现了原先 upb 里留空的 def cc_binary(self, **kwargs): , def bootstrap_upb_proto_library(self, **kwargs): , def bootstrap_cc_library(self, **kwargs):def bootstrap_cc_binary(self, **kwargs): 。其中 def bootstrap_upb_proto_library(self, **kwargs): 比较复杂一些,三个stage不一样。

另外新版本的 upb 也依赖 abseil-cpp 了,但是 abseil-cppbazel 的target名称和 cmake 不完全一样,所以针对这些名字我们仍然需要手动转换。同理对 protobuf 的libprotoc 相关的依赖也一样。

对这些变化的初版可用版本我放在了 https://github.com/atframework/cmake-toolset/blob/8c8659f2d64283b02a24b7c34ffcd0d24eb03ca6/ports/grpc/upb-61a97efa24a5ce01fb8cc73c9d1e6e7060f8ea98.patch ,这个版本对应 gRPC v1.55 里引用的版本。然而 upb 的主干分支这个构建系统的流程又有一些变化和优化,为了方便以后维护,我就推了一个PR到 upb 主仓库,详见: https://github.com/protocolbuffers/upb/pull/1352/ 和两个相关的功能的issue: https://github.com/protocolbuffers/upb/issues/1350https://github.com/protocolbuffers/upb/issues/1351 。不过按之前推的PR的响应速度,感觉这个仓库对PR的响应非常慢。

写在最后

以上这些适配其实都是为了给 cmake-toolset 下一次升级做准备,但是现在还有一个上游库的支持没完成 (opentelemetry-cpp 对protobuf v22+的支持,详见: https://github.com/open-telemetry/opentelemetry-cpp/pull/2163 ),所以现在是新拉了一个分支,尚未合入。这个仓库因为这个提交可能影响ABI兼容性,所以社区还需要继续评估。等最终这个上游仓库合入完成了,我们就可以给 cmake-toolset 也切到新版本了。

最后,欢迎对相关话题有兴趣的小伙伴们互相交流。