背景说明
通过中止已取消或超过截止日期的请求来保护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:
- 强烈建议不要客户端使用更高的截止时间永久覆盖
server-side deadlines
,或者通过将截止时间始终设置为 0 来永久禁用它们。如果有必要,调用方应与 Gerrit 管理员联系,以增加服务器端截止时间或以其他方式解决性能问题。 - 客户端无法覆盖在 git push 上强制执行的接收超时。