1
0
Fork 0

Add explicit VACUUM stress test

master
Philip O'Toole 8 months ago
parent 7612f5e130
commit f74bfa8b5a

@ -1913,6 +1913,7 @@ func Test_SingleNodeExplicitVacuumOK(t *testing.T) {
}
doQuery := func() {
qr := queryRequestFromString("SELECT COUNT(*) FROM foo", false, true)
qr.Level = proto.QueryRequest_QUERY_REQUEST_LEVEL_STRONG
r, err := s.Query(qr)
if err != nil {
t.Fatalf("failed to query single node: %s", err.Error())
@ -1981,6 +1982,96 @@ func Test_SingleNodeExplicitVacuumOK(t *testing.T) {
doQuery()
}
func Test_SingleNodeExplicitVacuumOK_Stress(t *testing.T) {
s, ln := mustNewStore(t)
defer ln.Close()
s.SnapshotThreshold = 50
s.SnapshotInterval = 100 * time.Millisecond
s.AutoVacInterval = 1 * time.Hour
doVacuum := func() {
er := executeRequestFromString(`VACUUM`, false, false)
_, err := s.Execute(er)
if err != nil {
t.Fatalf("failed to execute on single node: %s", err.Error())
}
}
doQuery := func() {
qr := queryRequestFromString("SELECT COUNT(*) FROM foo", false, true)
qr.Level = proto.QueryRequest_QUERY_REQUEST_LEVEL_STRONG
r, err := s.Query(qr)
if err != nil {
t.Fatalf("failed to query single node: %s", err.Error())
}
if exp, got := `[{"columns":["COUNT(*)"],"types":["integer"],"values":[[2500]]}]`, asJSON(r); exp != got {
t.Fatalf("unexpected results for query\nexp: %s\ngot: %s", exp, got)
}
}
if err := s.Open(); err != nil {
t.Fatalf("failed to open single-node store: %s", err.Error())
}
defer s.Close(true)
if err := s.Bootstrap(NewServer(s.ID(), s.Addr(), true)); err != nil {
t.Fatalf("failed to bootstrap single-node store: %s", err.Error())
}
if _, err := s.WaitForLeader(10 * time.Second); err != nil {
t.Fatalf("Error waiting for leader: %s", err)
}
// Create a table
er := executeRequestFromString(`CREATE TABLE foo (id INTEGER NOT NULL PRIMARY KEY, name TEXT)`,
false, false)
_, err := s.Execute(er)
if err != nil {
t.Fatalf("failed to execute on single node: %s", err.Error())
}
// Insert a bunch of data concurrently, and do VACUUMs; putting some load on the Store.
var wg sync.WaitGroup
wg.Add(6)
insertFn := func() {
defer wg.Done()
for i := 0; i < 500; i++ {
_, err := s.Execute(executeRequestFromString(`INSERT INTO foo(name) VALUES("fiona")`, false, false))
if err != nil {
t.Errorf("failed to execute INSERT on single node: %s", err.Error())
}
}
}
for i := 0; i < 5; i++ {
go insertFn()
}
go func() {
defer wg.Done()
for i := 0; i < 10; i++ {
doVacuum()
time.Sleep(time.Second)
}
}()
wg.Wait()
if s.WaitForAllApplied(5*time.Second) != nil {
t.Fatalf("failed to wait for all data to be applied")
}
// Query the data, make sure it looks good after all this.
doQuery()
// Restart the Store, make sure it still works.
if err := s.Close(true); err != nil {
t.Fatalf("failed to close store: %s", err.Error())
}
if err := s.Open(); err != nil {
t.Fatalf("failed to open store: %s", err.Error())
}
defer s.Close(true)
if _, err := s.WaitForLeader(10 * time.Second); err != nil {
t.Fatalf("Error waiting for leader: %s", err)
}
doQuery()
}
// Test_SingleNode_SnapshotWithAutoVac tests that a Store correctly operates
// when performing both Snapshots and Auto-Vacuums.
func Test_SingleNode_SnapshotWithAutoVac(t *testing.T) {

Loading…
Cancel
Save