diff options
author | James Liu <jliu@gitlab.com> | 2023-09-25 04:59:26 +0300 |
---|---|---|
committer | James Liu <jliu@gitlab.com> | 2023-09-25 07:33:14 +0300 |
commit | ee8d08fc854366458cdb884f7e94ef52d16b0f6b (patch) | |
tree | 9caef895468ba860080062a32ce3d2d593fc9d72 | |
parent | 0fed39f4d44b51ff5dfa20e6dc4a1a940a5a6b38 (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.example | 5 | ||||
-rw-r--r-- | internal/gitaly/config/config.go | 17 | ||||
-rw-r--r-- | internal/gitaly/config/config_test.go | 39 |
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] |