Files
Baradb/tests/stress_test.nim
T
dimgigov cd46edcb67
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
Bump version to 1.1.6; fix storage bugs, tests, CI pipeline and Docker config
Storage fixes:
- Fix bloom filter hash2 OverflowDefect (uint64 instead of int Hash)
- Fix MemTable.put size calculation on overwrite (was leaking size)
- Fix fuzz_test duplicate-key issues in LSM delete and SSTable tests

Test fixes:
- Fix stress_test.nim: replace deprecated threadpool with std/threads
- Fix fuzz_test.nim: add missing imports (tables, algorithm, sets)
- Fix fuzz_test.nim: var sst for close() compatibility
- Remove unused imports from test_all.nim and bench_all.nim

Docker / CI fixes:
- Fix Dockerfile.source: invalid nimlang/nim:2.2.10-alpine tag → 2.2.10 + ubuntu:24.04 runtime
- Fix Dockerfile.source healthcheck (--spider → -qO- for 200 OK)
- Fix Dockerfile run comment ports (9470/9471 → 9912/9913)
- Fix scripts/docker-run.sh healthcheck port (9470 → 9912)
- Add ARG BUILD_DATE/VCS_REF to Dockerfile for docker-build.sh
- Update all version strings 1.1.4 → 1.1.6 across nimble/docker/source/docs
2026-05-19 12:13:33 +03:00

92 lines
2.1 KiB
Nim

## Stress Test — parallel workloads against LSM-Tree
## Each worker gets its own LSMTree instance (thread-safe via internal locks).
import std/os
import std/random
import std/times
import std/monotimes
import barabadb/storage/lsm
const
NumWorkers = 10
OpsPerWorker = 1000
KeySpace = 500
type
WorkerArgs = tuple
workerId: int
dataDir: string
errors: ptr int
randomize()
proc runWorker(args: WorkerArgs) {.thread.} =
var db: LSMTree
var localErrors = 0
{.cast(gcsafe).}:
db = newLSMTree(args.dataDir)
for i in 0 ..< OpsPerWorker:
let op = rand(0 .. 2)
let key = "key_" & $args.workerId & "_" & $(rand(0 ..< KeySpace))
let value = cast[seq[byte]]("val_" & $i & "_" & $args.workerId)
case op
of 0:
db.put(key, value)
of 1:
let (found, val) = db.get(key)
if found:
if val != value and val.len > 0:
discard
of 2:
db.delete(key)
else:
discard
for k in 0 ..< KeySpace:
let key = "key_" & $args.workerId & "_" & $k
let (found, _) = db.get(key)
discard found
db.close()
args.errors[] = localErrors
proc main() =
let baseDir = "/tmp/baradb_stress_test"
removeDir(baseDir)
createDir(baseDir)
let start = getMonoTime()
var workerDirs: seq[string] = @[]
for i in 0 ..< NumWorkers:
workerDirs.add(baseDir / "worker_" & $i)
# Run workers in parallel using std/threads
var threadArr: array[NumWorkers, Thread[WorkerArgs]]
var errorCounts: array[NumWorkers, int]
for i in 0 ..< NumWorkers:
let args: WorkerArgs = (workerId: i, dataDir: workerDirs[i], errors: addr errorCounts[i])
createThread(threadArr[i], runWorker, args)
var totalErrors = 0
for i in 0 ..< NumWorkers:
joinThread(threadArr[i])
totalErrors += errorCounts[i]
let elapsed = (getMonoTime() - start).inMilliseconds
let totalOps = NumWorkers * OpsPerWorker
echo "Stress test completed: ", totalOps, " ops across ", NumWorkers, " workers"
echo "Time: ", elapsed, " ms"
echo "Throughput: ", float(totalOps) / (float(elapsed) / 1000.0), " ops/sec"
echo "Errors: ", totalErrors
if totalErrors > 0:
quit(1)
removeDir(baseDir)
main()