Skip to content

Commit 7ff09db

Browse files
Fix-Using Roundrobin tokens across multiple calls (#284)
The GitHub tokens are picked from a list for each call using Roundrobin approach.
1 parent 8333f1e commit 7ff09db

File tree

2 files changed

+27
-21
lines changed

2 files changed

+27
-21
lines changed

pkg/scorecard.go

Lines changed: 17 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -81,30 +81,29 @@ func (r *RepoURL) Set(s string) error {
8181

8282
func RunScorecards(ctx context.Context, logger *zap.SugaredLogger,
8383
repo RepoURL, checksToRun []checker.NamedCheck) <-chan Result {
84-
// Use our custom roundtripper
85-
rt := roundtripper.NewTransport(ctx, logger)
86-
87-
client := &http.Client{
88-
Transport: rt,
89-
}
90-
ghClient := github.NewClient(client)
91-
graphClient := githubv4.NewClient(client)
92-
93-
c := checker.Checker{
94-
Ctx: ctx,
95-
Client: ghClient,
96-
HttpClient: client,
97-
Owner: repo.Owner,
98-
Repo: repo.Repo,
99-
GraphClient: graphClient,
100-
}
101-
10284
resultsCh := make(chan Result)
10385
wg := sync.WaitGroup{}
10486
for _, check := range checksToRun {
10587
check := check
10688
wg.Add(1)
10789
go func() {
90+
// Use our custom roundtripper
91+
rt := roundtripper.NewTransport(ctx, logger)
92+
93+
client := &http.Client{
94+
Transport: rt,
95+
}
96+
ghClient := github.NewClient(client)
97+
graphClient := githubv4.NewClient(client)
98+
99+
c := checker.Checker{
100+
Ctx: ctx,
101+
Client: ghClient,
102+
HttpClient: client,
103+
Owner: repo.Owner,
104+
Repo: repo.Repo,
105+
GraphClient: graphClient,
106+
}
108107
defer wg.Done()
109108
runner := checker.Runner{Checker: c}
110109
r := runner.Run(check.Fn)

roundtripper/roundtripper.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,20 +44,25 @@ const (
4444
BucketURL = "BLOB_URL"
4545
)
4646

47+
var counter int64
48+
4749
// RateLimitRoundTripper is a rate-limit aware http.Transport for Github.
4850
type RateLimitRoundTripper struct {
4951
Logger *zap.SugaredLogger
5052
InnerTransport http.RoundTripper
5153
}
5254

5355
type RoundRobinTokenSource struct {
54-
counter int64
5556
AccessTokens []string
57+
log *zap.SugaredLogger
5658
}
5759

5860
func (r *RoundRobinTokenSource) Token() (*oauth2.Token, error) {
59-
c := atomic.AddInt64(&r.counter, 1)
60-
index := c % int64(len(r.AccessTokens))
61+
c := atomic.AddInt64(&counter, 1)
62+
// not locking it because it is never modified
63+
l := len(r.AccessTokens)
64+
index := c % int64(l)
65+
r.log.Infof("using token %d of total %d.", index, l)
6166
return &oauth2.Token{
6267
AccessToken: r.AccessTokens[index],
6368
}, nil
@@ -70,6 +75,7 @@ func NewTransport(ctx context.Context, logger *zap.SugaredLogger) http.RoundTrip
7075
if token := os.Getenv(GithubAuthToken); token != "" {
7176
ts := &RoundRobinTokenSource{
7277
AccessTokens: strings.Split(token, ","),
78+
log: logger,
7379
}
7480
transport = oauth2.NewClient(ctx, ts).Transport
7581
} else if keyPath := os.Getenv(GithubAppKeyPath); keyPath != "" { // Also try a GITHUB_APP
@@ -171,5 +177,6 @@ func (gh *RateLimitRoundTripper) RoundTrip(r *http.Request) (*http.Response, err
171177
gh.Logger.Warnf("Rate limit exceeded. Retrying...")
172178
return gh.RoundTrip(r)
173179
}
180+
174181
return resp, nil
175182
}

0 commit comments

Comments
 (0)