mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-11-10 16:46:06 -08:00
perf(stats): use compressed incremental snapshot transfers (#241)
This commit is contained in:
1 parent
614a8ca912
commit
fb2d1a512b
17 files changed
+748
-25
No files matched your search
@@ -0,0 +1,59 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import fs from 'node:fs';
|
||||
import os from 'node:os';
|
||||
import path from 'node:path';
|
||||
import { createTransferCache, transferCacheKey } from './transfer-cache';
|
||||
|
||||
test('transfer cache isolates peers and active transfers while replacing previous snapshots', () => {
|
||||
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'subminer-cache-test-'));
|
||||
try {
|
||||
const cacheDir = path.join(root, 'cache');
|
||||
const cache = createTransferCache(cacheDir);
|
||||
const key = transferCacheKey('peer');
|
||||
const first = path.join(root, 'first');
|
||||
fs.mkdirSync(path.join(first, 'incoming'), { recursive: true });
|
||||
const incoming = path.join(first, 'incoming', 'snapshot.sqlite');
|
||||
fs.writeFileSync(incoming, 'first received snapshot');
|
||||
cache.remember(key, first);
|
||||
const second = path.join(root, 'second');
|
||||
cache.seed(key, second);
|
||||
fs.writeFileSync(incoming, 'next received snapshot');
|
||||
cache.remember(key, first);
|
||||
assert.equal(
|
||||
fs.readFileSync(path.join(second, 'incoming', 'snapshot.sqlite'), 'utf8'),
|
||||
'first received snapshot',
|
||||
);
|
||||
const third = path.join(root, 'third');
|
||||
cache.seed(key, third);
|
||||
assert.equal(
|
||||
fs.readFileSync(path.join(third, 'incoming', 'snapshot.sqlite'), 'utf8'),
|
||||
'next received snapshot',
|
||||
);
|
||||
assert.deepEqual(fs.readdirSync(cacheDir), [`${key}.sqlite`]);
|
||||
const other = path.join(root, 'other');
|
||||
cache.seed(transferCacheKey('other peer'), other);
|
||||
assert.equal(fs.existsSync(path.join(other, 'incoming', 'snapshot.sqlite')), false);
|
||||
assert.throws(() => cache.seed('../outside', other), /Invalid/);
|
||||
assert.throws(() => cache.remember('../outside', first), /Invalid/);
|
||||
} finally {
|
||||
fs.rmSync(root, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
|
||||
test('unavailable cache storage and missing incoming snapshots do not prevent sync', () => {
|
||||
const root = fs.mkdtempSync(path.join(os.tmpdir(), 'subminer-cache-test-'));
|
||||
try {
|
||||
const unavailable = path.join(root, 'file');
|
||||
fs.writeFileSync(unavailable, 'not a directory');
|
||||
const cache = createTransferCache(unavailable);
|
||||
const key = transferCacheKey('peer');
|
||||
const temp = path.join(root, 'transfer');
|
||||
assert.doesNotThrow(() => cache.seed(key, temp));
|
||||
assert.doesNotThrow(() => cache.remember(key, temp));
|
||||
fs.writeFileSync(path.join(temp, 'incoming', 'snapshot.sqlite'), 'received');
|
||||
assert.doesNotThrow(() => cache.remember(key, temp));
|
||||
} finally {
|
||||
fs.rmSync(root, { recursive: true, force: true });
|
||||
}
|
||||
});
|
||||
Reference in new issue
Block a user