diff options
| author | dakkar <dakkar@thenautilus.net> | 2024-03-07 16:09:36 +0000 |
|---|---|---|
| committer | dakkar <dakkar@thenautilus.net> | 2024-03-07 16:09:36 +0000 |
| commit | dfff4d20731c9d356c28db6238a9e438618ff2e7 (patch) | |
| tree | 732119af4c809639356e71cd73f79eb41497d7dc /packages/backend/src/core/FetchInstanceMetadataService.ts | |
| parent | merge: check prohibited words when creating notes (!461) (diff) | |
| parent | fix(frontend): 周年の実績が閏年を考慮するように (#13525) (diff) | |
| download | sharkey-dfff4d20731c9d356c28db6238a9e438618ff2e7.tar.gz sharkey-dfff4d20731c9d356c28db6238a9e438618ff2e7.tar.bz2 sharkey-dfff4d20731c9d356c28db6238a9e438618ff2e7.zip | |
Merge remote-tracking branch 'misskey/develop' into future
Diffstat (limited to 'packages/backend/src/core/FetchInstanceMetadataService.ts')
| -rw-r--r-- | packages/backend/src/core/FetchInstanceMetadataService.ts | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/packages/backend/src/core/FetchInstanceMetadataService.ts b/packages/backend/src/core/FetchInstanceMetadataService.ts index bc270bd28f..8d173855f3 100644 --- a/packages/backend/src/core/FetchInstanceMetadataService.ts +++ b/packages/backend/src/core/FetchInstanceMetadataService.ts @@ -51,21 +51,35 @@ export class FetchInstanceMetadataService { } @bindThis - public async tryLock(host: string): Promise<boolean> { - const mutex = await this.redisClient.set(`fetchInstanceMetadata:mutex:${host}`, '1', 'GET'); - return mutex !== '1'; + // public for test + public async tryLock(host: string): Promise<string | null> { + // TODO: マイグレーションなのであとで消す (2024.3.1) + this.redisClient.del(`fetchInstanceMetadata:mutex:${host}`); + + return await this.redisClient.set( + `fetchInstanceMetadata:mutex:v2:${host}`, '1', + 'EX', 30, // 30秒したら自動でロック解除 https://github.com/misskey-dev/misskey/issues/13506#issuecomment-1975375395 + 'GET' // 古い値を返す(なかったらnull) + ); } @bindThis - public unlock(host: string): Promise<'OK'> { - return this.redisClient.set(`fetchInstanceMetadata:mutex:${host}`, '0'); + // public for test + public unlock(host: string): Promise<number> { + return this.redisClient.del(`fetchInstanceMetadata:mutex:v2:${host}`); } @bindThis public async fetchInstanceMetadata(instance: MiInstance, force = false): Promise<void> { const host = instance.host; - // Acquire mutex to ensure no parallel runs - if (!await this.tryLock(host)) return; + + // finallyでunlockされてしまうのでtry内でロックチェックをしない + // (returnであってもfinallyは実行される) + if (!force && await this.tryLock(host) === '1') { + // 1が返ってきていたらロックされているという意味なので、何もしない + return; + } + try { if (!force) { const _instance = await this.federatedInstanceService.fetch(host); |