Path: blob/master/src/packages/file-server/btrfs/test/subvolume-stress.test.ts
1543 views
import { before, after, fs } from "./setup";1import { mkdir, writeFile } from "fs/promises";2import { join } from "path";3import { type Subvolume } from "../subvolume";45const DEBUG = false;6const log = DEBUG ? console.log : (..._args) => {};78const numSnapshots = 25;9const numFiles = 1000;1011beforeAll(before);1213describe(`stress test creating ${numSnapshots} snapshots`, () => {14let vol: Subvolume;15it("creates a volume and write a file to it", async () => {16vol = await fs.subvolumes.get("stress");17});1819it(`create file and snapshot the volume ${numSnapshots} times`, async () => {20const snaps: string[] = [];21const start = Date.now();22for (let i = 0; i < numSnapshots; i++) {23await writeFile(join(vol.path, `${i}.txt`), "world");24await vol.snapshots.create(`snap${i}`);25snaps.push(`snap${i}`);26}27log(28`created ${Math.round((numSnapshots / (Date.now() - start)) * 1000)} snapshots per second in serial`,29);30snaps.sort();31expect((await vol.snapshots.ls()).map(({ name }) => name).sort()).toEqual(32snaps.sort(),33);34});3536it(`delete our ${numSnapshots} snapshots`, async () => {37for (let i = 0; i < numSnapshots; i++) {38await vol.snapshots.delete(`snap${i}`);39}40expect(await vol.snapshots.ls()).toEqual([]);41});42});4344describe(`create ${numFiles} files`, () => {45let vol: Subvolume;46it("creates a volume", async () => {47vol = await fs.subvolumes.get("many-files");48});4950it(`creates ${numFiles} files`, async () => {51const names: string[] = [];52const start = Date.now();53for (let i = 0; i < numFiles; i++) {54await writeFile(join(vol.path, `${i}`), "world");55names.push(`${i}`);56}57log(58`created ${Math.round((numFiles / (Date.now() - start)) * 1000)} files per second in serial`,59);60const v = await vol.fs.ls("");61const w = v.map(({ name }) => name);62expect(w.sort()).toEqual(names.sort());63});6465it(`creates ${numFiles} files in parallel`, async () => {66await mkdir(join(vol.path, "p"));67const names: string[] = [];68const start = Date.now();69const z: any[] = [];70for (let i = 0; i < numFiles; i++) {71z.push(writeFile(join(vol.path, `p/${i}`), "world"));72names.push(`${i}`);73}74await Promise.all(z);75log(76`created ${Math.round((numFiles / (Date.now() - start)) * 1000)} files per second in parallel`,77);78const t0 = Date.now();79const v = await vol.fs.ls("p");80log("get listing of files took", Date.now() - t0, "ms");81const w = v.map(({ name }) => name);82expect(w.sort()).toEqual(names.sort());83});84});8586afterAll(after);878889