diff options
author | Patrick Steinhardt <psteinhardt@gitlab.com> | 2022-05-19 12:07:07 +0300 |
---|---|---|
committer | Patrick Steinhardt <psteinhardt@gitlab.com> | 2022-05-19 12:07:07 +0300 |
commit | 02630a2c8dbd8b00c6f3aad2f3c3adb6777b394c (patch) | |
tree | 85fc13f3cb420e5b54abea1b6da793ce8ccb0bbe | |
parent | b1e3d1fd40ac62e452daee9662dd8c1af9a66691 (diff) | |
parent | 00e44ba6dd47ba7e089468698fb0dfa643d51edb (diff) |
Merge branch 'jc-cgroups-handle-nil-repository' into 'master'
cgroups: Handle nil repo
See merge request gitlab-org/gitaly!4572
-rw-r--r-- | internal/cgroups/v1_linux.go | 10 | ||||
-rw-r--r-- | internal/cgroups/v1_linux_test.go | 47 |
2 files changed, 44 insertions, 13 deletions
diff --git a/internal/cgroups/v1_linux.go b/internal/cgroups/v1_linux.go index 49802bcb8..3e37c6205 100644 --- a/internal/cgroups/v1_linux.go +++ b/internal/cgroups/v1_linux.go @@ -103,9 +103,17 @@ func (cg *CGroupV1Manager) AddCommand( cmd *command.Command, repo repository.GitRepo, ) error { + var key string + if repo == nil { + key = strings.Join(cmd.Args(), "/") + } else { + key = repo.GetStorageName() + "/" + repo.GetRelativePath() + } + checksum := crc32.ChecksumIEEE( - []byte(repo.GetStorageName() + "/" + repo.GetRelativePath()), + []byte(key), ) + groupID := uint(checksum) % cg.cfg.Repositories.Count cgroupPath := cg.repoPath(int(groupID)) diff --git a/internal/cgroups/v1_linux_test.go b/internal/cgroups/v1_linux_test.go index 347973374..03a498a11 100644 --- a/internal/cgroups/v1_linux_test.go +++ b/internal/cgroups/v1_linux_test.go @@ -69,7 +69,7 @@ func TestAddCommand(t *testing.T) { } config := defaultCgroupsConfig() - config.Repositories.Count = 1 + config.Repositories.Count = 10 config.Repositories.MemoryBytes = 1024 config.Repositories.CPUShares = 16 @@ -90,21 +90,44 @@ func TestAddCommand(t *testing.T) { hierarchy: mock.hierarchy, } - require.NoError(t, v1Manager2.AddCommand(cmd2, repo)) + t.Run("without a repository", func(t *testing.T) { + require.NoError(t, v1Manager2.AddCommand(cmd2, nil)) - checksum := crc32.ChecksumIEEE([]byte(strings.Join([]string{"default", "path/to/repo.git"}, ""))) - groupID := uint(checksum) % config.Repositories.Count + checksum := crc32.ChecksumIEEE([]byte(strings.Join(cmd2.Args(), "/"))) + groupID := uint(checksum) % config.Repositories.Count - for _, s := range mock.subsystems { - path := filepath.Join(mock.root, string(s.Name()), "gitaly", - fmt.Sprintf("gitaly-%d", os.Getpid()), fmt.Sprintf("repos-%d", groupID), "cgroup.procs") - content := readCgroupFile(t, path) + for _, s := range mock.subsystems { + path := filepath.Join(mock.root, string(s.Name()), "gitaly", + fmt.Sprintf("gitaly-%d", os.Getpid()), fmt.Sprintf("repos-%d", groupID), "cgroup.procs") + content := readCgroupFile(t, path) - pid, err := strconv.Atoi(string(content)) - require.NoError(t, err) + pid, err := strconv.Atoi(string(content)) + require.NoError(t, err) - require.Equal(t, cmd2.Pid(), pid) - } + require.Equal(t, cmd2.Pid(), pid) + } + }) + + t.Run("with a repository", func(t *testing.T) { + require.NoError(t, v1Manager2.AddCommand(cmd2, repo)) + + checksum := crc32.ChecksumIEEE([]byte(strings.Join([]string{ + "default", + "path/to/repo.git", + }, "/"))) + groupID := uint(checksum) % config.Repositories.Count + + for _, s := range mock.subsystems { + path := filepath.Join(mock.root, string(s.Name()), "gitaly", + fmt.Sprintf("gitaly-%d", os.Getpid()), fmt.Sprintf("repos-%d", groupID), "cgroup.procs") + content := readCgroupFile(t, path) + + pid, err := strconv.Atoi(string(content)) + require.NoError(t, err) + + require.Equal(t, cmd2.Pid(), pid) + } + }) } func TestCleanup(t *testing.T) { |