From 47c57220609a4695c1cd813f574a30f83cd92240 Mon Sep 17 00:00:00 2001 From: Dragory <2606411+Dragory@users.noreply.github.com> Date: Fri, 22 May 2020 20:35:15 +0300 Subject: [PATCH] Add a shared lock for Persist and ReactionRoles plugins to prevent race conditions --- backend/src/plugins/Persist.ts | 9 ++++++++- backend/src/plugins/ReactionRoles.ts | 8 ++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/backend/src/plugins/Persist.ts b/backend/src/plugins/Persist.ts index 0232601e..ba9250eb 100644 --- a/backend/src/plugins/Persist.ts +++ b/backend/src/plugins/Persist.ts @@ -71,8 +71,13 @@ export class PersistPlugin extends ZeppelinPlugin { @d.event("guildMemberAdd") async onGuildMemberAdd(_, member: Member) { + const memberRolesLock = await this.locks.acquire(`member-roles-${member.id}`); + const persistedData = await this.persistedData.find(member.id); - if (!persistedData) return; + if (!persistedData) { + memberRolesLock.unlock(); + return; + } const toRestore: MemberOptions = {}; const config = this.getConfig(); @@ -101,5 +106,7 @@ export class PersistPlugin extends ZeppelinPlugin { restoredData: restoredData.join(", "), }); } + + memberRolesLock.unlock(); } } diff --git a/backend/src/plugins/ReactionRoles.ts b/backend/src/plugins/ReactionRoles.ts index 4f48ca9a..67baeae3 100644 --- a/backend/src/plugins/ReactionRoles.ts +++ b/backend/src/plugins/ReactionRoles.ts @@ -189,6 +189,10 @@ export class ReactionRolesPlugin extends ZeppelinPlugin { timeout: null, changes: [], applyFn: async () => { + this.pendingRoleChanges.delete(memberId); + + const lock = await this.locks.acquire(`member-roles-${memberId}`); + const member = await this.getMember(memberId); if (member) { const newRoleIds = new Set(member.roles); @@ -206,9 +210,9 @@ export class ReactionRolesPlugin extends ZeppelinPlugin { `Failed to apply role changes to ${member.username}#${member.discriminator} (${member.id}): ${e.message}`, ); } - - this.pendingRoleChanges.delete(memberId); } + + lock.unlock(); }, };