Merge branch 'import-script' into 'main'

Improve performance of import script

See merge request soapbox-pub/ditto!454
This commit is contained in:
Alex Gleason 2024-08-11 21:11:55 +00:00
commit e789e08c0f
2 changed files with 24 additions and 4 deletions

View file

@ -1,10 +1,13 @@
import { Semaphore } from '@lambdalisue/async';
import { NostrEvent } from '@nostrify/nostrify'; import { NostrEvent } from '@nostrify/nostrify';
import { JsonParseStream } from '@std/json/json-parse-stream'; import { JsonParseStream } from '@std/json/json-parse-stream';
import { TextLineStream } from '@std/streams/text-line-stream'; import { TextLineStream } from '@std/streams/text-line-stream';
import { Conf } from '@/config.ts';
import { Storages } from '@/storages.ts'; import { Storages } from '@/storages.ts';
const store = await Storages.db(); const store = await Storages.db();
const sem = new Semaphore(Conf.pg.poolSize);
console.warn('Importing events...'); console.warn('Importing events...');
@ -15,9 +18,26 @@ const readable = Deno.stdin.readable
.pipeThrough(new TextLineStream()) .pipeThrough(new TextLineStream())
.pipeThrough(new JsonParseStream()); .pipeThrough(new JsonParseStream());
for await (const event of readable) { for await (const line of readable) {
await store.event(event as unknown as NostrEvent); const event = line as unknown as NostrEvent;
count++;
while (sem.locked) {
await new Promise((resolve) => setTimeout(resolve, 0));
}
sem.lock(async () => {
try {
await store.event(event);
console.warn(`(${count}) Event<${event.kind}> ${event.id}`);
} catch (error) {
if (error.message.includes('violates unique constraint')) {
console.warn(`(${count}) Skipping existing event... ${event.id}`);
} else {
console.error(error);
}
}
count++;
});
} }
console.warn(`Imported ${count} events`); console.warn(`Imported ${count} events`);

View file

@ -235,7 +235,7 @@ class Conf {
static pg = { static pg = {
/** Number of connections to use in the pool. */ /** Number of connections to use in the pool. */
get poolSize(): number { get poolSize(): number {
return Number(Deno.env.get('PG_POOL_SIZE') ?? 10); return Number(Deno.env.get('PG_POOL_SIZE') ?? 20);
}, },
}; };
/** Whether to enable requesting events from known relays. */ /** Whether to enable requesting events from known relays. */