summaryrefslogtreecommitdiff
path: root/packages/backend/src
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-02-11 17:58:04 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2022-02-11 17:58:04 +0900
commit1ce8da66c2a38fea9bf7aa314717412539fbab6d (patch)
tree3c02cc6ec9ce2ee8313943240e7d423573462244 /packages/backend/src
parentMerge branch 'develop' (diff)
parent12.106.0 (diff)
downloadmisskey-1ce8da66c2a38fea9bf7aa314717412539fbab6d.tar.gz
misskey-1ce8da66c2a38fea9bf7aa314717412539fbab6d.tar.bz2
misskey-1ce8da66c2a38fea9bf7aa314717412539fbab6d.zip
Merge branch 'develop'
Diffstat (limited to 'packages/backend/src')
-rw-r--r--packages/backend/src/misc/check-word-mute.ts31
-rw-r--r--packages/backend/src/models/entities/following.ts2
-rw-r--r--packages/backend/src/queue/index.ts5
-rw-r--r--packages/backend/src/queue/processors/system/index.ts2
-rw-r--r--packages/backend/src/queue/processors/system/tick-charts.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/admin/resync-chart.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/i/update.ts21
-rw-r--r--packages/backend/src/services/chart/charts/active-users.ts7
-rw-r--r--packages/backend/src/services/chart/charts/ap-request.ts7
-rw-r--r--packages/backend/src/services/chart/charts/drive.ts7
-rw-r--r--packages/backend/src/services/chart/charts/entities/federation.ts5
-rw-r--r--packages/backend/src/services/chart/charts/federation.ts33
-rw-r--r--packages/backend/src/services/chart/charts/hashtag.ts7
-rw-r--r--packages/backend/src/services/chart/charts/instance.ts7
-rw-r--r--packages/backend/src/services/chart/charts/notes.ts7
-rw-r--r--packages/backend/src/services/chart/charts/per-user-drive.ts7
-rw-r--r--packages/backend/src/services/chart/charts/per-user-following.ts7
-rw-r--r--packages/backend/src/services/chart/charts/per-user-notes.ts7
-rw-r--r--packages/backend/src/services/chart/charts/per-user-reactions.ts7
-rw-r--r--packages/backend/src/services/chart/charts/test-grouped.ts7
-rw-r--r--packages/backend/src/services/chart/charts/test-intersection.ts7
-rw-r--r--packages/backend/src/services/chart/charts/test-unique.ts7
-rw-r--r--packages/backend/src/services/chart/charts/test.ts7
-rw-r--r--packages/backend/src/services/chart/charts/users.ts7
-rw-r--r--packages/backend/src/services/chart/core.ts19
-rw-r--r--packages/backend/src/services/register-or-fetch-instance-doc.ts3
26 files changed, 203 insertions, 73 deletions
diff --git a/packages/backend/src/misc/check-word-mute.ts b/packages/backend/src/misc/check-word-mute.ts
index e2e871dd2b..dedda3cdf6 100644
--- a/packages/backend/src/misc/check-word-mute.ts
+++ b/packages/backend/src/misc/check-word-mute.ts
@@ -11,26 +11,31 @@ type UserLike = {
id: User['id'];
};
-export async function checkWordMute(note: NoteLike, me: UserLike | null | undefined, mutedWords: string[][]): Promise<boolean> {
+export async function checkWordMute(note: NoteLike, me: UserLike | null | undefined, mutedWords: Array<string | string[]>): Promise<boolean> {
// 自分自身
if (me && (note.userId === me.id)) return false;
- const words = mutedWords
- // Clean up
- .map(xs => xs.filter(x => x !== ''))
- .filter(xs => xs.length > 0);
-
- if (words.length > 0) {
+ if (mutedWords.length > 0) {
if (note.text == null) return false;
- const matched = words.some(and =>
- and.every(keyword => {
- const regexp = keyword.match(/^\/(.+)\/(.*)$/);
- if (regexp) {
+ const matched = mutedWords.some(filter => {
+ if (Array.isArray(filter)) {
+ return filter.every(keyword => note.text!.includes(keyword));
+ } else {
+ // represents RegExp
+ const regexp = filter.match(/^\/(.+)\/(.*)$/);
+
+ // This should never happen due to input sanitisation.
+ if (!regexp) return false;
+
+ try {
return new RE2(regexp[1], regexp[2]).test(note.text!);
+ } catch (err) {
+ // This should never happen due to input sanitisation.
+ return false;
}
- return note.text!.includes(keyword);
- }));
+ }
+ });
if (matched) return true;
}
diff --git a/packages/backend/src/models/entities/following.ts b/packages/backend/src/models/entities/following.ts
index c3631e8501..ad387e5188 100644
--- a/packages/backend/src/models/entities/following.ts
+++ b/packages/backend/src/models/entities/following.ts
@@ -41,6 +41,7 @@ export class Following {
public follower: User | null;
//#region Denormalized fields
+ @Index()
@Column('varchar', {
length: 128, nullable: true,
comment: '[Denormalized]',
@@ -59,6 +60,7 @@ export class Following {
})
public followerSharedInbox: string | null;
+ @Index()
@Column('varchar', {
length: 128, nullable: true,
comment: '[Denormalized]',
diff --git a/packages/backend/src/queue/index.ts b/packages/backend/src/queue/index.ts
index 16acabfbf8..62f372f3a8 100644
--- a/packages/backend/src/queue/index.ts
+++ b/packages/backend/src/queue/index.ts
@@ -258,6 +258,11 @@ export default function() {
processDb(dbQueue);
processObjectStorage(objectStorageQueue);
+ systemQueue.add('tickCharts', {
+ }, {
+ repeat: { cron: '55 * * * *' },
+ });
+
systemQueue.add('resyncCharts', {
}, {
repeat: { cron: '0 0 * * *' },
diff --git a/packages/backend/src/queue/processors/system/index.ts b/packages/backend/src/queue/processors/system/index.ts
index 636fefc402..1513ea4a84 100644
--- a/packages/backend/src/queue/processors/system/index.ts
+++ b/packages/backend/src/queue/processors/system/index.ts
@@ -1,8 +1,10 @@
import * as Bull from 'bull';
+import { tickCharts } from './tick-charts';
import { resyncCharts } from './resync-charts';
import { cleanCharts } from './clean-charts';
const jobs = {
+ tickCharts,
resyncCharts,
cleanCharts,
} as Record<string, Bull.ProcessCallbackFunction<Record<string, unknown>> | Bull.ProcessPromiseFunction<Record<string, unknown>>>;
diff --git a/packages/backend/src/queue/processors/system/tick-charts.ts b/packages/backend/src/queue/processors/system/tick-charts.ts
new file mode 100644
index 0000000000..d53089f89c
--- /dev/null
+++ b/packages/backend/src/queue/processors/system/tick-charts.ts
@@ -0,0 +1,28 @@
+import * as Bull from 'bull';
+
+import { queueLogger } from '../../logger';
+import { activeUsersChart, driveChart, federationChart, hashtagChart, instanceChart, notesChart, perUserDriveChart, perUserFollowingChart, perUserNotesChart, perUserReactionsChart, usersChart, apRequestChart } from '@/services/chart/index';
+
+const logger = queueLogger.createSubLogger('tick-charts');
+
+export async function tickCharts(job: Bull.Job<Record<string, unknown>>, done: any): Promise<void> {
+ logger.info(`Tick charts...`);
+
+ await Promise.all([
+ federationChart.tick(false),
+ notesChart.tick(false),
+ usersChart.tick(false),
+ activeUsersChart.tick(false),
+ instanceChart.tick(false),
+ perUserNotesChart.tick(false),
+ driveChart.tick(false),
+ perUserReactionsChart.tick(false),
+ hashtagChart.tick(false),
+ perUserFollowingChart.tick(false),
+ perUserDriveChart.tick(false),
+ apRequestChart.tick(false),
+ ]);
+
+ logger.succ(`All charts successfully ticked.`);
+ done();
+}
diff --git a/packages/backend/src/server/api/endpoints/admin/resync-chart.ts b/packages/backend/src/server/api/endpoints/admin/resync-chart.ts
deleted file mode 100644
index d80d2b0426..0000000000
--- a/packages/backend/src/server/api/endpoints/admin/resync-chart.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import define from '../../define';
-import { driveChart, notesChart, usersChart } from '@/services/chart/index';
-import { insertModerationLog } from '@/services/insert-moderation-log';
-
-export const meta = {
- tags: ['admin'],
-
- requireCredential: true,
- requireModerator: true,
-} as const;
-
-// eslint-disable-next-line import/no-default-export
-export default define(meta, async (ps, me) => {
- insertModerationLog(me, 'chartResync');
-
- driveChart.resync();
- notesChart.resync();
- usersChart.resync();
-
- // TODO: ユーザーごとのチャートもキューに入れて更新する
- // TODO: インスタンスごとのチャートもキューに入れて更新する
-});
diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts
index eb57aa2bfc..aec7bbd2e1 100644
--- a/packages/backend/src/server/api/endpoints/i/update.ts
+++ b/packages/backend/src/server/api/endpoints/i/update.ts
@@ -1,3 +1,4 @@
+const RE2 = require('re2');
import $ from 'cafy';
import * as mfm from 'mfm-js';
import { ID } from '@/misc/cafy-id';
@@ -117,7 +118,7 @@ export const meta = {
},
mutedWords: {
- validator: $.optional.arr($.arr($.str)),
+ validator: $.optional.arr($.either($.arr($.str.min(1)).min(1), $.str)),
},
mutedInstances: {
@@ -163,6 +164,12 @@ export const meta = {
code: 'NO_SUCH_PAGE',
id: '8e01b590-7eb9-431b-a239-860e086c408e',
},
+
+ invalidRegexp: {
+ message: 'Invalid Regular Expression.',
+ code: 'INVALID_REGEXP',
+ id: '0d786918-10df-41cd-8f33-8dec7d9a89a5',
+ }
},
res: {
@@ -191,6 +198,18 @@ export default define(meta, async (ps, _user, token) => {
if (ps.avatarId !== undefined) updates.avatarId = ps.avatarId;
if (ps.bannerId !== undefined) updates.bannerId = ps.bannerId;
if (ps.mutedWords !== undefined) {
+ // validate regular expression syntax
+ ps.mutedWords.filter(x => !Array.isArray(x)).forEach(x => {
+ const regexp = x.match(/^\/(.+)\/(.*)$/);
+ if (!regexp) throw new ApiError(meta.errors.invalidRegexp);
+
+ try {
+ new RE2(regexp[1], regexp[2]);
+ } catch (err) {
+ throw new ApiError(meta.errors.invalidRegexp);
+ }
+ });
+
profileUpdates.mutedWords = ps.mutedWords;
profileUpdates.enableWordMute = ps.mutedWords.length > 0;
}
diff --git a/packages/backend/src/services/chart/charts/active-users.ts b/packages/backend/src/services/chart/charts/active-users.ts
index 87dd95f4dc..5baf46f772 100644
--- a/packages/backend/src/services/chart/charts/active-users.ts
+++ b/packages/backend/src/services/chart/charts/active-users.ts
@@ -18,7 +18,12 @@ export default class ActiveUsersChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
diff --git a/packages/backend/src/services/chart/charts/ap-request.ts b/packages/backend/src/services/chart/charts/ap-request.ts
index bac5e425c8..ca763c8847 100644
--- a/packages/backend/src/services/chart/charts/ap-request.ts
+++ b/packages/backend/src/services/chart/charts/ap-request.ts
@@ -12,7 +12,12 @@ export default class ApRequestChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
diff --git a/packages/backend/src/services/chart/charts/drive.ts b/packages/backend/src/services/chart/charts/drive.ts
index 2f00adae2b..288689784e 100644
--- a/packages/backend/src/services/chart/charts/drive.ts
+++ b/packages/backend/src/services/chart/charts/drive.ts
@@ -15,7 +15,12 @@ export default class DriveChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
diff --git a/packages/backend/src/services/chart/charts/entities/federation.ts b/packages/backend/src/services/chart/charts/entities/federation.ts
index 0c8c20991d..6b2089f0b4 100644
--- a/packages/backend/src/services/chart/charts/entities/federation.ts
+++ b/packages/backend/src/services/chart/charts/entities/federation.ts
@@ -3,12 +3,11 @@ import Chart from '../../core';
export const name = 'federation';
export const schema = {
- 'instance.total': { accumulate: true },
- 'instance.inc': { range: 'small' },
- 'instance.dec': { range: 'small' },
'deliveredInstances': { uniqueIncrement: true, range: 'small' },
'inboxInstances': { uniqueIncrement: true, range: 'small' },
'stalled': { uniqueIncrement: true, range: 'small' },
+ 'sub': { accumulate: true, range: 'small' },
+ 'pub': { accumulate: true, range: 'small' },
} as const;
export const entity = Chart.schemaToEntity(name, schema);
diff --git a/packages/backend/src/services/chart/charts/federation.ts b/packages/backend/src/services/chart/charts/federation.ts
index 19c75c98ad..211ba1debc 100644
--- a/packages/backend/src/services/chart/charts/federation.ts
+++ b/packages/backend/src/services/chart/charts/federation.ts
@@ -1,6 +1,6 @@
import autobind from 'autobind-decorator';
import Chart, { KVs } from '../core';
-import { Instances } from '@/models/index';
+import { Followings } from '@/models/index';
import { name, schema } from './entities/federation';
/**
@@ -13,23 +13,30 @@ export default class FederationChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(): Promise<Partial<KVs<typeof schema>>> {
- const [total] = await Promise.all([
- Instances.count({}),
- ]);
-
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
return {
- 'instance.total': total,
};
}
@autobind
- public async update(isAdditional: boolean): Promise<void> {
- await this.commit({
- 'instance.total': isAdditional ? 1 : -1,
- 'instance.inc': isAdditional ? 1 : 0,
- 'instance.dec': isAdditional ? 0 : 1,
- });
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ const [sub, pub] = await Promise.all([
+ Followings.createQueryBuilder('following')
+ .select('COUNT(DISTINCT following.followeeHost)')
+ .where('following.followeeHost IS NOT NULL')
+ .getRawOne()
+ .then(x => parseInt(x.count, 10)),
+ Followings.createQueryBuilder('following')
+ .select('COUNT(DISTINCT following.followerHost)')
+ .where('following.followerHost IS NOT NULL')
+ .getRawOne()
+ .then(x => parseInt(x.count, 10)),
+ ]);
+
+ return {
+ 'sub': sub,
+ 'pub': pub,
+ };
}
@autobind
diff --git a/packages/backend/src/services/chart/charts/hashtag.ts b/packages/backend/src/services/chart/charts/hashtag.ts
index 0b7bc467d2..cbae686833 100644
--- a/packages/backend/src/services/chart/charts/hashtag.ts
+++ b/packages/backend/src/services/chart/charts/hashtag.ts
@@ -14,7 +14,12 @@ export default class HashtagChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
diff --git a/packages/backend/src/services/chart/charts/instance.ts b/packages/backend/src/services/chart/charts/instance.ts
index 5ea4d567e1..930ac4729b 100644
--- a/packages/backend/src/services/chart/charts/instance.ts
+++ b/packages/backend/src/services/chart/charts/instance.ts
@@ -16,7 +16,7 @@ export default class InstanceChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(group: string): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
const [
notesCount,
usersCount,
@@ -43,6 +43,11 @@ export default class InstanceChart extends Chart<typeof schema> {
}
@autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
public async requestReceived(host: string): Promise<void> {
await this.commit({
'requests.received': 1,
diff --git a/packages/backend/src/services/chart/charts/notes.ts b/packages/backend/src/services/chart/charts/notes.ts
index 5c56a9a718..624ee5db28 100644
--- a/packages/backend/src/services/chart/charts/notes.ts
+++ b/packages/backend/src/services/chart/charts/notes.ts
@@ -15,7 +15,7 @@ export default class NotesChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
const [localCount, remoteCount] = await Promise.all([
Notes.count({ userHost: null }),
Notes.count({ userHost: Not(IsNull()) }),
@@ -28,6 +28,11 @@ export default class NotesChart extends Chart<typeof schema> {
}
@autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
public async update(note: Note, isAdditional: boolean): Promise<void> {
const prefix = note.userHost === null ? 'local' : 'remote';
diff --git a/packages/backend/src/services/chart/charts/per-user-drive.ts b/packages/backend/src/services/chart/charts/per-user-drive.ts
index 969ed018f9..ae9e8c5694 100644
--- a/packages/backend/src/services/chart/charts/per-user-drive.ts
+++ b/packages/backend/src/services/chart/charts/per-user-drive.ts
@@ -14,7 +14,7 @@ export default class PerUserDriveChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(group: string): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
const [count, size] = await Promise.all([
DriveFiles.count({ userId: group }),
DriveFiles.calcDriveUsageOf(group),
@@ -27,6 +27,11 @@ export default class PerUserDriveChart extends Chart<typeof schema> {
}
@autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
public async update(file: DriveFile, isAdditional: boolean): Promise<void> {
const fileSizeKb = file.size / 1000;
await this.commit({
diff --git a/packages/backend/src/services/chart/charts/per-user-following.ts b/packages/backend/src/services/chart/charts/per-user-following.ts
index cdd0aad947..0b39881c14 100644
--- a/packages/backend/src/services/chart/charts/per-user-following.ts
+++ b/packages/backend/src/services/chart/charts/per-user-following.ts
@@ -15,7 +15,7 @@ export default class PerUserFollowingChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(group: string): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
const [
localFollowingsCount,
localFollowersCount,
@@ -37,6 +37,11 @@ export default class PerUserFollowingChart extends Chart<typeof schema> {
}
@autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
public async update(follower: { id: User['id']; host: User['host']; }, followee: { id: User['id']; host: User['host']; }, isFollow: boolean): Promise<void> {
const prefixFollower = Users.isLocalUser(follower) ? 'local' : 'remote';
const prefixFollowee = Users.isLocalUser(followee) ? 'local' : 'remote';
diff --git a/packages/backend/src/services/chart/charts/per-user-notes.ts b/packages/backend/src/services/chart/charts/per-user-notes.ts
index 6a4f0363b2..01a2785158 100644
--- a/packages/backend/src/services/chart/charts/per-user-notes.ts
+++ b/packages/backend/src/services/chart/charts/per-user-notes.ts
@@ -15,7 +15,7 @@ export default class PerUserNotesChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(group: string): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
const [count] = await Promise.all([
Notes.count({ userId: group }),
]);
@@ -26,6 +26,11 @@ export default class PerUserNotesChart extends Chart<typeof schema> {
}
@autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
public async update(user: { id: User['id'] }, note: Note, isAdditional: boolean): Promise<void> {
await this.commit({
'total': isAdditional ? 1 : -1,
diff --git a/packages/backend/src/services/chart/charts/per-user-reactions.ts b/packages/backend/src/services/chart/charts/per-user-reactions.ts
index 2ec347f40a..59af0e86c0 100644
--- a/packages/backend/src/services/chart/charts/per-user-reactions.ts
+++ b/packages/backend/src/services/chart/charts/per-user-reactions.ts
@@ -15,7 +15,12 @@ export default class PerUserReactionsChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(group: string): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
diff --git a/packages/backend/src/services/chart/charts/test-grouped.ts b/packages/backend/src/services/chart/charts/test-grouped.ts
index 5f0b1aafdc..19b2135849 100644
--- a/packages/backend/src/services/chart/charts/test-grouped.ts
+++ b/packages/backend/src/services/chart/charts/test-grouped.ts
@@ -14,13 +14,18 @@ export default class TestGroupedChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(group: string): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(group: string): Promise<Partial<KVs<typeof schema>>> {
return {
'foo.total': this.total[group],
};
}
@autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
public async increment(group: string): Promise<void> {
if (this.total[group] == null) this.total[group] = 0;
diff --git a/packages/backend/src/services/chart/charts/test-intersection.ts b/packages/backend/src/services/chart/charts/test-intersection.ts
index c6ba71a956..6fd780f9b9 100644
--- a/packages/backend/src/services/chart/charts/test-intersection.ts
+++ b/packages/backend/src/services/chart/charts/test-intersection.ts
@@ -12,7 +12,12 @@ export default class TestIntersectionChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
diff --git a/packages/backend/src/services/chart/charts/test-unique.ts b/packages/backend/src/services/chart/charts/test-unique.ts
index e67036acef..2c9cc2fd6a 100644
--- a/packages/backend/src/services/chart/charts/test-unique.ts
+++ b/packages/backend/src/services/chart/charts/test-unique.ts
@@ -12,7 +12,12 @@ export default class TestUniqueChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
return {};
}
diff --git a/packages/backend/src/services/chart/charts/test.ts b/packages/backend/src/services/chart/charts/test.ts
index 878acd51be..b539625c10 100644
--- a/packages/backend/src/services/chart/charts/test.ts
+++ b/packages/backend/src/services/chart/charts/test.ts
@@ -14,13 +14,18 @@ export default class TestChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
return {
'foo.total': this.total,
};
}
@autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
public async increment(): Promise<void> {
this.total++;
diff --git a/packages/backend/src/services/chart/charts/users.ts b/packages/backend/src/services/chart/charts/users.ts
index 50fca3a8d6..70ef89f8cd 100644
--- a/packages/backend/src/services/chart/charts/users.ts
+++ b/packages/backend/src/services/chart/charts/users.ts
@@ -15,7 +15,7 @@ export default class UsersChart extends Chart<typeof schema> {
}
@autobind
- protected async queryCurrentState(): Promise<Partial<KVs<typeof schema>>> {
+ protected async tickMajor(): Promise<Partial<KVs<typeof schema>>> {
const [localCount, remoteCount] = await Promise.all([
Users.count({ host: null }),
Users.count({ host: Not(IsNull()) }),
@@ -28,6 +28,11 @@ export default class UsersChart extends Chart<typeof schema> {
}
@autobind
+ protected async tickMinor(): Promise<Partial<KVs<typeof schema>>> {
+ return {};
+ }
+
+ @autobind
public async update(user: { id: User['id'], host: User['host'] }, isAdditional: boolean): Promise<void> {
const prefix = Users.isLocalUser(user) ? 'local' : 'remote';
diff --git a/packages/backend/src/services/chart/core.ts b/packages/backend/src/services/chart/core.ts
index 5888e1a144..61a7575706 100644
--- a/packages/backend/src/services/chart/core.ts
+++ b/packages/backend/src/services/chart/core.ts
@@ -81,7 +81,15 @@ export default abstract class Chart<T extends Schema> {
protected repositoryForHour: Repository<RawRecord<T>>;
protected repositoryForDay: Repository<RawRecord<T>>;
- protected abstract queryCurrentState(group: string | null): Promise<Partial<KVs<T>>>;
+ /**
+ * 1日に一回程度実行されれば良いような計算処理を入れる(主にCASCADE削除などアプリケーション側で感知できない変動によるズレの修正用)
+ */
+ protected abstract tickMajor(group: string | null): Promise<Partial<KVs<T>>>;
+
+ /**
+ * 少なくとも最小スパン内に1回は実行されて欲しい計算処理を入れる
+ */
+ protected abstract tickMinor(group: string | null): Promise<Partial<KVs<T>>>;
@autobind
private static convertSchemaToColumnDefinitions(schema: Schema): Record<string, { type: string; array?: boolean; default?: any; }> {
@@ -445,8 +453,8 @@ export default abstract class Chart<T extends Schema> {
}
@autobind
- public async resync(group: string | null = null): Promise<void> {
- const data = await this.queryCurrentState(group);
+ public async tick(major: boolean, group: string | null = null): Promise<void> {
+ const data = major ? await this.tickMajor(group) : await this.tickMinor(group);
const columns = {} as Record<string, number>;
for (const [k, v] of Object.entries(data)) {
@@ -481,6 +489,11 @@ export default abstract class Chart<T extends Schema> {
}
@autobind
+ public resync(group: string | null = null): Promise<void> {
+ return this.tick(true, group);
+ }
+
+ @autobind
public async clean(): Promise<void> {
const current = dateUTC(Chart.getCurrentDate());
diff --git a/packages/backend/src/services/register-or-fetch-instance-doc.ts b/packages/backend/src/services/register-or-fetch-instance-doc.ts
index 18b42ed15b..c42506a2ed 100644
--- a/packages/backend/src/services/register-or-fetch-instance-doc.ts
+++ b/packages/backend/src/services/register-or-fetch-instance-doc.ts
@@ -1,6 +1,5 @@
import { Instance } from '@/models/entities/instance';
import { Instances } from '@/models/index';
-import { federationChart } from '@/services/chart/index';
import { genId } from '@/misc/gen-id';
import { toPuny } from '@/misc/convert-host';
import { Cache } from '@/misc/cache';
@@ -23,8 +22,6 @@ export async function registerOrFetchInstanceDoc(host: string): Promise<Instance
lastCommunicatedAt: new Date(),
}).then(x => Instances.findOneOrFail(x.identifiers[0]));
- federationChart.update(true);
-
cache.set(host, i);
return i;
} else {