Live video on the AT Protocol
at v0.9.2 66 lines 1.4 kB view raw
1package model 2 3import ( 4 "fmt" 5 "sync" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/require" 10 "stream.place/streamplace/pkg/config" 11) 12 13func TestSegmentPerf(t *testing.T) { 14 config.DisableSQLLogging() 15 // dburl := filepath.Join(t.TempDir(), "test.db") 16 db, err := MakeDB(":memory:") 17 require.NoError(t, err) 18 // Create a model instance 19 model := db.(*DBModel) 20 t.Cleanup(func() { 21 // os.Remove(dburl) 22 }) 23 24 // Create a repo for testing 25 repo := &Repo{ 26 DID: "did:plc:test123", 27 } 28 err = model.DB.Create(repo).Error 29 require.NoError(t, err) 30 31 defer config.EnableSQLLogging() 32 // Create 250000 segments with timestamps 1 hour ago, each one second apart 33 wg := sync.WaitGroup{} 34 segCount := 250000 35 wg.Add(segCount) 36 baseTime := time.Now() 37 for i := 0; i < segCount; i++ { 38 segment := &Segment{ 39 ID: fmt.Sprintf("segment-%d", i), 40 RepoDID: repo.DID, 41 StartTime: baseTime.Add(-time.Duration(i) * time.Second).UTC(), 42 } 43 go func() { 44 defer wg.Done() 45 err = model.DB.Create(segment).Error 46 require.NoError(t, err) 47 }() 48 } 49 wg.Wait() 50 51 startTime := time.Now() 52 wg = sync.WaitGroup{} 53 runs := 1000 54 wg.Add(runs) 55 for i := 0; i < runs; i++ { 56 go func() { 57 defer wg.Done() 58 _, err := model.MostRecentSegments() 59 require.NoError(t, err) 60 // require.Len(t, segments, 1) 61 }() 62 } 63 wg.Wait() 64 fmt.Printf("Time taken: %s\n", time.Since(startTime)) 65 require.Less(t, time.Since(startTime), 10*time.Second) 66}