Gerrit:请求的撤销和截至期限

MuYusen 于 2023-10-26 发布 本文总阅读量

背景说明

通过中止已取消或超过截止日期的请求来保护Gerrit服务。如果这些请求没有被中止,那么这些请求会积累起来,从而耗尽服务器资源(eg:线程)。

请求取消

如果用户通过断开连接来取消请求,理想情况下Gerrit应该检测到这一点并中止请求,以避免做不必要的工作。如果没有人在等待响应,Gerrit就不应该花费资源来计算它。

对于客户端使用的协议,检测到请求被取消并不是容易的事。目前,Gerrit只能检测到git推送的请求被取消,而检测不到其他请求类型(特别是被取消的请求,不能是通过HTTP、SSH命令和git clone/petch进行的REST 调用请求)。

server-side deadlines

为了限制请求的最长执行时间,管理员可以配置 server-side deadlines。如果匹配的请求超过了 server-side deadline,则该请求将自动中止。在这种情况下,客户端会收到一条正确的错误消息,告知用户超过了 deadline。

客户端可以通过在请求上设置 deadline 来重写 server-side deadlines

server-side deadlines 旨在保护Gerrit 服务不因特定请求的性能问题而耗尽资源。例如,一个 REST请求非常慢,如果越来越多的这样的请求被阻塞而不被取消,那么Gerrit服务可能会耗尽线程,从而导致整个Gerrit的服务中断。

在某些情况下,server-side deadlines可能会带来更好的用户体验,因为与其让用户无限期等待,不如告诉用户存在性能问题,从而阻止请求的执行。

最后,server-side deadlines可以帮助工程师更可靠、更快速地检测性能问题。

接收超时

对于 git push 操作,可以配置硬超时(etc/gerrit.config:receive.timeout)。与 server-side deadlines 相比,这个超时不能被客户端提供的deadline所重写。

客户端提供的deadlines

客户端可以设置请求的 deadline,以限制他们愿意等待响应的最长执行时间。如果请求没有在 deadline 内完成,则请求将中止,客户端将收到一个错误,并显示一条消息,告诉他们已经超过了截止日期。

根据不同的请求类型,设置deadline:

请求类型 设置方法 举例
REST over HTTP Set the X-Gerrit-Deadline header. GET /changes/myProject~master~I8473b95934b5732ac55d26311a706c9c2bde9940/suggest_reviewers?q=J X-Gerrit-Deadline: 5m
SSH command Set the deadline option. ssh -p 29418 review.example.com gerrit create-project –deadline 5m foo/bar
git push Set the deadline push option. git push -o deadline=10m ssh://john.doe@git.example.com:29418/kernel/common HEAD:refs/for/master
git clone/fetch Not supported. -

重写server-side deadline

通过设置请求的 deadline ,可以覆盖任何server-side deadline,例如为了增加deadline。将 deadline 设置为0将禁用任何 server-side deadline 。如果一个请求之前因超期失败过,他允许客户端解除阻止。

PS: