From 7940277c5a58cc68e6a519966ca712bb1b9b3d5d Mon Sep 17 00:00:00 2001 From: Linsen Zhou Date: Sat, 6 Jun 2026 19:15:33 +0800 Subject: [PATCH] fix(web): wrap lfs basic upload i/o operations in transactions --- pkg/web/git_lfs.go | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/pkg/web/git_lfs.go b/pkg/web/git_lfs.go index 647e932ea..d5a6bc3d6 100644 --- a/pkg/web/git_lfs.go +++ b/pkg/web/git_lfs.go @@ -338,14 +338,6 @@ func serviceLfsBasicUpload(w http.ResponseWriter, r *http.Request) { } pointer := lfs.Pointer{Oid: oid} - if _, err := strg.Put(path.Join("objects", pointer.RelativePath()), r.Body); err != nil { - logger.Error("error writing object", "oid", oid, "err", err) - renderJSON(w, http.StatusInternalServerError, lfs.ErrorResponse{ - Message: "internal server error", - }) - return - } - size, err := strconv.ParseInt(r.Header.Get("Content-Length"), 10, 64) if err != nil { logger.Error("error parsing content length", "err", err) @@ -355,8 +347,17 @@ func serviceLfsBasicUpload(w http.ResponseWriter, r *http.Request) { return } - if err := datastore.CreateLFSObject(ctx, dbx, repo.ID(), oid, size); err != nil { - logger.Error("error creating object", "oid", oid, "err", err) + if err := dbx.TransactionContext(ctx, func(tx *db.Tx) error { + if err := datastore.CreateLFSObject(ctx, tx, repo.ID(), oid, size); err != nil { + logger.Error("error creating object", "oid", oid, "err", err) + return err + } + if _, err := strg.Put(path.Join("objects", pointer.RelativePath()), r.Body); err != nil { + logger.Error("error writing object", "oid", oid, "err", err) + return err + } + return nil + }); err != nil { renderJSON(w, http.StatusInternalServerError, lfs.ErrorResponse{ Message: "internal server error", })