Live video on the AT Protocol
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}