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 | |
| 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')
| -rw-r--r-- | internal/processing/account/delete.go | 2 | ||||
| -rw-r--r-- | internal/processing/fromcommon.go | 47 | ||||
| -rw-r--r-- | internal/processing/status/boost.go | 47 | ||||
| -rw-r--r-- | internal/processing/status/fave.go | 2 | 
4 files changed, 44 insertions, 54 deletions
diff --git a/internal/processing/account/delete.go b/internal/processing/account/delete.go index a613ba485..dd5957531 100644 --- a/internal/processing/account/delete.go +++ b/internal/processing/account/delete.go @@ -330,7 +330,7 @@ statusLoop:  			})  			// Look for any boosts of this status in DB. -			boosts, err := p.state.DB.GetStatusReblogs(ctx, status) +			boosts, err := p.state.DB.GetStatusBoosts(ctx, status.ID)  			if err != nil && !errors.Is(err, db.ErrNoEntries) {  				return gtserror.Newf("error fetching status reblogs for %s: %w", status.ID, err)  			} 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. diff --git a/internal/processing/status/boost.go b/internal/processing/status/boost.go index e5d38d9d2..eccd81886 100644 --- a/internal/processing/status/boost.go +++ b/internal/processing/status/boost.go @@ -106,47 +106,24 @@ func (p *Processor) BoostRemove(ctx context.Context, requestingAccount *gtsmodel  		return nil, gtserror.NewErrorNotFound(errors.New("status is not visible"))  	} -	// check if we actually have a boost for this status -	var toUnboost bool - -	gtsBoost := >smodel.Status{} -	where := []db.Where{ -		{ -			Key:   "boost_of_id", -			Value: targetStatusID, -		}, -		{ -			Key:   "account_id", -			Value: requestingAccount.ID, -		}, -	} -	err = p.state.DB.GetWhere(ctx, where, gtsBoost) -	if err == nil { -		// we have a boost -		toUnboost = true -	} - +	// Check whether the requesting account has boosted the given status ID. +	boost, err := p.state.DB.GetStatusBoost(ctx, targetStatusID, requestingAccount.ID)  	if err != nil { -		// something went wrong in the db finding the boost -		if err != db.ErrNoEntries { -			return nil, gtserror.NewErrorInternalError(fmt.Errorf("error fetching existing boost from database: %s", err)) -		} -		// we just don't have a boost -		toUnboost = false +		return nil, gtserror.NewErrorNotFound(fmt.Errorf("error checking status boost %s: %w", targetStatusID, err))  	} -	if toUnboost { +	if boost != nil {  		// pin some stuff onto the boost while we have it out of the db -		gtsBoost.Account = requestingAccount -		gtsBoost.BoostOf = targetStatus -		gtsBoost.BoostOfAccount = targetStatus.Account -		gtsBoost.BoostOf.Account = targetStatus.Account +		boost.Account = requestingAccount +		boost.BoostOf = targetStatus +		boost.BoostOfAccount = targetStatus.Account +		boost.BoostOf.Account = targetStatus.Account  		// send it back to the processor for async processing  		p.state.Workers.EnqueueClientAPI(ctx, messages.FromClientAPI{  			APObjectType:   ap.ActivityAnnounce,  			APActivityType: ap.ActivityUndo, -			GTSModel:       gtsBoost, +			GTSModel:       boost,  			OriginAccount:  requestingAccount,  			TargetAccount:  targetStatus.Account,  		}) @@ -189,15 +166,15 @@ func (p *Processor) StatusBoostedBy(ctx context.Context, requestingAccount *gtsm  		return nil, gtserror.NewErrorNotFound(err)  	} -	statusReblogs, err := p.state.DB.GetStatusReblogs(ctx, targetStatus) +	statusBoosts, err := p.state.DB.GetStatusBoosts(ctx, targetStatus.ID)  	if err != nil {  		err = fmt.Errorf("BoostedBy: error seeing who boosted status: %s", err)  		return nil, gtserror.NewErrorNotFound(err)  	}  	// filter account IDs so the user doesn't see accounts they blocked or which blocked them -	accountIDs := make([]string, 0, len(statusReblogs)) -	for _, s := range statusReblogs { +	accountIDs := make([]string, 0, len(statusBoosts)) +	for _, s := range statusBoosts {  		blocked, err := p.state.DB.IsEitherBlocked(ctx, requestingAccount.ID, s.AccountID)  		if err != nil {  			err = fmt.Errorf("BoostedBy: error checking blocks: %s", err) diff --git a/internal/processing/status/fave.go b/internal/processing/status/fave.go index 77d3f67e9..9da243312 100644 --- a/internal/processing/status/fave.go +++ b/internal/processing/status/fave.go @@ -112,7 +112,7 @@ func (p *Processor) FavedBy(ctx context.Context, requestingAccount *gtsmodel.Acc  		return nil, errWithCode  	} -	statusFaves, err := p.state.DB.GetStatusFavesForStatus(ctx, targetStatus.ID) +	statusFaves, err := p.state.DB.GetStatusFaves(ctx, targetStatus.ID)  	if err != nil {  		return nil, gtserror.NewErrorNotFound(fmt.Errorf("FavedBy: error seeing who faved status: %s", err))  	}  | 
