前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >从一个 issue 修复看运维人员和资深程序员的思维碰撞

从一个 issue 修复看运维人员和资深程序员的思维碰撞

作者头像
wubx
发布2021-09-24 15:46:26
4040
发布2021-09-24 15:46:26
举报
文章被收录于专栏:MySQLBeginner

Great just isn't good enough

Datafuse

项目:https://github.com/datafuselabs/datafuse 新一代开源云原生数仓,使用上完全兼容 MySQL,ClikcHouse 。欢迎大家 Star | Fork | Watch.

issue 描述

上周 Datafuse 项目有一个测试脚本的 issue: https://github.com/datafuselabs/datafuse/issues/1676 其中涉及到的脚本 datafuse-test 是从 clickhouse repo 中借来的。

issue 作者提到的报错:

代码语言:javascript
复制
Starting datafuse-test
Traceback (most recent call last):
  File "/Users/kous/myProjects/rustproject/datafuse/tests/./datafuse-test", line 481, in <module>
    main(args)
  File "/Users/kous/myProjects/rustproject/datafuse/tests/./datafuse-test", line 345, in main
    for suite in sorted(os.listdir(base_dir), key=sute_key_func):
TypeError: '<' not supported between instances of 'tuple' and 'int'
make: *** [stateless-test] Error 1

这个报错很难复现,我把各个的环境升级到作者的环境一样,各种测试也没复现。后来还是重看代码,发现是key_func 函数中因为测试脚本不符合规则,引起返回出错代码造成的。

修复过程

第一种方案:程序员给的修复方案

代码语言:javascript
复制
def sute_key_func(item):
    if -1 == item.find('_'):
        return 99998
    prefix, suffix = item.split('_', 1)
    try:
        return int(prefix), suffix
    except ValueError:
        return 99997

These two return value must be all tuple: (int, string). 99997 is only an int, which causes this issue.

return (99997, "") should fix this issue

第二种方案:运维人员给的方案

我看到这个 issue 我也是首先想着在个人的环境复现一下,但各种运行也没看复现,最后看这个代码,也就是文件名中如果没有 “_" 这个附号,就会 return 一个整数。于是我给在测试目录,随意创建了一个 SQL 文件,复现了 issue 报错。再一看这个脚本的 Readme 要求,随便创建一个名字明显不附合规范呀。如果命名格式按着规范来是不会遇到报错的。

https://github.com/datafuselabs/datafuse/blob/master/tests/suites/0_stateless/README.md

于是我给的修复提示:May be your test file was named in the wrong format, so it went to an error logic.

Please revise your file naming format. refer to: cat suites/0_stateless/README.md

Test Name xx_yyyy_[test_name]

  • xx is category
  • yyyy is the sequence no under the category Test Category
  • 00 -- for Dummy tests, example
  • 01 -- for System tables tests, example
  • 02 -- for Function tests, example
  • 03 -- for Select tests, example
  • 04 -- for Explain tests, example
  • 05 -- for DDL tests, example
  • 06 -- for Show tests, example
  • 07 -- for Use tests, example
  • 08 -- for Optimizer tests, example
  • 09 -- for Remote engine tests, example
  • 10 -- for Describe tests, example Note: If your test is not in the above category, please add it.

到此作者把 issue 关掉了。

最终修复结论

datafuse-test 这个脚本现在支持不按规则的命名: https://github.com/datafuselabs/datafuse/pull/1684/commits/782f67205fe6907510ac24d7a3bd00877b88450c

待优化: main 函数中引入文件名校验函数,对于不符合规则的命名,直接退出,不是在执行中报错。

思考

从这个 issue 修复中可以看到两个思路:

  1. 开发人员,第一时间找到代码上的问题,并修复它
  2. 运维人员,总是试图找出正常工作的规则去适应它

更加详细的描述,可以参考:https://github.com/datafuselabs/datafuse/issues/1676

对于这个问题的修复我找 Sunndy 交流一下,是不是应该做修复。 我的观点: 保持报错,可以考虑把提示做的更友好一点。而不是报一个python内部的报错。可以换成 print 打印出来报错提示,然后就 exit ,不用 return 。Sunndy 观点:程序应该是健状的。这个程序设计上不合理。主要有两个原因:

  1. 函数返回值,不管是什么地方都应该是一样的。这种方式的函数在 rust 直接都编译不过。所以需要把先这个函数修复。
  2. 如果为了强制规则,需要在程序运行初期就增加判断。不符合规则的直接退出,而不是运行中崩掉掉了。

哈,忽然感觉运维人员的思维和开发人员,想的还是不太一样。从运维的人员思维就是遇到不能处理的,就报错停下来就行;开发人员可能追求的更加完美。你对这个问题修复是什么建议,如果有兴趣了,也可以留言中交流一下。

测试脚本 datafuse-test :https://github.com/datafuselabs/datafuse/blob/master/tests/datafuse-test 这个脚本还可以完善,如果你兴趣,可以在来帮我们完善一下。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQLBeginner 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Datafuse
  • issue 描述
  • 修复过程
  • 最终修复结论
  • 思考
相关产品与服务
云数据库 MySQL
腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档