Skip to content
This repository was archived by the owner on Sep 30, 2024. It is now read-only.

Commit 1e2545b

Browse files
authored
[Backport 5.2] Embeddings: fail job immediately if rate limited exceeded (#58939)
Embeddings: fail job immediately if rate limited exceeded (#58869) Usually, during an embeddings job we allow 10% of embedding requests to fail, simply skipping over failed chunks. If a customer has hit their rate limits, this means we might continually send a huge number of embedding requests that we know will immediately fail. With this change, we immediately fail a job if the rate limit is exceeded. It also increases the amount of time between attempting to run a job to 15 minutes. This won't make a big difference to user experience, since by default embeddings jobs aren't allowed to be scheduled within 24h of the last run. But it helps prevent jobs from continuously being scheduled then failing. This change is unlikely to have a user-facing impact, but just helps cut down on noise in logs and excessive requests to Cody Gateway.
1 parent fb0a625 commit 1e2545b

File tree

3 files changed

+40
-19
lines changed

3 files changed

+40
-19
lines changed

enterprise/cmd/worker/internal/embeddings/repo/scheduler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,6 @@ func newRepoEmbeddingScheduler(
8383
enqueueActive,
8484
goroutine.WithName("repoEmbeddingSchedulerJob"),
8585
goroutine.WithDescription("resolves embedding policies and schedules jobs to embed repos"),
86-
goroutine.WithInterval(5*time.Minute),
86+
goroutine.WithInterval(15*time.Minute),
8787
)
8888
}

internal/embeddings/embed/embed.go

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -259,22 +259,25 @@ func embedFiles(
259259
}
260260

261261
batchEmbeddings, err := embeddingsClient.GetDocumentEmbeddings(ctx, batchChunks)
262-
if err != nil && !excludeChunksOnError {
263-
return nil, errors.Wrap(err, "error while getting embeddings")
264-
} else if err != nil {
265-
// To avoid failing large jobs on a flaky API, just mark all files
266-
// as failed and continue. This means we may have some missing
267-
// files, but they will be logged as such below and some embeddings
268-
// are better than no embeddings.
269-
logger.Warn("error while getting embeddings", log.Error(err))
270-
failed := make([]int, len(batchChunks))
271-
for i := 0; i < len(batchChunks); i++ {
272-
failed[i] = i
273-
}
274-
batchEmbeddings = &client.EmbeddingsResults{
275-
Embeddings: make([]float32, len(batchChunks)*dimensions),
276-
Failed: failed,
277-
Dimensions: dimensions,
262+
if err != nil {
263+
if !excludeChunksOnError || errors.Is(err, &client.RateLimitExceededError{}) {
264+
// Fail immediately if we hit a rate limit, so we don't continually retry and fail on every chunk.
265+
return nil, errors.Wrap(err, "error while getting embeddings")
266+
} else {
267+
// To avoid failing large jobs on a flaky API, just mark all files
268+
// as failed and continue. This means we may have some missing
269+
// files, but they will be logged as such below and some embeddings
270+
// are better than no embeddings.
271+
logger.Warn("error while getting embeddings", log.Error(err))
272+
failed := make([]int, len(batchChunks))
273+
for i := 0; i < len(batchChunks); i++ {
274+
failed[i] = i
275+
}
276+
batchEmbeddings = &client.EmbeddingsResults{
277+
Embeddings: make([]float32, len(batchChunks)*dimensions),
278+
Failed: failed,
279+
Dimensions: dimensions,
280+
}
278281
}
279282
}
280283

internal/embeddings/embed/embed_test.go

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"context"
55
"strings"
66
"testing"
7+
"time"
78

89
"github.com/sourcegraph/log"
910
"github.com/stretchr/testify/require"
@@ -475,6 +476,7 @@ func TestEmbedRepo_ExcludeChunkOnError(t *testing.T) {
475476
partialFailureClient := &flakyEmbeddingsClient{
476477
EmbeddingsClient: embeddingsClient,
477478
remainingFailures: 1,
479+
err: errors.New("FAIL"),
478480
}
479481
_, _, stats, err := EmbedRepo(ctx, partialFailureClient, inserter, contextService, rl, repoIDName, mockRepoPathRanks, opts, logger, noopReport)
480482
require.NoError(t, err)
@@ -489,6 +491,21 @@ func TestEmbedRepo_ExcludeChunkOnError(t *testing.T) {
489491
partialFailureClient := &flakyEmbeddingsClient{
490492
EmbeddingsClient: embeddingsClient,
491493
remainingFailures: 100,
494+
err: errors.New("FAIL"),
495+
}
496+
_, _, _, err := EmbedRepo(ctx, partialFailureClient, inserter, contextService, rl, repoIDName, mockRepoPathRanks, opts, logger, noopReport)
497+
require.Error(t, err)
498+
})
499+
500+
t.Run("immediately fail if rate limit hit", func(t *testing.T) {
501+
rl := newReadLister("a.go", "b.md", "c.java", "big.java")
502+
opts := opts
503+
opts.TolerableFailureRatio = 0.1
504+
505+
partialFailureClient := &flakyEmbeddingsClient{
506+
EmbeddingsClient: embeddingsClient,
507+
remainingFailures: 1,
508+
err: client.NewRateLimitExceededError(time.Now().Add(time.Minute)),
492509
}
493510
_, _, _, err := EmbedRepo(ctx, partialFailureClient, inserter, contextService, rl, repoIDName, mockRepoPathRanks, opts, logger, noopReport)
494511
require.Error(t, err)
@@ -703,20 +720,21 @@ func (c *mockEmbeddingsClient) GetDocumentEmbeddings(_ context.Context, texts []
703720
type flakyEmbeddingsClient struct {
704721
client.EmbeddingsClient
705722
remainingFailures int
723+
err error
706724
}
707725

708726
func (c *flakyEmbeddingsClient) GetQueryEmbedding(ctx context.Context, query string) (*client.EmbeddingsResults, error) {
709727
if c.remainingFailures > 0 {
710728
c.remainingFailures -= 1
711-
return nil, errors.New("FAIL")
729+
return nil, c.err
712730
}
713731
return c.EmbeddingsClient.GetQueryEmbedding(ctx, query)
714732
}
715733

716734
func (c *flakyEmbeddingsClient) GetDocumentEmbeddings(ctx context.Context, documents []string) (*client.EmbeddingsResults, error) {
717735
if c.remainingFailures > 0 {
718736
c.remainingFailures -= 1
719-
return nil, errors.New("FAIL")
737+
return nil, c.err
720738
}
721739
return c.EmbeddingsClient.GetDocumentEmbeddings(ctx, documents)
722740
}

0 commit comments

Comments
 (0)