MCPcopy Create free account
hub / github.com/nutsdb/nutsdb / TestHintFileIntegration_CrashRecovery

Function TestHintFileIntegration_CrashRecovery

hintfile_integration_test.go:387–443  ·  view source on GitHub ↗

TestHintFileIntegration_CrashRecovery tests database recovery after simulated crashes

(t *testing.T)

Source from the content-addressed store, hash-verified

385
386// TestHintFileIntegration_CrashRecovery tests database recovery after simulated crashes
387func TestHintFileIntegration_CrashRecovery(t *testing.T) {
388 if runtime.GOOS == "windows" {
389 t.Skip()
390 }
391 runForMergeModes(t, func(t *testing.T, mode mergeTestMode) {
392 bucket := "bucket"
393 opts := DefaultOptions
394 opts.SegmentSize = 64 * KB
395 opts.Dir = filepath.Join(t.TempDir(), fmt.Sprintf("test-hintfile-crash-%s", mode.name))
396 opts.EnableHintFile = true
397 opts.EnableMergeV2 = mode.enableMergeV2
398
399 removeDir(opts.Dir)
400
401 // Create database and write data
402 db, err := Open(opts)
403 require.NoError(t, err)
404 txCreateBucket(t, db, DataStructureBTree, bucket, nil)
405
406 n := 2000
407 for i := 0; i < n; i++ {
408 txPut(t, db, bucket, testutils.GetTestBytes(i), testutils.GetTestBytes(i), Persistent, nil, nil)
409 }
410
411 // Perform merge to create hint files
412 require.NoError(t, db.Merge())
413
414 // Simulate crash by not properly closing the database
415 // (just release resources without calling Close())
416 if err := db.ActiveFile.rwManager.Release(); err != nil {
417 t.Errorf("Failed to release rwManager: %v", err)
418 }
419 if err := db.fm.Close(); err != nil {
420 t.Errorf("Failed to close file manager: %v", err)
421 }
422 if err := db.flock.Unlock(); err != nil {
423 t.Errorf("Failed to unlock file lock: %v", err)
424 }
425
426 // Restart database (should handle incomplete shutdown gracefully)
427 db, err = Open(opts)
428 require.NoError(t, err)
429
430 // Verify all data is correctly recovered
431 for i := 0; i < n; i++ {
432 txGet(t, db, bucket, testutils.GetTestBytes(i), testutils.GetTestBytes(i), nil)
433 }
434
435 // Verify record count
436 dbCnt, err := db.getRecordCount()
437 require.NoError(t, err)
438 require.Equal(t, int64(n), dbCnt)
439
440 require.NoError(t, db.Close())
441 removeDir(opts.Dir)
442 })
443}
444

Callers

nothing calls this directly

Calls 12

GetTestBytesFunction · 0.92
runForMergeModesFunction · 0.85
removeDirFunction · 0.85
OpenFunction · 0.85
txCreateBucketFunction · 0.85
txPutFunction · 0.85
txGetFunction · 0.85
MergeMethod · 0.80
getRecordCountMethod · 0.80
SkipMethod · 0.65
ReleaseMethod · 0.65
CloseMethod · 0.65

Tested by

no test coverage detected