// TestStoreRangeMergeStats starts by splitting a range, then writing random data // to both sides of the split. It then merges the ranges and verifies the merged // range has stats consistent with recomputations. func TestStoreRangeMergeStats(t *testing.T) { defer leaktest.AfterTest(t)() manual := hlc.NewManualClock(123) storeCfg := storage.TestStoreConfig(hlc.NewClock(manual.UnixNano, time.Nanosecond)) storeCfg.TestingKnobs.DisableSplitQueue = true store, stopper := createTestStoreWithConfig(t, storeCfg) defer stopper.Stop() // Split the range. aDesc, bDesc, pErr := createSplitRanges(store) if pErr != nil { t.Fatal(pErr) } // Write some values left and right of the proposed split key. writeRandomDataToRange(t, store, aDesc.RangeID, []byte("aaa")) writeRandomDataToRange(t, store, bDesc.RangeID, []byte("ccc")) // Get the range stats for both ranges now that we have data. snap := store.Engine().NewSnapshot() defer snap.Close() msA, err := engine.MVCCGetRangeStats(context.Background(), snap, aDesc.RangeID) if err != nil { t.Fatal(err) } msB, err := engine.MVCCGetRangeStats(context.Background(), snap, bDesc.RangeID) if err != nil { t.Fatal(err) } // Stats should agree with recomputation. if err := verifyRecomputedStats(snap, aDesc, msA, manual.UnixNano()); err != nil { t.Fatalf("failed to verify range A's stats before split: %v", err) } if err := verifyRecomputedStats(snap, bDesc, msB, manual.UnixNano()); err != nil { t.Fatalf("failed to verify range B's stats before split: %v", err) } manual.Increment(100) // Merge the b range back into the a range. args := adminMergeArgs(roachpb.KeyMin) if _, err := client.SendWrapped(context.Background(), rg1(store), &args); err != nil { t.Fatal(err) } replMerged := store.LookupReplica(aDesc.StartKey, nil) // Get the range stats for the merged range and verify. snap = store.Engine().NewSnapshot() defer snap.Close() msMerged, err := engine.MVCCGetRangeStats(context.Background(), snap, replMerged.RangeID) if err != nil { t.Fatal(err) } // Merged stats should agree with recomputation. if err := verifyRecomputedStats(snap, replMerged.Desc(), msMerged, manual.UnixNano()); err != nil { t.Errorf("failed to verify range's stats after merge: %v", err) } }
func TestRangeStatsInit(t *testing.T) { defer leaktest.AfterTest(t)() tc := testContext{} stopper := stop.NewStopper() defer stopper.Stop() tc.Start(t, stopper) ms := enginepb.MVCCStats{ LiveBytes: 1, KeyBytes: 2, ValBytes: 3, IntentBytes: 4, LiveCount: 5, KeyCount: 6, ValCount: 7, IntentCount: 8, IntentAge: 9, GCBytesAge: 10, LastUpdateNanos: 11, } if err := engine.MVCCSetRangeStats(context.Background(), tc.engine, 1, &ms); err != nil { t.Fatal(err) } loadMS, err := engine.MVCCGetRangeStats(context.Background(), tc.engine, tc.repl.RangeID) if err != nil { t.Fatal(err) } if !reflect.DeepEqual(ms, loadMS) { t.Errorf("mvcc stats mismatch %+v != %+v", ms, loadMS) } }
func loadMVCCStats( ctx context.Context, reader engine.Reader, rangeID roachpb.RangeID, ) (enginepb.MVCCStats, error) { return engine.MVCCGetRangeStats(ctx, reader, rangeID) }