github.com/mattermost/mattermost-plugin-api@v0.1.4/cluster/job_once_mem_test.go (about) 1 // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. 2 // See LICENSE.txt for license information. 3 4 package cluster 5 6 import ( 7 "fmt" 8 "runtime" 9 "sync/atomic" 10 "testing" 11 "time" 12 13 "github.com/mattermost/mattermost-server/v6/model" 14 "github.com/stretchr/testify/assert" 15 "github.com/stretchr/testify/require" 16 ) 17 18 func TestMemFootprint(t *testing.T) { 19 var memConsumed = func() uint64 { 20 runtime.GC() 21 var s runtime.MemStats 22 runtime.ReadMemStats(&s) 23 return s.Sys 24 } 25 26 t.Run("average k per jobOnce", func(t *testing.T) { 27 t.SkipNow() 28 29 makeKey := model.NewId 30 31 numJobs := 100000 32 jobs := make(map[string]*int32, numJobs) 33 for i := 0; i < numJobs; i++ { 34 jobs[makeKey()] = new(int32) 35 } 36 37 callback := func(key string, _ any) { 38 count, ok := jobs[key] 39 if ok { 40 atomic.AddInt32(count, 1) 41 } 42 } 43 44 mockPluginAPI := newMockPluginAPI(t) 45 s := GetJobOnceScheduler(mockPluginAPI) 46 err := s.SetCallback(callback) 47 require.NoError(t, err) 48 err = s.Start() 49 require.NoError(t, err) 50 51 getVal := func(key string) []byte { 52 data, _ := s.pluginAPI.KVGet(key) 53 return data 54 } 55 56 before := memConsumed() 57 58 for k := range jobs { 59 assert.Empty(t, getVal(oncePrefix+k)) 60 _, err = s.ScheduleOnce(k, time.Now().Add(5*time.Minute), nil) 61 require.NoError(t, err) 62 assert.NotEmpty(t, getVal(oncePrefix+k)) 63 } 64 65 time.Sleep(10 * time.Second) 66 67 // Everything scheduled now: 68 s.activeJobs.mu.RLock() 69 assert.Equal(t, numJobs, len(s.activeJobs.jobs)) 70 s.activeJobs.mu.RUnlock() 71 list, err := s.ListScheduledJobs() 72 require.NoError(t, err) 73 assert.Equal(t, numJobs, len(list)) 74 75 after := memConsumed() 76 77 fmt.Printf("\nthe %d jobs, scheduler, and goroutines require: %.2fmB memory, or %.3fkB each job\n", 78 numJobs, 79 float64(after-before)/(1024*1024), 80 (float64(after-before)/float64(numJobs))/1024) 81 }) 82 }