Files
Zach LeslieandGitHub fa0116ca8e Update dskit and grpc (#3096)
* Update grafana/dskit and google/grpc

* Updates for dskit usage

* Update serverless go.mod

* Avoid localhost name lookup in memberlist test

* Update serverless go.mod for grpc
2023-10-31 20:58:19 +00:00

103 lines
2.5 KiB
Go

package usagestats
import (
"context"
"fmt"
"os"
"testing"
"time"
"github.com/go-kit/log"
"github.com/grafana/dskit/flagext"
"github.com/grafana/dskit/kv"
"github.com/grafana/dskit/kv/codec"
"github.com/grafana/dskit/kv/memberlist"
"github.com/grafana/dskit/services"
"github.com/stretchr/testify/require"
"github.com/grafana/tempo/tempodb/backend/local"
)
type dnsProviderMock struct {
resolved []string
}
func (p *dnsProviderMock) Resolve(_ context.Context, addrs []string) error {
p.resolved = addrs
return nil
}
func (p dnsProviderMock) Addresses() []string {
return p.resolved
}
func createMemberlist(t *testing.T, port, memberID int) *memberlist.KV {
t.Helper()
var cfg memberlist.KVConfig
flagext.DefaultValues(&cfg)
cfg.TCPTransport = memberlist.TCPTransportConfig{
BindAddrs: []string{"127.0.0.1"},
BindPort: 0,
}
cfg.GossipInterval = 100 * time.Millisecond
cfg.GossipNodes = 3
cfg.PushPullInterval = 5 * time.Second
cfg.NodeName = fmt.Sprintf("Member-%d", memberID)
cfg.Codecs = []codec.Codec{JSONCodec}
mkv := memberlist.NewKV(cfg, log.NewNopLogger(), &dnsProviderMock{}, nil)
require.NoError(t, services.StartAndAwaitRunning(context.Background(), mkv))
if port != 0 {
_, err := mkv.JoinMembers([]string{fmt.Sprintf("127.0.0.1:%d", port)})
require.NoError(t, err, "%s failed to join the cluster: %v", memberID, err)
}
t.Cleanup(func() {
_ = services.StopAndAwaitTerminated(context.TODO(), mkv)
})
return mkv
}
func Test_Memberlist(t *testing.T) {
stabilityCheckInterval = time.Second
objectClient, err := local.NewBackend(&local.Config{
Path: t.TempDir(),
})
require.NoError(t, err)
result := make(chan *ClusterSeed, 10)
// create a first memberlist to get a valid listening port.
initMKV := createMemberlist(t, 0, -1)
for i := 0; i < 10; i++ {
go func(j int) {
leader, err := NewReporter(Config{
Leader: true,
Enabled: true,
}, kv.Config{
Store: "memberlist",
StoreConfig: kv.StoreConfig{
MemberlistKV: func() (*memberlist.KV, error) {
return createMemberlist(t, initMKV.GetListeningPort(), j), nil
},
},
}, objectClient, objectClient, log.NewLogfmtLogger(os.Stdout), nil)
require.NoError(t, err)
leader.init(context.Background())
result <- leader.cluster
}(i)
}
var UID []string
for i := 0; i < 10; i++ {
cluster := <-result
require.NotNil(t, cluster)
UID = append(UID, cluster.UID)
}
first := UID[0]
for _, uid := range UID {
require.Equal(t, first, uid)
}
}