0%

周谈(6)- yang版本升级兼容

前言

在工作中,每周都会遇到一些问题,这些问题在大家工作中可能会有许多共性,于我也是一种经验的积累小结。我觉得花一些时间整理一下,跟粉丝读者们分享一下日常工作遇到的问题,这是一个很好的互动和文章分享的痛点。

这是第六篇, 下面看问题。

yang版本升级兼容

项目使用yang文件对数据进行管理,在开发阶段,yang文件定义经常变化,许多是不兼容的变化,毕竟在开发阶段许多数据都还没最终确定下来,随着开发的进展需求也渐渐的迭代,免不了出现不兼容的情况。原先使用sysrepo自带的sysrepocfg -U 命令升级yang文件,一旦出现有不兼容的问题,sysrepo就会抛出异常,无法安装新的yang文件,还把那个sysrepo的共享文件给锁死了,无法恢复。

前面开发比较紧张,先提供了一个脚本,在不兼容升级的情况下,调用脚本进行数据清理,然后重新安装yang文件。这样子每次遇到有yang不兼容的情况,都需要进行数据清理。由于yang的不兼容,即使保存了原有的配置,重新导入也是不成功的。

这周项目进入了尾声,手上就留了一两个无法复现的问题,暂时没有思路。抽空先研究一下如何自动升级而又可以保存配置,领导对这个事情也比较重视,亲自盯进度了。

按原先的思路是进行不下去了,一旦有不兼容yang文件升级,libyang库就会报错,看了两天那个libyang的代码还是没有头绪,代码不熟悉,另外代码量也太大了,同时还总会被其他事情打断。只能另想法子了。

先验证了一下把配置拆分,使得可以支持配置按模块导入,但是模块间相互依赖的话,会因为无法通过校验而导入失败,所以还是得整体一块导入。

然后,就是看如何剔除不兼容的配置了。去看了sysrepo的代码,没有找着方法。

正是山重水复疑无路,没想到柳暗花明又一村了。想着这种问题,原厂应该有解决方案才是的。认真研究了一下产商初始的deb的安装包逻辑,找到了一个脚本清理数据的,就是用来剔除不兼容配置的。在每次服务启动的时候,都会调用一下这个脚本,验证了一下,功能还是可用的。这样即使yang不兼容升级,也可以保证兼容部分的配置不会丢失,仅丢失不兼容的那部分配置。

接下来就只需要解决不兼容yang安装报错,导致sysrepo锁死的问题了。时间比较紧,从头梳理sysrepo和libyang的代码逻辑是比较费时的,只能想法子绕过了。既然直接升级会报错,那么就先卸载旧的yang,再安装新的yang。嗯,验证了一下,发现部分被依赖的yang无法卸载,还是会存在部分yang不兼容升级不了的问题。这里,就去更改了sysrepo的源码,让特定的那几个yang即使被依赖也可以正常卸载。因为卸载这个动作,主要就是框架这边会用到,业务正常是不会执行这些动作的。

最后,就是梳理一下完整的启动升级的流程,重构一下整个启动流程的代码,再各种场景验证一下,确保功能都是满足期望的。OK,程序升级改造完成,耗时一周,最终的效果还有个小惊喜,发现改造完之后,升级的速度比之前快了不少。

更多

有一句话叫做“认知决定思维,思维决定行为,行为决定结果”,工作当中遇到了问题,如何解决问题,解决问题的效果跟我们的知识也是一样的关系。不同的认知,决定不同的处理方式,会达到不同的结果。

行动,才不会被动!

欢迎关注个人公众号 微信 -> 搜索 -> fishmwei,沟通交流。