From 5082f15e758112823f3a1d0dab7f97b5763c621b Mon Sep 17 00:00:00 2001 From: Laura Hausmann Date: Fri, 1 Mar 2024 03:43:50 +0100 Subject: [PATCH] [backend/core] Use KeyedLocker when resolving pinned notes (ISH-67) --- Iceshrimp.Backend/Core/Services/UserService.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/Iceshrimp.Backend/Core/Services/UserService.cs b/Iceshrimp.Backend/Core/Services/UserService.cs index 3d30f5af..cdc2f4ef 100644 --- a/Iceshrimp.Backend/Core/Services/UserService.cs +++ b/Iceshrimp.Backend/Core/Services/UserService.cs @@ -704,18 +704,22 @@ public class UserService( // Clean up user list memberships await db.UserListMembers.Where(p => p.UserList.User == user && p.User == followee).ExecuteDeleteAsync(); } - + [SuppressMessage("ReSharper", "SuggestBaseTypeForParameter", Justification = "Method only makes sense for users")] private void UpdateUserPinnedNotesInBackground(ASActor actor, User user, bool force = false) { if (followupTaskSvc.IsBackgroundWorker && !force) return; + if (KeyedLocker.IsInUse($"pinnedNotes:{user.Id}")) return; _ = followupTaskSvc.ExecuteTask("UpdateUserPinnedNotes", async provider => { - var bgDb = provider.GetRequiredService(); - var bgNoteSvc = provider.GetRequiredService(); - var bgUser = await bgDb.Users.IncludeCommonProperties().FirstOrDefaultAsync(p => p.Id == user.Id); - if (bgUser == null) return; - await bgNoteSvc.UpdatePinnedNotesAsync(actor, bgUser); + using (await KeyedLocker.LockAsync($"pinnedNotes:{user.Id}")) + { + var bgDb = provider.GetRequiredService(); + var bgNoteSvc = provider.GetRequiredService(); + var bgUser = await bgDb.Users.IncludeCommonProperties().FirstOrDefaultAsync(p => p.Id == user.Id); + if (bgUser == null) return; + await bgNoteSvc.UpdatePinnedNotesAsync(actor, bgUser); + } }); }