Skip to content

Commit 8a0b98a

Browse files
Sync charts one-at-a-time to reduce database contention and timeouts (#880)
(cherry picked from https://activitypub.software/TransFem-org/Sharkey/-/merge_requests/830) Co-authored-by: Hazelnoot <acomputerdog@gmail.com>
1 parent 535a6bc commit 8a0b98a

File tree

4 files changed

+32
-38
lines changed

4 files changed

+32
-38
lines changed

packages/backend/src/core/chart/ChartManagementService.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@ export class ChartManagementService implements OnApplicationShutdown {
5858
@bindThis
5959
public async start() {
6060
// 20分おきにメモリ情報をDBに書き込み
61-
this.saveIntervalId = setInterval(() => {
61+
this.saveIntervalId = setInterval(async () => {
6262
for (const chart of this.charts) {
63-
chart.save();
63+
await chart.save();
6464
}
6565
}, 1000 * 60 * 20);
6666
}
@@ -69,9 +69,9 @@ export class ChartManagementService implements OnApplicationShutdown {
6969
public async dispose(): Promise<void> {
7070
clearInterval(this.saveIntervalId);
7171
if (process.env.NODE_ENV !== 'test') {
72-
await Promise.all(
73-
this.charts.map(chart => chart.save()),
74-
);
72+
for (const chart of this.charts) {
73+
await chart.save();
74+
}
7575
}
7676
}
7777

packages/backend/src/queue/processors/CleanChartsProcessorService.ts

+12-14
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,18 @@ export class CleanChartsProcessorService {
4848
public async process(): Promise<void> {
4949
this.logger.info('Clean charts...');
5050

51-
await Promise.all([
52-
this.federationChart.clean(),
53-
this.notesChart.clean(),
54-
this.usersChart.clean(),
55-
this.activeUsersChart.clean(),
56-
this.instanceChart.clean(),
57-
this.perUserNotesChart.clean(),
58-
this.perUserPvChart.clean(),
59-
this.driveChart.clean(),
60-
this.perUserReactionsChart.clean(),
61-
this.perUserFollowingChart.clean(),
62-
this.perUserDriveChart.clean(),
63-
this.apRequestChart.clean(),
64-
]);
51+
await this.federationChart.clean();
52+
await this.notesChart.clean();
53+
await this.usersChart.clean();
54+
await this.activeUsersChart.clean();
55+
await this.instanceChart.clean();
56+
await this.perUserNotesChart.clean();
57+
await this.perUserPvChart.clean();
58+
await this.driveChart.clean();
59+
await this.perUserReactionsChart.clean();
60+
await this.perUserFollowingChart.clean();
61+
await this.perUserDriveChart.clean();
62+
await this.apRequestChart.clean();
6563

6664
this.logger.succ('All charts successfully cleaned.');
6765
}

packages/backend/src/queue/processors/ResyncChartsProcessorService.ts

+3-5
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,9 @@ export class ResyncChartsProcessorService {
3131

3232
// TODO: ユーザーごとのチャートも更新する
3333
// TODO: インスタンスごとのチャートも更新する
34-
await Promise.all([
35-
this.driveChart.resync(),
36-
this.notesChart.resync(),
37-
this.usersChart.resync(),
38-
]);
34+
await this.driveChart.resync();
35+
await this.notesChart.resync();
36+
await this.usersChart.resync();
3937

4038
this.logger.succ('All charts successfully resynced.');
4139
}

packages/backend/src/queue/processors/TickChartsProcessorService.ts

+12-14
Original file line numberDiff line numberDiff line change
@@ -48,20 +48,18 @@ export class TickChartsProcessorService {
4848
public async process(): Promise<void> {
4949
this.logger.info('Tick charts...');
5050

51-
await Promise.all([
52-
this.federationChart.tick(false),
53-
this.notesChart.tick(false),
54-
this.usersChart.tick(false),
55-
this.activeUsersChart.tick(false),
56-
this.instanceChart.tick(false),
57-
this.perUserNotesChart.tick(false),
58-
this.perUserPvChart.tick(false),
59-
this.driveChart.tick(false),
60-
this.perUserReactionsChart.tick(false),
61-
this.perUserFollowingChart.tick(false),
62-
this.perUserDriveChart.tick(false),
63-
this.apRequestChart.tick(false),
64-
]);
51+
await this.federationChart.tick(false);
52+
await this.notesChart.tick(false);
53+
await this.usersChart.tick(false);
54+
await this.activeUsersChart.tick(false);
55+
await this.instanceChart.tick(false);
56+
await this.perUserNotesChart.tick(false);
57+
await this.perUserPvChart.tick(false);
58+
await this.driveChart.tick(false);
59+
await this.perUserReactionsChart.tick(false);
60+
await this.perUserFollowingChart.tick(false);
61+
await this.perUserDriveChart.tick(false);
62+
await this.apRequestChart.tick(false);
6563

6664
this.logger.succ('All charts successfully ticked.');
6765
}

0 commit comments

Comments
 (0)