后端Bug汇总
邓新宇:
- 位置: Buaa.AIBot.Repository.Implement.QuestionRepository.UpdateQuestionAsync
- 级别: 一般情况下, 导致陷入死循环.
- 描述: 更新问题信息时, 会导致系统陷入死循环.
- 原因: 这是由于这一部分是拷贝InsertQuestionAsync的实现然后进行修改的, 而后者创建了QuestionData对象后, 需要将其插入数据库, 但前者是不需要, 由于插入的重试机制, 将无限重试, 陷入死循环.
- 解决情况: 顺利解决. 同时引入了重试的超时机制, 确保类似的问题不会陷入死循环.
- 位置: Buaa.AIBot.Repository.Implement.QuestionRepository.UpdateQuestionAsync
- 级别: 特殊情况下, 后端报错.
- 描述: 当不更新问题的标签时, 将抛出空引用异常.
- 原因: QuestionRepository通过Buaa.AIBot.Repository.Implement.QuestionRepository.TagMatcher进行标签匹配, TagMatcher在创建时需要通过传入的Tags列表初始化一个HashSet, 而当不更新Tags时, Tags列表为null, 此时将会报错.
- 解决情况: 顺利解决.
- 位置: Buaa.AIBot.Repository.Implement.QuestionRepository.UpdateQuestionAsync
- 级别: 特殊情况下, 发生一致性错误, 导致语义错误.
- 描述: 当更新问题信息中的最佳回答信息时, 若该回答并不属于该问题时仍能够成功, 此时一个问题的最佳回答并不属于该问题, 语义错误.
- 原因: 更新时仅检查了回答是否存在, 没有检查该回答所属问题是不是本回答.
- 解决情况: 顺利解决.
- 位置: Buaa.AIBot.Repository.Implement.QuestionRepository.UpdateQuestionAsync
- 级别: 高并发的特殊情况下, 发生数据丢失错误.
- 描述: 当更新问题信息的标签信息时, 若在更新
标签-问题
表时, 标签
表删除了某个被选中的标签时, 将会导致整个问题被删除.
- 原因: 上述情况发生时, 应当视为操作失败, 应当撤销之前的更改, 但是由于实现的错误, 导致问题被删除, 这是由于这一部分是拷贝InsertQuestionAsync的实现然后进行修改的, 后者的
撤销
自然就是删除.
- 解决情况: 经过分析, 虽然本函数需要更改
问题
表和标签-问题
表两个表, 但是并不像InsertQuestionAsync那样需要先插入问题
表以获得问题的qid, 而不得不分两步完成, UpdateQuestionAsync只需要一次数据库数据的提交即可完成. 最后顺利修复.
- 位置: Buaa.AIBot.Repository.Implement.UserRepository.InsertUserAsync
- 级别: 代码编写错误的特殊情况下, 错误调用本方法未能报告错误.
- 描述: 当调用方未初始化UserInfo.Auth时未能报告错误.
- 原因: 接口设计时, 为每个引用类型设置了null检查, 但是Auth对应的时枚举类, 故遗漏了检查.
- 解决情况: 添加了对当Auth为AuthLevel.None时的报错, 同时更新了Buaa.AIBot.Repository.IUserRepository.InsertUserAsync中的描述. 顺利解决.
- 位置: Buaa.AIBot.Repository.Implement.AnswerRepository.InsertAnswerAsync
- 级别: 特殊情况下, 发生一致性错误, 导致语义错误.
- 描述: 创建新的回答时, 未检查创建者CreaterId的合法性, 导致CreaterId未对应任何用户时, 仍能够插入成功.
- 原因: 由于数据模型设计时, 为了实现
用户删除后其回答不会被
的功能, 未添加对CreaterId的强制约束, 但是语义上, 创建问题时应当保证用户存在.
- 解决情况: 添加了对当CreaterId为null时的报错, 同时更新了Buaa.AIBot.Repository.IAnswerRepository.InsertAnswerAsync中的描述. 顺利解决.
- 位置: Buaa.AIBot.Services.QuestionService.ModifyAnswerAsync
- 级别: 一般情况下, 后端报错.
- 描述: 调用该方法时, 即使待修改的回答时存在的, 仍旧会报错回答不存在.
- 原因: 调用Buaa.AIBot.Repository.Implement.AnswerRepository.UpdateAnswerAsync方法时, 少传了AnswerInfo.AnswerId参数.
- 解决情况: 顺利解决.
- 位置: Buaa.AIBot.Repository.Implement.QuestionRepository.SelectQuestionsByTagsAsync
- 级别: 一般情况下, 后端报错.
- 描述: 无论如何, 总会报错. 导致/api/questions/questionlist总是报错.
- 原因:
EF Core
对LINQ中GroupBy和Where支持有限, 导致原代码构建的表达式树无法转换为SQL语句, 从而导致了报错. 改为直接通过RawSql语句进行查询后, 由于开发环境为Windows, 生产/测试环境为Linux, 前者MySQL表名不区分大小写, 而后者区分, 导致过无法正确运行, 目前已解决该问题.
- 解决情况: 目前可以工作, 但是实现较为低下, 已有一定方案进行优化, 但是尚未进行.
- 位置:
- Buaa.AIBot.Repository.Implement.QuestionRepository.SelectAnswersForQuestionByIdAsync
- Buaa.AIBot.Repository.Implement.QuestionRepository.SelectTagsForQuestionByIdAsync
- Buaa.AIBot.Repository.Implement.UserRepository.SelectAnswersIdByIdAsync
- Buaa.AIBot.Repository.Implement.UserRepository.SelectAnswersIdByIdByModifyTimeAsync
- Buaa.AIBot.Repository.Implement.UserRepository.SelectQuestionsIdByIdAsync
- Buaa.AIBot.Repository.Implement.UserRepository.SelectQuestionsIdByIdOrderByModifyTimeAsync
- 级别: 导致功能缺失.
- 描述: 无论是否创建了问题和回答, 是否为问题添加了相关标签, 都会导致通过用户搜索用户问答的问题和提出的问题, 以及通过问题搜索对应的回答和标签时, 将永远返回空列表. 导致以下接口无法正常工作(永远返回空列表, 或其中某部分为空列表):
- /api/user/questions
- /api/user/answers
- /api/questions/question
- 原因: 错误地理解了
EF Core
对于一对多关系的加载策略, 误认为该关系是自动而主动由数据库加载到内存的, 事实上需要特定操作进行加载.
- 解决情况: 顺利解决.
- 位置: Buaa.AIBot.Services.NLPService.PostResultAsync
- 级别:高并发情况下,后端报错.
- 描述: 当并发量较高时,向NLP微服务发送请求时可能出现意外的连接断开情况,即使本模块与NLP微服务部署在同一服务器。
- 原因: 未知。
- 解决情况: 加锁后情况有所改善,但是仍旧无法解决,加锁并Sleep后可以在高并发下正常运行。
李明昕:
- 位置:
Buaa.AIBot.Controllers.UserController.GetInternalInfoAsync
- 级别:比较严重,导致API无法正常响应。
- 描述:在请求用户内部信息的时候总是返回404NotFound。
- 原因:在判断是否存在该用户时逻辑写反了。
- 解决情况:修复了判断逻辑,现在能正常判断用户是否存在并获取其内部信息。
- 位置:
Buaa.AiBot.Controllers.UserController.FreshAsync
- 级别:比较严重,导致无法更新令牌。
- 描述:在JWT令牌未过期时请求更新令牌失败。
- 原因:从请求中获取令牌的位置出现了错误,主要涉及到两个方法
- UserService.FreshTokenAsync
- UserService.GetExpirationFromToken
这两个方法都错误地从请求参数中获取JWT令牌,使得令牌获取失败,进而导致无法更新令牌。
- 解决情况:修复了令牌获取方式,现在令牌可以正确地从请求体中得到。
- 位置:
Buaa.AIBot.Controllers.QuestionsController.AddAnswerAsync
- 级别:一般严重,使得后端在一定情况下会产生错误。
- 描述:如果一个问题不存在的时候回答该问题会产生错误。
- 原因:调用Buaa.AIbot.Services.IQuestionService.AddAnswerAsync是未接住其抛出的QuestionNotExistException。
- 解决情况:成功解决,正确接住了并处理了其抛出的异常。
- 位置:
Buaa.AIBot.Controllers.UserController.SignUpAsync
- 级别:不太严重,主要影响前端人员测试
- 描述:无法创建管理员用户
- 原因:在控制层实现signup api时,没有考虑到增加管理员用户的需求。
- 解决情况:在signup逻辑中增加了添加管理员账户逻辑。
- 位置:
Buaa.AIBot.Repository.BaiduCrawlerRepository.onCompleted
- 级别:不太严重,主要影响的时处理效率。
- 描述:在使用正则表达式处理爬取的数据时效率较低。
- 原因:错误地在一个循环中进行了多余的正则替换
- 解决情况:将正则替换移到循环外,提高了处理效率。
- 位置:
SentenceEmbedding/EmbeddingModel
- 级别:比较严重,可能会导致程序奔溃。
- 描述:高并发条件下添加问题可能会出发错误。
- 原因:transfomers 的的编码器似乎不能适应高并发环境。
- 解决情况:通过对模型加锁,已经在很大程度上改善了该问题。
- 位置:
SentenceEmbedding/EmbeddingModel
- 级别:一般严重,对程序主题运行没有造成太大影响。
- 描述:在删除问题的情况下,可能会出现删除不干净的情况。
- 原因:由于一个问题可能在多个标签下,没有处理好导致没有删除干净。
- 解决情况:通过修改逻辑已经修复了这个bug。
posted @
2021-05-12 02:49
DQSJ
阅读(
136)
评论()
编辑
收藏
举报