summaryrefslogtreecommitdiff
path: root/packages/backend/src/core/FetchInstanceMetadataService.ts
diff options
context:
space:
mode:
authortamaina <tamaina@hotmail.co.jp>2024-03-04 13:48:57 +0900
committerGitHub <noreply@github.com>2024-03-04 13:48:57 +0900
commit9542cb8d6253a93b06a68b9ac3647367f8f7354c (patch)
tree539e1060a29ef0c223791512798c8fb03558c8e9 /packages/backend/src/core/FetchInstanceMetadataService.ts
parentchore: Automated release (#13075) (diff)
downloadsharkey-9542cb8d6253a93b06a68b9ac3647367f8f7354c.tar.gz
sharkey-9542cb8d6253a93b06a68b9ac3647367f8f7354c.tar.bz2
sharkey-9542cb8d6253a93b06a68b9ac3647367f8f7354c.zip
fix(backend): リモートサーバーの情報が更新できなくなっていた問題を修正 (#13507)
* fix(backend): fetchInstanceMetadataのLockが永遠に解除されない問題を修正 Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com> * fix test * fix * comment * comment * improve test --------- Co-authored-by: まっちゃとーにゅ <17376330+u1-liquid@users.noreply.github.com>
Diffstat (limited to 'packages/backend/src/core/FetchInstanceMetadataService.ts')
-rw-r--r--packages/backend/src/core/FetchInstanceMetadataService.ts28
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);