mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 12:42:25 -05:00 
			
		
		
		
	[feature/performance] Store account stats in separate table (#2831)
* [feature/performance] Store account stats in separate table, get stats from remote * test account stats * add some missing increment / decrement calls * change stats function signatures * rejig logging a bit * use lock when updating stats
This commit is contained in:
		
					parent
					
						
							
								f79d50b9b2
							
						
					
				
			
			
				commit
				
					
						3cceed11b2
					
				
			
		
					 43 changed files with 1285 additions and 450 deletions
				
			
		|  | @ -247,6 +247,11 @@ func (p *clientAPI) CreateStatus(ctx context.Context, cMsg messages.FromClientAP | |||
| 		return gtserror.Newf("%T not parseable as *gtsmodel.Status", cMsg.GTSModel) | ||||
| 	} | ||||
| 
 | ||||
| 	// Update stats for the actor account. | ||||
| 	if err := p.utilF.incrementStatusesCount(ctx, cMsg.OriginAccount, status); err != nil { | ||||
| 		log.Errorf(ctx, "error updating account stats: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := p.surface.timelineAndNotifyStatus(ctx, status); err != nil { | ||||
| 		log.Errorf(ctx, "error timelining and notifying status: %v", err) | ||||
| 	} | ||||
|  | @ -311,6 +316,11 @@ func (p *clientAPI) CreateFollowReq(ctx context.Context, cMsg messages.FromClien | |||
| 		return gtserror.Newf("%T not parseable as *gtsmodel.FollowRequest", cMsg.GTSModel) | ||||
| 	} | ||||
| 
 | ||||
| 	// Update stats for the target account. | ||||
| 	if err := p.utilF.incrementFollowRequestsCount(ctx, cMsg.TargetAccount); err != nil { | ||||
| 		log.Errorf(ctx, "error updating account stats: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := p.surface.notifyFollowRequest(ctx, followRequest); err != nil { | ||||
| 		log.Errorf(ctx, "error notifying follow request: %v", err) | ||||
| 	} | ||||
|  | @ -360,6 +370,11 @@ func (p *clientAPI) CreateAnnounce(ctx context.Context, cMsg messages.FromClient | |||
| 		return gtserror.Newf("%T not parseable as *gtsmodel.Status", cMsg.GTSModel) | ||||
| 	} | ||||
| 
 | ||||
| 	// Update stats for the actor account. | ||||
| 	if err := p.utilF.incrementStatusesCount(ctx, cMsg.OriginAccount, boost); err != nil { | ||||
| 		log.Errorf(ctx, "error updating account stats: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// Timeline and notify the boost wrapper status. | ||||
| 	if err := p.surface.timelineAndNotifyStatus(ctx, boost); err != nil { | ||||
| 		log.Errorf(ctx, "error timelining and notifying status: %v", err) | ||||
|  | @ -485,6 +500,20 @@ func (p *clientAPI) AcceptFollow(ctx context.Context, cMsg messages.FromClientAP | |||
| 		return gtserror.Newf("%T not parseable as *gtsmodel.Follow", cMsg.GTSModel) | ||||
| 	} | ||||
| 
 | ||||
| 	// Update stats for the target account. | ||||
| 	if err := p.utilF.decrementFollowRequestsCount(ctx, cMsg.TargetAccount); err != nil { | ||||
| 		log.Errorf(ctx, "error updating account stats: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := p.utilF.incrementFollowersCount(ctx, cMsg.TargetAccount); err != nil { | ||||
| 		log.Errorf(ctx, "error updating account stats: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// Update stats for the origin account. | ||||
| 	if err := p.utilF.incrementFollowingCount(ctx, cMsg.OriginAccount); err != nil { | ||||
| 		log.Errorf(ctx, "error updating account stats: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := p.surface.notifyFollow(ctx, follow); err != nil { | ||||
| 		log.Errorf(ctx, "error notifying follow: %v", err) | ||||
| 	} | ||||
|  | @ -502,6 +531,11 @@ func (p *clientAPI) RejectFollowRequest(ctx context.Context, cMsg messages.FromC | |||
| 		return gtserror.Newf("%T not parseable as *gtsmodel.FollowRequest", cMsg.GTSModel) | ||||
| 	} | ||||
| 
 | ||||
| 	// Update stats for the target account. | ||||
| 	if err := p.utilF.decrementFollowRequestsCount(ctx, cMsg.TargetAccount); err != nil { | ||||
| 		log.Errorf(ctx, "error updating account stats: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := p.federate.RejectFollow( | ||||
| 		ctx, | ||||
| 		p.converter.FollowRequestToFollow(ctx, followReq), | ||||
|  | @ -518,6 +552,16 @@ func (p *clientAPI) UndoFollow(ctx context.Context, cMsg messages.FromClientAPI) | |||
| 		return gtserror.Newf("%T not parseable as *gtsmodel.Follow", cMsg.GTSModel) | ||||
| 	} | ||||
| 
 | ||||
| 	// Update stats for the origin account. | ||||
| 	if err := p.utilF.decrementFollowingCount(ctx, cMsg.OriginAccount); err != nil { | ||||
| 		log.Errorf(ctx, "error updating account stats: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// Update stats for the target account. | ||||
| 	if err := p.utilF.decrementFollowersCount(ctx, cMsg.TargetAccount); err != nil { | ||||
| 		log.Errorf(ctx, "error updating account stats: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := p.federate.UndoFollow(ctx, follow); err != nil { | ||||
| 		log.Errorf(ctx, "error federating follow undo: %v", err) | ||||
| 	} | ||||
|  | @ -565,6 +609,11 @@ func (p *clientAPI) UndoAnnounce(ctx context.Context, cMsg messages.FromClientAP | |||
| 		return gtserror.Newf("db error deleting status: %w", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// Update stats for the origin account. | ||||
| 	if err := p.utilF.decrementStatusesCount(ctx, cMsg.OriginAccount); err != nil { | ||||
| 		log.Errorf(ctx, "error updating account stats: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if err := p.surface.deleteStatusFromTimelines(ctx, status.ID); err != nil { | ||||
| 		log.Errorf(ctx, "error removing timelined status: %v", err) | ||||
| 	} | ||||
|  | @ -603,6 +652,11 @@ func (p *clientAPI) DeleteStatus(ctx context.Context, cMsg messages.FromClientAP | |||
| 		log.Errorf(ctx, "error wiping status: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	// Update stats for the origin account. | ||||
| 	if err := p.utilF.decrementStatusesCount(ctx, cMsg.OriginAccount); err != nil { | ||||
| 		log.Errorf(ctx, "error updating account stats: %v", err) | ||||
| 	} | ||||
| 
 | ||||
| 	if status.InReplyToID != "" { | ||||
| 		// Interaction counts changed on the replied status; | ||||
| 		// uncache the prepared version from all timelines. | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue