Files
Baradb/tests/stress_test.nim
dimgigov 651375a156 feat: production hardening — JWT security, WAL reader, tracing, 2PC real RPC, stress test fix
- JWT: getEffectiveJwtSecret() helper + warning log when not configured
- WAL: readEntries() with timestamp filter for PITR
- Tracing: core/tracing.nim with span recording + executeQuery integration
- 2PC: real TCP RPC via sendDistTxnRpc (host='' = local fallback)
- Stress test: updated comment, 10K ops confirmed with internal locks
- SSTable metadata comments clarified (offsets patched correctly)
- addParticipant has default params (host='', port=0)
2026-05-07 13:31:29 +03:00

83 lines
1.9 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/strutils
import std/times
import std/monotimes
import std/sequtils
import std/threadpool
import barabadb/storage/lsm
const
NumWorkers = 10
OpsPerWorker = 1000
KeySpace = 500
randomize()
proc runWorker(workerId: int, dataDir: string): int =
var db = newLSMTree(dataDir)
var errors = 0
for i in 0 ..< OpsPerWorker:
let op = rand(0 .. 2)
let key = "key_" & $workerId & "_" & $(rand(0 ..< KeySpace))
let value = cast[seq[byte]]("val_" & $i & "_" & $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_" & $workerId & "_" & $k
let (found, _) = db.get(key)
discard found
db.close()
return errors
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 threadpool
var futures: seq[FlowVar[int]] = @[]
for i in 0 ..< NumWorkers:
futures.add(spawn runWorker(i, workerDirs[i]))
var totalErrors = 0
for f in futures:
totalErrors += ^f
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()