diff --git a/internal/governor/conn.go b/internal/governor/conn.go index 864cff6..fd00f13 100644 --- a/internal/governor/conn.go +++ b/internal/governor/conn.go @@ -211,6 +211,10 @@ func readSockstat(environ []string) updateData { res.GroupLeader = sockstat.GetBool(parts[1]) case "is_importing": res.IsImporting = sockstat.BoolValue(parts[1]) + case "import_skip_push_limit": + res.ImportSkipPushLimit = sockstat.BoolValue(parts[1]) + case "import_soft_throttling": + res.ImportSoftThrottling = sockstat.BoolValue(parts[1]) } } diff --git a/internal/governor/governor.go b/internal/governor/governor.go index 5354b87..7c3db1d 100644 --- a/internal/governor/governor.go +++ b/internal/governor/governor.go @@ -76,6 +76,12 @@ type updateData struct { CommandID string `json:"command_id,omitempty"` // IsImporting is true if the command is an import. IsImporting bool `json:"is_importing,omitempty"` + // ImportSkipPushLimit is true if the command is an import and + // we want to skip the push limit for a command. + ImportSkipPushLimit bool `json:"import_skip_push_limit,omitempty"` + // ImportSoftThrottling is true if the command is an import and + // we want to apply it some soft throttling policies. + ImportSoftThrottling bool `json:"import_soft_throttling,omitempty"` } func update(w io.Writer, ud updateData) error { diff --git a/internal/integration/integration_test.go b/internal/integration/integration_test.go index e8024f0..0f53156 100644 --- a/internal/integration/integration_test.go +++ b/internal/integration/integration_test.go @@ -211,6 +211,40 @@ func (suite *SpokesReceivePackTestSuite) TestBadDateAllowedWithOverride() { assert.Contains(suite.T(), string(out), " badDate:", "should still complain about a bad date") } +func (suite *SpokesReceivePackTestSuite) TestSpokesReceivePackAllowedWhenWithIsImportingSockStat() { + assert.NoError(suite.T(), chdir(suite.T(), suite.remoteRepo), "unable to chdir into our remote Git repo") + // Set a really low value to receive.maxsize in order to make it fail + require.NoError(suite.T(), exec.Command("git", "config", "receive.maxsize", "1").Run()) + + assert.NoError(suite.T(), chdir(suite.T(), suite.localRepo), "unable to chdir into our local Git repo") + cmd := exec.Command("git", "push", "--all", "--receive-pack=spokes-receive-pack-wrapper", "r") + cmd.Env = append(os.Environ(), + "GIT_SOCKSTAT_VAR_is_importing=bool:true", + ) + err := cmd.Run() + assert.NoError( + suite.T(), + err, + "unexpected failure with the custom spokes-receive-pack program; it should have succeeded") +} + +func (suite *SpokesReceivePackTestSuite) TestSpokesReceivePackAllowedWhenWithImportSkipPushLimitSockStat() { + assert.NoError(suite.T(), chdir(suite.T(), suite.remoteRepo), "unable to chdir into our remote Git repo") + // Set a really low value to receive.maxsize in order to make it fail + require.NoError(suite.T(), exec.Command("git", "config", "receive.maxsize", "1").Run()) + + assert.NoError(suite.T(), chdir(suite.T(), suite.localRepo), "unable to chdir into our local Git repo") + cmd := exec.Command("git", "push", "--all", "--receive-pack=spokes-receive-pack-wrapper", "r") + cmd.Env = append(os.Environ(), + "GIT_SOCKSTAT_VAR_import_skip_push_limit=bool:true", + ) + err := cmd.Run() + assert.NoError( + suite.T(), + err, + "unexpected failure with the custom spokes-receive-pack program; it should have succeeded") +} + func (suite *SpokesReceivePackTestSuite) TestWithGovernor() { started := make(chan any) govSock, msgs, cleanup := startFakeGovernor(suite.T(), started, nil) diff --git a/internal/spokes/spokes.go b/internal/spokes/spokes.go index e4254f2..e651256 100644 --- a/internal/spokes/spokes.go +++ b/internal/spokes/spokes.go @@ -955,7 +955,11 @@ func (r *spokesReceivePack) isFsckConfigEnabled() bool { } func (r *spokesReceivePack) getMaxInputSize() (int, error) { - if isImporting() { + // We want to skip the default push limit when the `import_skip_push_limit` + // stat is set only. + // We keep using the `is_import` here for backward compatibility only, + // which should be removed on a subsequent PR. + if isImporting() || skipPushLimit() { return 80 * 1024 * 1024 * 1024, nil /* 80 GB */ } @@ -1234,6 +1238,10 @@ func isImporting() bool { return sockstat.GetBool("is_importing") } +func skipPushLimit() bool { + return sockstat.GetBool("import_skip_push_limit") +} + func allowBadDate() bool { return isImporting() && sockstat.GetBool("allow_baddate_in_import") }