channelz: rename NewChannelzStorage to NewChannelzStorageForTesting (#5190)

This commit is contained in:
Easwar Swaminathan 2022-02-09 14:14:44 -08:00 committed by GitHub
parent 0e055491d5
commit a354b1eec3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 74 additions and 67 deletions

View File

@ -126,7 +126,7 @@ func protoToSocketOption(skopts []*channelzpb.SocketOption) *channelz.SocketOpti
}
func (s) TestGetSocketOptions(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer cleanupWrapper(czCleanup, t)
ss := []*dummySocket{
{

View File

@ -322,7 +322,7 @@ func (s) TestGetTopChannels(t *testing.T) {
},
{},
}
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer cleanupWrapper(czCleanup, t)
for _, c := range tcs {
id := channelz.RegisterChannel(c, 0, "")
@ -371,7 +371,7 @@ func (s) TestGetServers(t *testing.T) {
lastCallStartedTimestamp: time.Now().UTC(),
},
}
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer cleanupWrapper(czCleanup, t)
for _, s := range ss {
id := channelz.RegisterServer(s, "")
@ -400,7 +400,7 @@ func (s) TestGetServers(t *testing.T) {
}
func (s) TestGetServerSockets(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer cleanupWrapper(czCleanup, t)
svrID := channelz.RegisterServer(&dummyServer{}, "")
defer channelz.RemoveEntry(svrID)
@ -441,7 +441,7 @@ func (s) TestGetServerSockets(t *testing.T) {
// This test makes a GetServerSockets with a non-zero start ID, and expect only
// sockets with ID >= the given start ID.
func (s) TestGetServerSocketsNonZeroStartID(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer cleanupWrapper(czCleanup, t)
svrID := channelz.RegisterServer(&dummyServer{}, "")
defer channelz.RemoveEntry(svrID)
@ -473,7 +473,7 @@ func (s) TestGetServerSocketsNonZeroStartID(t *testing.T) {
}
func (s) TestGetChannel(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer cleanupWrapper(czCleanup, t)
refNames := []string{"top channel 1", "nested channel 1", "sub channel 2", "nested channel 3"}
ids := make([]int64, 4)
@ -578,7 +578,7 @@ func (s) TestGetSubChannel(t *testing.T) {
subchanConnectivityChange = fmt.Sprintf("Subchannel Connectivity change to %v", connectivity.Ready)
subChanPickNewAddress = fmt.Sprintf("Subchannel picks a new address %q to connect", "0.0.0.0")
)
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer cleanupWrapper(czCleanup, t)
refNames := []string{"top channel 1", "sub channel 1", "socket 1", "socket 2"}
ids := make([]int64, 4)
@ -652,7 +652,7 @@ func (s) TestGetSubChannel(t *testing.T) {
}
func (s) TestGetSocket(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer cleanupWrapper(czCleanup, t)
ss := []*dummySocket{
{

View File

@ -24,6 +24,7 @@
package channelz
import (
"context"
"fmt"
"sort"
"sync"
@ -49,7 +50,8 @@ var (
// TurnOn turns on channelz data collection.
func TurnOn() {
if !IsOn() {
NewChannelzStorage()
db.set(newChannelMap())
idGen.reset()
atomic.StoreInt32(&curState, 1)
}
}
@ -94,46 +96,40 @@ func (d *dbWrapper) get() *channelMap {
return d.DB
}
// NewChannelzStorage initializes channelz data storage and id generator.
// NewChannelzStorageForTesting initializes channelz data storage and id
// generator for testing purposes.
//
// This function returns a cleanup function to wait for all channelz state to be reset by the
// grpc goroutines when those entities get closed. By using this cleanup function, we make sure tests
// don't mess up each other, i.e. lingering goroutine from previous test doing entity removal happen
// to remove some entity just register by the new test, since the id space is the same.
//
// Note: This function is exported for testing purpose only. User should not call
// it in most cases.
func NewChannelzStorage() (cleanup func() error) {
db.set(&channelMap{
topLevelChannels: make(map[int64]struct{}),
channels: make(map[int64]*channel),
listenSockets: make(map[int64]*listenSocket),
normalSockets: make(map[int64]*normalSocket),
servers: make(map[int64]*server),
subChannels: make(map[int64]*subChannel),
})
// Returns a cleanup function to be invoked by the test, which waits for up to
// 10s for all channelz state to be reset by the grpc goroutines when those
// entities get closed. This cleanup function helps with ensuring that tests
// don't mess up each other.
func NewChannelzStorageForTesting() (cleanup func() error) {
db.set(newChannelMap())
idGen.reset()
return func() error {
var err error
cm := db.get()
if cm == nil {
return nil
}
for i := 0; i < 1000; i++ {
cm.mu.Lock()
if len(cm.topLevelChannels) == 0 && len(cm.servers) == 0 && len(cm.channels) == 0 && len(cm.subChannels) == 0 && len(cm.listenSockets) == 0 && len(cm.normalSockets) == 0 {
cm.mu.Unlock()
// all things stored in the channelz map have been cleared.
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
ticker := time.NewTicker(10 * time.Millisecond)
defer ticker.Stop()
for {
cm.mu.RLock()
topLevelChannels, servers, channels, subChannels, listenSockets, normalSockets := len(cm.topLevelChannels), len(cm.servers), len(cm.channels), len(cm.subChannels), len(cm.listenSockets), len(cm.normalSockets)
cm.mu.RUnlock()
if err := ctx.Err(); err != nil {
return fmt.Errorf("after 10s the channelz map has not been cleaned up yet, topchannels: %d, servers: %d, channels: %d, subchannels: %d, listen sockets: %d, normal sockets: %d", topLevelChannels, servers, channels, subChannels, listenSockets, normalSockets)
}
if topLevelChannels == 0 && servers == 0 && channels == 0 && subChannels == 0 && listenSockets == 0 && normalSockets == 0 {
return nil
}
cm.mu.Unlock()
time.Sleep(10 * time.Millisecond)
<-ticker.C
}
cm.mu.Lock()
err = fmt.Errorf("after 10s the channelz map has not been cleaned up yet, topchannels: %d, servers: %d, channels: %d, subchannels: %d, listen sockets: %d, normal sockets: %d", len(cm.topLevelChannels), len(cm.servers), len(cm.channels), len(cm.subChannels), len(cm.listenSockets), len(cm.normalSockets))
cm.mu.Unlock()
return err
}
}
@ -326,6 +322,17 @@ type channelMap struct {
normalSockets map[int64]*normalSocket
}
func newChannelMap() *channelMap {
return &channelMap{
topLevelChannels: make(map[int64]struct{}),
channels: make(map[int64]*channel),
listenSockets: make(map[int64]*listenSocket),
normalSockets: make(map[int64]*normalSocket),
servers: make(map[int64]*server),
subChannels: make(map[int64]*subChannel),
}
}
func (c *channelMap) addServer(id int64, s *server) {
c.mu.Lock()
s.cm = c

View File

@ -38,7 +38,7 @@ func (s) TestCZSocketMetricsSocketOption(t *testing.T) {
}
func testCZSocketMetricsSocketOption(t *testing.T, e env) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
te := newTest(t, e)
te.startServer(&testServer{security: e.security})

View File

@ -82,7 +82,7 @@ func (s) TestCZServerRegistrationAndDeletion(t *testing.T) {
}
for _, c := range testcases {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -101,7 +101,7 @@ func (s) TestCZServerRegistrationAndDeletion(t *testing.T) {
}
func (s) TestCZGetServer(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -153,7 +153,7 @@ func (s) TestCZTopChannelRegistrationAndDeletion(t *testing.T) {
}
for _, c := range testcases {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -191,7 +191,7 @@ func (s) TestCZTopChannelRegistrationAndDeletion(t *testing.T) {
}
func (s) TestCZTopChannelRegistrationAndDeletionWhenDialFail(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
// Make dial fails (due to no transport security specified)
_, err := grpc.Dial("fake.addr")
@ -204,7 +204,7 @@ func (s) TestCZTopChannelRegistrationAndDeletionWhenDialFail(t *testing.T) {
}
func (s) TestCZNestedChannelRegistrationAndDeletion(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
// avoid calling API to set balancer type, which will void service config's change of balancer.
@ -248,7 +248,7 @@ func (s) TestCZNestedChannelRegistrationAndDeletion(t *testing.T) {
}
func (s) TestCZClientSubChannelSocketRegistrationAndDeletion(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
num := 3 // number of backends
@ -336,7 +336,7 @@ func (s) TestCZServerSocketRegistrationAndDeletion(t *testing.T) {
}
for _, c := range testcases {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -396,7 +396,7 @@ func (s) TestCZServerSocketRegistrationAndDeletion(t *testing.T) {
}
func (s) TestCZServerListenSocketDeletion(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
s := grpc.NewServer()
lis, err := net.Listen("tcp", "localhost:0")
@ -453,7 +453,7 @@ func (s) TestCZRecusivelyDeletionOfEntry(t *testing.T) {
// | |
// v v
// Socket1 Socket2
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
topChanID := channelz.RegisterChannel(&dummyChannel{}, 0, "")
subChanID1 := channelz.RegisterSubChannel(&dummyChannel{}, topChanID, "")
@ -498,7 +498,7 @@ func (s) TestCZRecusivelyDeletionOfEntry(t *testing.T) {
}
func (s) TestCZChannelMetrics(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
num := 3 // number of backends
@ -586,7 +586,7 @@ func (s) TestCZChannelMetrics(t *testing.T) {
}
func (s) TestCZServerMetrics(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -862,7 +862,7 @@ func doIdleCallToInvokeKeepAlive(tc testpb.TestServiceClient, t *testing.T) {
}
func (s) TestCZClientSocketMetricsStreamsAndMessagesCount(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -962,7 +962,7 @@ func (s) TestCZClientSocketMetricsStreamsAndMessagesCount(t *testing.T) {
// It is separated from other cases due to setup incompatibly, i.e. max receive
// size violation will mask flow control violation.
func (s) TestCZClientAndServerSocketMetricsStreamsCountFlowControlRSTStream(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -1046,7 +1046,7 @@ func (s) TestCZClientAndServerSocketMetricsStreamsCountFlowControlRSTStream(t *t
}
func (s) TestCZClientAndServerSocketMetricsFlowControl(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -1159,7 +1159,7 @@ func (s) TestCZClientAndServerSocketMetricsFlowControl(t *testing.T) {
}
func (s) TestCZClientSocketMetricsKeepAlive(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
defer func(t time.Duration) { internal.KeepaliveMinPingTime = t }(internal.KeepaliveMinPingTime)
internal.KeepaliveMinPingTime = time.Second
@ -1212,7 +1212,7 @@ func (s) TestCZClientSocketMetricsKeepAlive(t *testing.T) {
}
func (s) TestCZServerSocketMetricsStreamsAndMessagesCount(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -1273,7 +1273,7 @@ func (s) TestCZServerSocketMetricsStreamsAndMessagesCount(t *testing.T) {
}
func (s) TestCZServerSocketMetricsKeepAlive(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -1345,7 +1345,7 @@ var cipherSuites = []string{
}
func (s) TestCZSocketGetSecurityValueTLS(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpTLSRREnv
te := newTest(t, e)
@ -1395,7 +1395,7 @@ func (s) TestCZSocketGetSecurityValueTLS(t *testing.T) {
}
func (s) TestCZChannelTraceCreationDeletion(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
// avoid calling API to set balancer type, which will void service config's change of balancer.
@ -1470,7 +1470,7 @@ func (s) TestCZChannelTraceCreationDeletion(t *testing.T) {
}
func (s) TestCZSubChannelTraceCreationDeletion(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -1562,7 +1562,7 @@ func (s) TestCZSubChannelTraceCreationDeletion(t *testing.T) {
}
func (s) TestCZChannelAddressResolutionChange(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
e.balancer = ""
@ -1665,7 +1665,7 @@ func (s) TestCZChannelAddressResolutionChange(t *testing.T) {
}
func (s) TestCZSubChannelPickedNewAddress(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
e.balancer = ""
@ -1739,7 +1739,7 @@ func (s) TestCZSubChannelPickedNewAddress(t *testing.T) {
}
func (s) TestCZSubChannelConnectivityState(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -1833,7 +1833,7 @@ func (s) TestCZSubChannelConnectivityState(t *testing.T) {
}
func (s) TestCZChannelConnectivityState(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -1889,7 +1889,7 @@ func (s) TestCZChannelConnectivityState(t *testing.T) {
}
func (s) TestCZTraceOverwriteChannelDeletion(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
// avoid newTest using WithBalancerName, which would override service
@ -1954,7 +1954,7 @@ func (s) TestCZTraceOverwriteChannelDeletion(t *testing.T) {
}
func (s) TestCZTraceOverwriteSubChannelDeletion(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)
@ -2014,7 +2014,7 @@ func (s) TestCZTraceOverwriteSubChannelDeletion(t *testing.T) {
}
func (s) TestCZTraceTopChannelDeletionTraceClear(t *testing.T) {
czCleanup := channelz.NewChannelzStorage()
czCleanup := channelz.NewChannelzStorageForTesting()
defer czCleanupWrapper(czCleanup, t)
e := tcpClearRREnv
te := newTest(t, e)