Skip to content

Commit fa46480

Browse files
committed
perf(api): async asset ref increment via goroutine in StoreMessage
Replace synchronous BatchIncrementAssetRefs with a fire-and-forget goroutine using context.Background() + 30s timeout, keeping the API server fully stateless with no background workers.
1 parent 34afe93 commit fa46480

4 files changed

Lines changed: 17 additions & 4 deletions

File tree

.github/workflows/e2e-test.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,9 @@ jobs:
4747
run: |
4848
cd src/server
4949
docker compose -f docker-compose.test.yml logs
50+
51+
- name: Teardown
52+
if: always()
53+
run: |
54+
cd src/server
55+
docker compose -f docker-compose.test.yml down --timeout 10

src/server/api/go/cmd/server/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,5 +139,6 @@ func main() {
139139
if err := srv.Shutdown(ctx); err != nil {
140140
log.Sugar().Errorw("server shutdown", "err", err)
141141
}
142+
142143
log.Sugar().Info("server exited")
143144
}

src/server/api/go/internal/bootstrap/container.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,7 @@ func BuildContainer() *do.Injector {
215215
do.MustInvoke[*blob.S3Deps](i),
216216
), nil
217217
})
218+
218219
do.Provide(inj, func(i *do.Injector) (repo.SessionRepo, error) {
219220
return repo.NewSessionRepo(
220221
do.MustInvoke[*gorm.DB](i),

src/server/api/go/internal/modules/service/session.go

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,10 +342,15 @@ func (s *sessionService) StoreMessage(ctx context.Context, in StoreMessageInput)
342342

343343
uploadedAssets = append(uploadedAssets, *asset)
344344

345-
// Batch increment all asset references in a single DB round-trip
346-
if err := s.assetReferenceRepo.BatchIncrementAssetRefs(ctx, in.ProjectID, uploadedAssets); err != nil {
347-
return nil, fmt.Errorf("batch increment asset references: %w", err)
348-
}
345+
// Increment asset reference counts asynchronously to avoid blocking the response.
346+
go func() {
347+
bgCtx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
348+
defer cancel()
349+
if err := s.assetReferenceRepo.BatchIncrementAssetRefs(bgCtx, in.ProjectID, uploadedAssets); err != nil {
350+
s.log.Error("async batch increment asset refs failed",
351+
zap.String("project_id", in.ProjectID.String()), zap.Error(err))
352+
}
353+
}()
349354

350355
// Cache parts data in Redis after successful S3 upload
351356
if s.redis != nil {

0 commit comments

Comments
 (0)