From e91e2653488a20a9063f3c8678fd3363c0d0f7a7 Mon Sep 17 00:00:00 2001 From: Seongmin Lee Date: Mon, 19 Jan 2026 20:18:51 +0900 Subject: [PATCH] appview: move tx rollback logic out of `db.UpsertProfile()` Signed-off-by: Seongmin Lee --- appview/db/profile.go | 5 +---- appview/ingester.go | 11 ++++++++++- appview/state/profile.go | 27 +++++++++++++++++---------- 3 files changed, 28 insertions(+), 15 deletions(-) diff --git a/appview/db/profile.go b/appview/db/profile.go index d56fcae4..f981fad8 100644 --- a/appview/db/profile.go +++ b/appview/db/profile.go @@ -131,8 +131,6 @@ func monthsBetween(from, to time.Time) int { } func UpsertProfile(tx *sql.Tx, profile *models.Profile) error { - defer tx.Rollback() - // update links _, err := tx.Exec(`delete from profile_links where did = ?`, profile.Did) if err != nil { @@ -230,8 +228,7 @@ func UpsertProfile(tx *sql.Tx, profile *models.Profile) error { return err } } - - return tx.Commit() + return nil } func DeleteProfile(tx *sql.Tx, did string) error { diff --git a/appview/ingester.go b/appview/ingester.go index 69a29c4f..5a0ef070 100644 --- a/appview/ingester.go +++ b/appview/ingester.go @@ -596,6 +596,7 @@ func (i *Ingester) ingestProfile(ctx context.Context, e *jmodels.Event, l *slog. if err != nil { return fmt.Errorf("failed to start transaction: %w", err) } + defer tx.Rollback() err = db.ValidateProfile(tx, &profile) if err != nil { @@ -603,7 +604,15 @@ func (i *Ingester) ingestProfile(ctx context.Context, e *jmodels.Event, l *slog. } err = db.UpsertProfile(tx, &profile) - if err == nil && i.Cache != nil { + if err != nil { + return fmt.Errorf("upserting profile: %w", err) + } + + err = tx.Commit() + if err != nil { + return fmt.Errorf("tx.Commit: %w", err) + } + if i.Cache != nil { pipe := i.Cache.Pipeline() didKey := fmt.Sprintf(cache.PreferredHandleByDid, did) if preferredHandle != "" { diff --git a/appview/state/profile.go b/appview/state/profile.go index 270197a3..a511d6e0 100644 --- a/appview/state/profile.go +++ b/appview/state/profile.go @@ -884,6 +884,20 @@ func (s *State) UpdateProfilePins(w http.ResponseWriter, r *http.Request) { func (s *State) updateProfile(profile *models.Profile, w http.ResponseWriter, r *http.Request) { l := s.logger.With("handler", "updateProfile") user := s.oauth.GetMultiAccountUser(r) + tx, err := s.db.BeginTx(r.Context(), nil) + if err != nil { + l.Error("failed to start transaction", "err", err) + s.pages.Notice(w, "update-profile", "Failed to update profile, try again later.") + return + } + defer tx.Rollback() + + err = db.UpsertProfile(tx, profile) + if err != nil { + l.Error("failed to update profile", "err", err) + s.pages.Notice(w, "update-profile", "Failed to update profile, try again later.") + return + } client, err := s.oauth.AuthorizedClient(r) if err != nil { @@ -938,17 +952,10 @@ func (s *State) updateProfile(profile *models.Profile, w http.ResponseWriter, r return } - tx, err := s.db.BeginTx(r.Context(), nil) - if err != nil { - l.Error("failed to start transaction", "err", err) - s.pages.Notice(w, "update-profile", "Failed to update profile, try again later.") - return - } - - if err := db.UpsertProfile(tx, profile); err != nil { + if err := tx.Commit(); err != nil { + // db failed, but PDS operation succeed. + // log error and continue l.Error("failed to update profile in DB", "err", err) - s.pages.Notice(w, "update-profile", "Failed to update profile, try again later.") - return } if s.rdb != nil { -- 2.51.2