Files
peardata/test/store-hyperdb-fallback.test.js
T
Raven Scott 9bc7a67020
CI / test (push) Successful in 51s
Release rolling / release (push) Has been cancelled
updates
2026-07-18 19:04:39 -04:00

75 lines
2.0 KiB
JavaScript

/**
* M4 soak: query falls back to HyperDB warm after memory miss / "restart".
*/
import test from 'brittle'
import fs from 'fs'
import path from 'path'
import { fileURLToPath } from 'url'
import { MetricStore } from '../server/services/store.js'
import { openDb, closeDb, getDb } from '../server/db/index.js'
const __dirname = path.dirname(fileURLToPath(import.meta.url))
const TMP = path.join(__dirname, '..', 'tmp-store-hyperdb-test')
test('query uses hyperdb-warm when memory is empty', async (t) => {
fs.rmSync(TMP, { recursive: true, force: true })
process.env.PEARDATA_DATA_DIR = TMP
delete process.env.PEARDATA_HYPERDB
await closeDb().catch(() => {})
const db = await openDb()
t.ok(db)
const now = Date.now()
await db.putMetricPoints([
{
chart: 'system.cpu',
context: 'system.cpu',
ts: now - 120_000,
values: { user: 11, system: 4, nice: 0, iowait: 0, irq: 0, softirq: 0, idle: 85 },
tier: 1,
},
{
chart: 'system.cpu',
context: 'system.cpu',
ts: now - 60_000,
values: { user: 22, system: 5, nice: 0, iowait: 0, irq: 0, softirq: 0, idle: 73 },
tier: 1,
},
])
// Fresh memory store (simulates process restart with empty rings)
const store = new MetricStore()
const q = await store.query({
chart: 'system.cpu',
after: Math.floor((now - 180_000) / 1000),
before: Math.floor(now / 1000),
points: 60,
tier: 1,
})
t.absent(q.error)
t.is(q.source, 'hyperdb-warm')
t.ok(q.data.length >= 2)
await closeDb()
// Re-open same Corestore — warm points must still be queryable
const db2 = await openDb()
t.ok(db2)
t.is(getDb(), db2)
const store2 = new MetricStore()
const q2 = await store2.query({
chart: 'system.cpu',
after: Math.floor((now - 180_000) / 1000),
before: Math.floor(now / 1000),
points: 60,
tier: 1,
})
t.is(q2.source, 'hyperdb-warm')
t.ok(q2.data.length >= 2)
await closeDb()
fs.rmSync(TMP, { recursive: true, force: true })
delete process.env.PEARDATA_DATA_DIR
})