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  }