mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-11-14 14:06:15 +01:00
daa5a23548
* Set self-adjusting deadline for connection writing In #16055 it appears that the simple 5s deadline doesn't work for large file writes. Now we can't - or at least shouldn't just set no deadline as go will happily let these connections block indefinitely. However, what seems reasonable is to set some minimum rate we expect for writing. This PR suggests the following algorithm: * Every write has a minimum timeout of 5s (adjustable at compile time.) * If there has been a previous write - then consider its previous deadline, add half of the minimum timeout + 2s per kb about to written. * If that new deadline is after the minimum timeout use that. Fix #16055 * Linearly increase timeout * Make PerWriteTimeout, PerWritePerKbTimeouts configurable Signed-off-by: Andrew Thornton <art27@cantab.net> Co-authored-by: 6543 <6543@obermui.de>
36 lines
1,002 B
Go
36 lines
1,002 B
Go
// Copyright 2019 The Gitea Authors. All rights reserved.
|
|
// Use of this source code is governed by a MIT-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package ssh
|
|
|
|
import (
|
|
"code.gitea.io/gitea/modules/graceful"
|
|
"code.gitea.io/gitea/modules/log"
|
|
"code.gitea.io/gitea/modules/setting"
|
|
|
|
"github.com/gliderlabs/ssh"
|
|
)
|
|
|
|
func listen(server *ssh.Server) {
|
|
gracefulServer := graceful.NewServer("tcp", server.Addr, "SSH")
|
|
gracefulServer.PerWriteTimeout = setting.SSH.PerWriteTimeout
|
|
gracefulServer.PerWritePerKbTimeout = setting.SSH.PerWritePerKbTimeout
|
|
|
|
err := gracefulServer.ListenAndServe(server.Serve)
|
|
if err != nil {
|
|
select {
|
|
case <-graceful.GetManager().IsShutdown():
|
|
log.Critical("Failed to start SSH server: %v", err)
|
|
default:
|
|
log.Fatal("Failed to start SSH server: %v", err)
|
|
}
|
|
}
|
|
log.Info("SSH Listener: %s Closed", server.Addr)
|
|
|
|
}
|
|
|
|
// Unused informs our cleanup routine that we will not be using a ssh port
|
|
func Unused() {
|
|
graceful.GetManager().InformCleanup()
|
|
}
|