TestHintFileIntegration_CrashRecovery tests database recovery after simulated crashes
(t *testing.T)
| 385 | |
| 386 | // TestHintFileIntegration_CrashRecovery tests database recovery after simulated crashes |
| 387 | func 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 |
nothing calls this directly
no test coverage detected