diff options
author | 2023-08-04 12:28:33 +0100 | |
---|---|---|
committer | 2023-08-04 12:28:33 +0100 | |
commit | 9a291dea843448f78b4b98ea6813739aebe708c6 (patch) | |
tree | f1ce643a3c9fe1b13e4c107f15b1ac4b20fe5b86 /internal/processing/fromcommon.go | |
parent | [feature] simpler cache size configuration (#2051) (diff) | |
download | gotosocial-9a291dea843448f78b4b98ea6813739aebe708c6.tar.xz |
[performance] add caching of status fave, boost of, in reply to ID lists (#2060)
Diffstat (limited to 'internal/processing/fromcommon.go')
-rw-r--r-- | internal/processing/fromcommon.go | 47 |
1 files changed, 30 insertions, 17 deletions
diff --git a/internal/processing/fromcommon.go b/internal/processing/fromcommon.go index 030ff506c..07895b6ba 100644 --- a/internal/processing/fromcommon.go +++ b/internal/processing/fromcommon.go @@ -380,6 +380,8 @@ func (p *Processor) notify( // wipeStatus contains common logic used to totally delete a status // + all its attachments, notifications, boosts, and timeline entries. func (p *Processor) wipeStatus(ctx context.Context, statusToDelete *gtsmodel.Status, deleteAttachments bool) error { + var errs gtserror.MultiError + // either delete all attachments for this status, or simply // unattach all attachments for this status, so they'll be // cleaned later by a separate process; reason to unattach rather @@ -389,14 +391,14 @@ func (p *Processor) wipeStatus(ctx context.Context, statusToDelete *gtsmodel.Sta // todo: p.state.DB.DeleteAttachmentsForStatus for _, a := range statusToDelete.AttachmentIDs { if err := p.media.Delete(ctx, a); err != nil { - return err + errs.Appendf("error deleting media: %w", err) } } } else { // todo: p.state.DB.UnattachAttachmentsForStatus for _, a := range statusToDelete.AttachmentIDs { if _, err := p.media.Unattach(ctx, statusToDelete.Account, a); err != nil { - return err + errs.Appendf("error unattaching media: %w", err) } } } @@ -405,44 +407,55 @@ func (p *Processor) wipeStatus(ctx context.Context, statusToDelete *gtsmodel.Sta // todo: p.state.DB.DeleteMentionsForStatus for _, id := range statusToDelete.MentionIDs { if err := p.state.DB.DeleteMentionByID(ctx, id); err != nil { - return err + errs.Appendf("error deleting status mention: %w", err) } } // delete all notification entries generated by this status if err := p.state.DB.DeleteNotificationsForStatus(ctx, statusToDelete.ID); err != nil { - return err + errs.Appendf("error deleting status notifications: %w", err) } // delete all bookmarks that point to this status if err := p.state.DB.DeleteStatusBookmarksForStatus(ctx, statusToDelete.ID); err != nil { - return err + errs.Appendf("error deleting status bookmarks: %w", err) } // delete all faves of this status if err := p.state.DB.DeleteStatusFavesForStatus(ctx, statusToDelete.ID); err != nil { - return err + errs.Appendf("error deleting status faves: %w", err) } // delete all boosts for this status + remove them from timelines - if boosts, err := p.state.DB.GetStatusReblogs(ctx, statusToDelete); err == nil { - for _, b := range boosts { - if err := p.deleteStatusFromTimelines(ctx, b.ID); err != nil { - return err - } - if err := p.state.DB.DeleteStatusByID(ctx, b.ID); err != nil { - return err - } + boosts, err := p.state.DB.GetStatusBoosts( + // we MUST set a barebones context here, + // as depending on where it came from the + // original BoostOf may already be gone. + gtscontext.SetBarebones(ctx), + statusToDelete.ID) + if err != nil { + errs.Appendf("error fetching status boosts: %w", err) + } + for _, b := range boosts { + if err := p.deleteStatusFromTimelines(ctx, b.ID); err != nil { + errs.Appendf("error deleting boost from timelines: %w", err) + } + if err := p.state.DB.DeleteStatusByID(ctx, b.ID); err != nil { + errs.Appendf("error deleting boost: %w", err) } } // delete this status from any and all timelines if err := p.deleteStatusFromTimelines(ctx, statusToDelete.ID); err != nil { - return err + errs.Appendf("error deleting status from timelines: %w", err) + } + + // finally, delete the status itself + if err := p.state.DB.DeleteStatusByID(ctx, statusToDelete.ID); err != nil { + errs.Appendf("error deleting status: %w", err) } - // delete the status itself - return p.state.DB.DeleteStatusByID(ctx, statusToDelete.ID) + return errs.Combine() } // deleteStatusFromTimelines completely removes the given status from all timelines. |