diff --git a/internal/git/housekeeping/manager/optimize_repository.go b/internal/git/housekeeping/manager/optimize_repository.go index 838ad454e4e823c3b15c10e6bb73b7c34032072e..095aee543152a811aa95136b33c5a832b1c2260c 100644 --- a/internal/git/housekeeping/manager/optimize_repository.go +++ b/internal/git/housekeeping/manager/optimize_repository.go @@ -6,6 +6,7 @@ import ( "errors" "fmt" "os" + "reflect" "gitlab.com/gitlab-org/gitaly/v16/internal/git/gitcmd" "gitlab.com/gitlab-org/gitaly/v16/internal/git/housekeeping" @@ -98,7 +99,7 @@ func (m *RepositoryManager) OptimizeRepository( } func (m *RepositoryManager) maybeStartTransaction(ctx context.Context, repo *localrepo.Repo, run func(context.Context, storage.Transaction, *localrepo.Repo) error) error { - if m.node == nil { + if m.node == nil || reflect.ValueOf(m.node).IsNil() { return run(ctx, nil, repo) } diff --git a/internal/git/housekeeping/manager/optimize_repository_test.go b/internal/git/housekeeping/manager/optimize_repository_test.go index 1cd9c94246f79f68711c538d26ed83af796fd2cc..7663d04fb5e8b0841db0339a23723394942a5de4 100644 --- a/internal/git/housekeeping/manager/optimize_repository_test.go +++ b/internal/git/housekeeping/manager/optimize_repository_test.go @@ -7,6 +7,7 @@ import ( "fmt" "os" "path/filepath" + "reflect" "runtime" "sync" "testing" @@ -1089,7 +1090,7 @@ func TestOptimizeRepository(t *testing.T) { require.Equal(t, setup.expectedErr, err) expectedMetrics := setup.expectedMetrics - if node != nil && setup.expectedMetricsForTransaction != nil { + if node != nil && !reflect.ValueOf(node).IsNil() && setup.expectedMetricsForTransaction != nil { expectedMetrics = setup.expectedMetricsForTransaction } // If object pool is enabled, asserting transaction's metrics using diff --git a/internal/git/housekeeping/manager/testhelper_test.go b/internal/git/housekeeping/manager/testhelper_test.go index 74317abd784a91d60dfcf4f2881111ae13a93a51..c91448bdba596e3cd3944b4262e4a774013b73b3 100644 --- a/internal/git/housekeeping/manager/testhelper_test.go +++ b/internal/git/housekeeping/manager/testhelper_test.go @@ -122,8 +122,11 @@ func testWithAndWithoutTransaction(t *testing.T, desc string, testFunc func(*tes }) t.Run("without transaction", func(t *testing.T) { + // Make sure to pass a nil struct rather than an explicit `nil` value to the housekeeping + // manager, as this exercises our nil interface check using reflection. + var node *nodeimpl.Manager cfg := testcfg.Build(t) - testFunc(t, cfg, nil) + testFunc(t, cfg, node) }) }) }