Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitaly.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJames Liu <jliu@gitlab.com>2023-09-25 04:59:26 +0300
committerJames Liu <jliu@gitlab.com>2023-09-25 07:33:14 +0300
commitee8d08fc854366458cdb884f7e94ef52d16b0f6b (patch)
tree9caef895468ba860080062a32ce3d2d593fc9d72
parent0fed39f4d44b51ff5dfa20e6dc4a1a940a5a6b38 (diff)
gitaly/config: Add negotiation timeouts to config
Adds a new `timeout` section to the TOML configuration file. This allows users to customise the timeout values used for the negotiation phase of the `git-upload-pack` and `git-upload-archive` operations, which may time out for larger repositories. The current default values of 10 minutes for git-upload-pack and 1 minute for git-upload-archive are preserved.
-rw-r--r--config.toml.example5
-rw-r--r--internal/gitaly/config/config.go17
-rw-r--r--internal/gitaly/config/config_test.go39
3 files changed, 61 insertions, 0 deletions
diff --git a/config.toml.example b/config.toml.example
index b0694b47d..c4def2a1a 100644
--- a/config.toml.example
+++ b/config.toml.example
@@ -130,3 +130,8 @@ self_signed_cert = false
# go_cloud_url = "gs://gitaly-backups"
# # Optional: defaults to pointer
# # layout = "pointer"
+
+# # Negotiation timeouts for remote Git operations, in minutes.
+# [timeout]
+# upload_pack = 10
+# upload_archive = 1
diff --git a/internal/gitaly/config/config.go b/internal/gitaly/config/config.go
index a938b7c0c..5f8e4999b 100644
--- a/internal/gitaly/config/config.go
+++ b/internal/gitaly/config/config.go
@@ -121,6 +121,15 @@ type Cfg struct {
PackObjectsCache StreamCacheConfig `toml:"pack_objects_cache,omitempty" json:"pack_objects_cache"`
PackObjectsLimiting PackObjectsLimiting `toml:"pack_objects_limiting,omitempty" json:"pack_objects_limiting"`
Backup BackupConfig `toml:"backup,omitempty" json:"backup"`
+ Timeout TimeoutConfig `toml:"timeout,omitempty" json:"timeout"`
+}
+
+// TimeoutConfig represents negotiation timeouts for remote Git operations
+type TimeoutConfig struct {
+ // Controls the negotiation timeout for git-upload-pack, in minutes.
+ UploadPack int `toml:"upload_pack,omitempty" json:"upload_pack,omitempty"`
+ // Controls the negotiation timeout for git-upload-archive, in minutes.
+ UploadArchive int `toml:"upload_archive,omitempty" json:"upload_archive,omitempty"`
}
// TLS configuration
@@ -706,6 +715,14 @@ func (cfg *Cfg) setDefaults() error {
cfg.Backup.Layout = "pointer"
}
+ if cfg.Timeout.UploadPack == 0 {
+ cfg.Timeout.UploadPack = 10
+ }
+
+ if cfg.Timeout.UploadArchive == 0 {
+ cfg.Timeout.UploadArchive = 1
+ }
+
return nil
}
diff --git a/internal/gitaly/config/config_test.go b/internal/gitaly/config/config_test.go
index beccede6f..1730eff0b 100644
--- a/internal/gitaly/config/config_test.go
+++ b/internal/gitaly/config/config_test.go
@@ -59,6 +59,45 @@ func TestLoadEmptyConfig(t *testing.T) {
require.Equal(t, expectedCfg, cfg)
}
+func TestTimeout(t *testing.T) {
+ tcs := []struct {
+ Name string
+ InputTOML string
+ ExpectedConfig Cfg
+ }{
+ {
+ Name: "when no custom timeouts are provided",
+ InputTOML: "",
+ ExpectedConfig: Cfg{Timeout: TimeoutConfig{
+ UploadPack: 10,
+ UploadArchive: 1,
+ }},
+ },
+ {
+ Name: "when custom timeouts are provided",
+ InputTOML: `
+[timeout]
+upload_pack = 20
+upload_archive = 5`,
+ ExpectedConfig: Cfg{Timeout: TimeoutConfig{
+ UploadPack: 20,
+ UploadArchive: 5,
+ }},
+ },
+ }
+
+ for _, tc := range tcs {
+ t.Run(tc.Name, func(t *testing.T) {
+ tmpFile := strings.NewReader(tc.InputTOML)
+ cfg, err := Load(tmpFile)
+ require.NoError(t, err)
+
+ require.NoError(t, tc.ExpectedConfig.setDefaults())
+ require.Equal(t, tc.ExpectedConfig.Timeout, cfg.Timeout)
+ })
+ }
+}
+
func TestLoadURLs(t *testing.T) {
tmpFile := strings.NewReader(`
[gitlab]