server: refactor meta caching
This removes the "caching" that re-fetches the instance meta information from the database every 10 seconds.
This commit is contained in:
parent
9d9b2da6cc
commit
9f6be8d557
2 changed files with 39 additions and 50 deletions
|
@ -1,44 +1,44 @@
|
||||||
|
import push from 'web-push';
|
||||||
import { db } from '@/db/postgre.js';
|
import { db } from '@/db/postgre.js';
|
||||||
import { Meta } from '@/models/entities/meta.js';
|
import { Meta } from '@/models/entities/meta.js';
|
||||||
|
import { getFetchInstanceMetadataLock } from '@/misc/app-lock.js';
|
||||||
|
|
||||||
let cache: Meta;
|
let cache: Meta;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs the primitive database operation to set the server configuration
|
||||||
|
*/
|
||||||
|
export async function setMeta(meta: Meta): Promise<void> {
|
||||||
|
const unlock = await getFetchInstanceMetadataLock('localhost');
|
||||||
|
|
||||||
|
// try to mitigate older bugs where multiple meta entries may have been created
|
||||||
|
db.manager.clear(Meta);
|
||||||
|
db.manager.insert(Meta, meta);
|
||||||
|
|
||||||
|
unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Performs the primitive database operation to fetch server configuration.
|
||||||
|
* Writes to `cache` instead of returning.
|
||||||
|
*/
|
||||||
|
async function getMeta(): Promise<void> {
|
||||||
|
const unlock = await getFetchInstanceMetadataLock('localhost');
|
||||||
|
|
||||||
|
// new IDs are prioritised because multiple records may have been created due to past bugs
|
||||||
|
cache = db.manager.findOne(Meta, {
|
||||||
|
order: {
|
||||||
|
id: 'DESC',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
unlock();
|
||||||
|
}
|
||||||
|
|
||||||
export async function fetchMeta(noCache = false): Promise<Meta> {
|
export async function fetchMeta(noCache = false): Promise<Meta> {
|
||||||
if (!noCache && cache) return cache;
|
if (!noCache && cache) return cache;
|
||||||
|
|
||||||
return await db.transaction(async transactionalEntityManager => {
|
await getMeta();
|
||||||
// 過去のバグでレコードが複数出来てしまっている可能性があるので新しいIDを優先する
|
|
||||||
const metas = await transactionalEntityManager.find(Meta, {
|
|
||||||
order: {
|
|
||||||
id: 'DESC',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const meta = metas[0];
|
return cache;
|
||||||
|
|
||||||
if (meta) {
|
|
||||||
cache = meta;
|
|
||||||
return meta;
|
|
||||||
} else {
|
|
||||||
// metaが空のときfetchMetaが同時に呼ばれるとここが同時に呼ばれてしまうことがあるのでフェイルセーフなupsertを使う
|
|
||||||
const saved = await transactionalEntityManager
|
|
||||||
.upsert(
|
|
||||||
Meta,
|
|
||||||
{
|
|
||||||
id: 'x',
|
|
||||||
},
|
|
||||||
['id'],
|
|
||||||
)
|
|
||||||
.then((x) => transactionalEntityManager.findOneByOrFail(Meta, x.identifiers[0]));
|
|
||||||
|
|
||||||
cache = saved;
|
|
||||||
return saved;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
setInterval(() => {
|
|
||||||
fetchMeta(true).then(meta => {
|
|
||||||
cache = meta;
|
|
||||||
});
|
|
||||||
}, 1000 * 10);
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
import { Meta } from '@/models/entities/meta.js';
|
|
||||||
import { insertModerationLog } from '@/services/insert-moderation-log.js';
|
import { insertModerationLog } from '@/services/insert-moderation-log.js';
|
||||||
import { db } from '@/db/postgre.js';
|
import { fetchMeta, setMeta } from '@/misc/fetch-meta.js';
|
||||||
import define from '../../define.js';
|
import define from '../../define.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
|
@ -375,20 +374,10 @@ export default define(meta, paramDef, async (ps, me) => {
|
||||||
set.deeplIsPro = ps.deeplIsPro;
|
set.deeplIsPro = ps.deeplIsPro;
|
||||||
}
|
}
|
||||||
|
|
||||||
await db.transaction(async transactionalEntityManager => {
|
const meta = await fetchMeta();
|
||||||
const metas = await transactionalEntityManager.find(Meta, {
|
await setMeta({
|
||||||
order: {
|
...meta,
|
||||||
id: 'DESC',
|
...set,
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const meta = metas[0];
|
|
||||||
|
|
||||||
if (meta) {
|
|
||||||
await transactionalEntityManager.update(Meta, meta.id, set);
|
|
||||||
} else {
|
|
||||||
await transactionalEntityManager.save(Meta, set);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
insertModerationLog(me, 'updateMeta');
|
insertModerationLog(me, 'updateMeta');
|
||||||
|
|
Loading…
Reference in a new issue