当前位置:网站首页>【 protobuf 】 quelques puits causés par la mise à niveau de protobuf
【 protobuf 】 quelques puits causés par la mise à niveau de protobuf
2022-06-26 20:57:00 【Impression de Manon】
Il y a quelque temps, l'entreprise s'est appuyée sur un projet github.com/golang/protobuf La version de v1.3.3 Mise à jour vers v1.4.2,Cet article documente certains des problèmes rencontrés lors de la mise à niveau.
Google C'est exact. Go De protobuf Le rez - de - chaussée de la Bibliothèque a été considérablement amélioré,La nouvelle version du chemin du paquet a été transférée à google.golang.org/protobuf.
En même temps,Ces améliorations ont également été apportées à github.com/golang/protobuf:De v1.4 Depuis la version,github.com/golang/protobuf Il sera là. google.golang.org/protobuf Basé sur,Mais la compatibilité des interfaces sera garantie,Cela indique également la dépendance actuelle github.com/golang/protobuf Les projets de,Sans modification du Code supérieur.
Et pourtant,Nouvelle édition de protobuf-gen-go Utilisé google.golang.org/protobuf/protoreflect,Compilé message La structure est complètement différente de ce qu'elle était avant,Cela a causé des problèmes dans notre travail de mise à niveau.
1. Dans le Code XXX_Unmarshal Appel direct de
Ancienne version protoc-gen-go Ça va exposer un XXX_Unmarshal Interface,Utilisé dans proto.Unmarshal Appelé à, Certains collègues ont donc choisi d'appeler directement message.XXX_Unmarshal Méthodes.Nouvelle édition de proto Adoption ProtoReflect Exposition à l'interface message Information interne,Compiler pb.go Il n'y a plus de temps XXX_Unmarshal Méthodes, Il en résulte une erreur de temps de compilation message.XXX_Unmarshal undefined.
La solution est simple:Utilisez plutôt proto.Unmarshal C'est tout..
2. Erreur d'essai due à un changement de structure à l'intérieur de la structure
Pour le même message, La structure de l'ancienne version compilée est la suivante :
type HealthCheckResponse struct {
Status HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,proto3,enum=liulishuo.common.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"`
XXX_NoUnkeyedLiteral struct{
} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
Et la nouvelle version est construite comme suit :
type HealthCheckResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Status HealthCheckResponse_ServingStatus `protobuf:"varint,1,opt,name=status,proto3,enum=liulishuo.common.health.v1.HealthCheckResponse_ServingStatus" json:"status,omitempty"`
}
Je vois., Trois champs non exportés ont été ajoutés à la nouvelle version , Et ces trois champs ont causé des problèmes avec notre Code de test .
- cmp.Equal Heure panic
Nous avons utiliségithub.com/google/go-cmp/cmp.EqualC'est ça. proto Comparaison des structures , Et les champs non exportés dans la structure fontcmp.EqualEtcmp.Diffpanic:
panic: cannot handle unexported field at {
*pkg.SomeRequest}.state:
".../services_go_proto".SomeRequest
consider using a custom Comparer; if you control the implementation of type, you can also consider using an Exporter, AllowUnexported, or cmpopts.IgnoreUnexported [recovered]
go-cmp La façon recommandée est d'utiliser IgnoreUnexported, Mais de cette façon, vous devez passer tous les types que vous voulez ignorer , Pour les message Très hostile..
Après une recherche,Découverte protocmp.Transform Peut mettre tous les protobuf message Convertir en personnalisé map[string]interface{} Comparer,Pour que nous puissions utiliser Transform() Pour résoudre le problème:
import "google.golang.org/protobuf/testing/protocmp"
// ...
opt := protocomp.Trnasform()
if !cmp.Equal(exp, got, opt) {
t.Error(exp, got, opt)
}
- assert Coincé et plein de mémoire
Comparé à la question ci - dessus , Les questions suivantes sont encore plus étranges :Utilisergithub.com/stretchr/testify/assert.EqualComparer certains proto message Ça va se coincer., Pendant ce temps, l'utilisation de la mémoire augmente .
Essayez d'utiliser pprof Échantillonnage,C'est sorti. CPU Et la longueur de la carte d'échantillonnage du tas :


Je vois. spew.Dump Il y a une récursion infinie , Cela a entraîné une saisie du programme et une allocation continue de mémoire .
Je l'ai trouvé. testify De issue, Plusieurs solutions de contournement sont proposées dans les commentaires pertinents , Mais ce problème n'a pas encore été résolu .
Il existe deux solutions recommandées par les particuliers :
- Utiliser
marshalTextString()Oui. message Convertir en proto text,Puis comparez; - Utiliser
cmp.Equal,Unionprotocmp.Transform.
3. lint Erreur signalée copylocks
Traitement du test de traitement du Code d'entreprise terminé , Après le traitement du Code d'essai et lint À traiter.
Après la mise à niveau de notre projet ,go vet Le journal copylocks Erreur:assignment copies lock value to got: .../message_go_protos.Message contains google.golang.org/protobuf/internal/impl.MessageState contains sync.Mutex
La solution est aussi plus simple :Tout proto message Passer au pointeur à la place .
边栏推荐
- 记录一次Redis大Key的排查
- Gd32 USB composite device file descriptor
- 不要做巨嬰了
- 后台查找,如何查找网站后台
- Sword finger offer II 091 Paint the house
- C语言 文件光标 fseek
- C primer plus学习笔记 —— 3、字符的IO(输入/输出)
- Case description: the competition score management system needs to count the competition scores obtained by previous champions and record them in the file. The system has the following requirements: -
- MySQL - database creation and management
- leetcode刷题:字符串04(颠倒字符串中的单词)
猜你喜欢

Matrix calculator design for beginners of linear algebra based on Qt development

好物推薦:移動端開發安全工具

超分之VRT

Good thing recommendation: mobile terminal development security tool

leetcode刷题:哈希表08 (四数之和)

Disruptor local thread queue_ Use transprocessor processor and workpool to compare consumption - Notes on inter thread communication 005
Detailed explanation of stored procedures in MySQL

Leetcode: hash table 08 (sum of four numbers)

Two methods of QT to realize timer
![[Bayesian classification 2] naive Bayesian classifier](/img/44/dbff297e536508a7c18b76b21db90a.png)
[Bayesian classification 2] naive Bayesian classifier
随机推荐
基于SSH框架的学生信息管理系统
vue中缓存组件keep-alive
Garbage collection mechanism of browser
Arduino uno + DS1302 uses 31 byte static RAM to store data and print through serial port
0基础学c语言(3)
基于QT开发的线性代数初学者的矩阵计算器设计
515. 在每个树行中找最大值
【贝叶斯分类2】朴素贝叶斯分类器
0 basic C language (0)
孙老师版本JDBC(2022年6月12日21:34:25)
Détails de l'annotation des ressources sentinelles
[Bayesian classification 4] Bayesian network
c语言简单的登录
Arrête d'être un bébé géant.
windows系统下怎么安装mysql8.0数据库?(图文教程)
JWT操作工具类分享
Is it safe to open an account for CICC Wealth Online?
The postgraduate entrance examination in these areas is crazy! Which area has the largest number of candidates?
leetcode刷题:字符串03(剑指 Offer 05. 替换空格)
Leetcode question brushing: String 01 (inverted string)