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

Function TestDB_HintFileCorruptedFallback

db_test.go:2309–2395  ·  view source on GitHub ↗
(t *testing.T)

Source from the content-addressed store, hash-verified

2307}
2308
2309func TestDB_HintFileCorruptedFallback(t *testing.T) {
2310 bucket := "bucket"
2311 opts := DefaultOptions
2312 opts.SegmentSize = KB
2313 opts.Dir = filepath.Join(t.TempDir(), "test-hintfile-corrupted")
2314 opts.EnableHintFile = true
2315
2316 // Clean the test directory at the start
2317 removeDir(opts.Dir)
2318
2319 // Create a database with some data
2320 db, err := Open(opts)
2321 require.NoError(t, err)
2322 txCreateBucket(t, db, DataStructureBTree, bucket, nil)
2323
2324 // Add some data
2325 n := 200
2326 for i := 0; i < n; i++ {
2327 txPut(t, db, bucket, testutils.GetTestBytes(i), testutils.GetTestBytes(i), Persistent, nil, nil)
2328 }
2329
2330 // Perform merge to create hint files
2331 require.NoError(t, db.Merge())
2332
2333 // Close the database
2334 require.NoError(t, db.Close())
2335
2336 // Corrupt hint files to simulate corrupted hint files
2337 // Wait a moment to ensure all files are properly written and flushed to disk
2338 time.Sleep(200 * time.Millisecond)
2339
2340 // Get file IDs and validate they exist before corruption
2341 fileIDs := enumerateDataFilesInDir(opts.Dir)
2342 require.NotEmpty(t, fileIDs, "Should have at least one data file after merge")
2343
2344 corruptedFiles := 0
2345 for _, fileID := range fileIDs {
2346 hintPath := getHintPath(fileID, opts.Dir)
2347
2348 // Check if hint file exists before corrupting it
2349 if stat, err := os.Stat(hintPath); err == nil {
2350 t.Logf("Found hint file %s (size: %d bytes)", hintPath, stat.Size())
2351
2352 // Verify file is readable before corruption
2353 if originalData, err := os.ReadFile(hintPath); err == nil {
2354 t.Logf("Original hint file size: %d bytes", len(originalData))
2355 require.Greater(t, len(originalData), 0, "Hint file should not be empty")
2356
2357 // Write garbage data to corrupt the file
2358 corruptionData := []byte{0xFF, 0xFF, 0xFF, 0xFD, 0xFE, 0xFF} // Different pattern
2359 err := os.WriteFile(hintPath, corruptionData, 0644)
2360 require.NoError(t, err)
2361
2362 // Verify corruption was successful
2363 if corruptedData, err := os.ReadFile(hintPath); err == nil {
2364 t.Logf("Corrupted hint file %s, new size: %d bytes", hintPath, len(corruptedData))
2365 require.NotEqual(t, originalData, corruptedData, "File should be corrupted")
2366 }

Callers

nothing calls this directly

Calls 12

GetTestBytesFunction · 0.92
removeDirFunction · 0.85
OpenFunction · 0.85
txCreateBucketFunction · 0.85
txPutFunction · 0.85
enumerateDataFilesInDirFunction · 0.85
getHintPathFunction · 0.85
txGetFunction · 0.85
MergeMethod · 0.80
getRecordCountMethod · 0.80
CloseMethod · 0.65
SizeMethod · 0.65

Tested by

no test coverage detected