diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:36:04 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-28 12:36:04 +0000 |
commit | b09c6d56832eb1718c07d74abf3bc6ae3fe4e030 (patch) | |
tree | d2caec2610d4ea887803ec9e9c3cd77136c448ba /dependencies/pkg/mod/github.com/go-redis/redis/v8@v8.11.5/pool_test.go | |
parent | Initial commit. (diff) | |
download | icingadb-b09c6d56832eb1718c07d74abf3bc6ae3fe4e030.tar.xz icingadb-b09c6d56832eb1718c07d74abf3bc6ae3fe4e030.zip |
Adding upstream version 1.1.0.upstream/1.1.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | dependencies/pkg/mod/github.com/go-redis/redis/v8@v8.11.5/pool_test.go | 157 |
1 files changed, 157 insertions, 0 deletions
diff --git a/dependencies/pkg/mod/github.com/go-redis/redis/v8@v8.11.5/pool_test.go b/dependencies/pkg/mod/github.com/go-redis/redis/v8@v8.11.5/pool_test.go new file mode 100644 index 0000000..dbef72e --- /dev/null +++ b/dependencies/pkg/mod/github.com/go-redis/redis/v8@v8.11.5/pool_test.go @@ -0,0 +1,157 @@ +package redis_test + +import ( + "context" + "time" + + . "github.com/onsi/ginkgo" + . "github.com/onsi/gomega" + + "github.com/go-redis/redis/v8" +) + +var _ = Describe("pool", func() { + var client *redis.Client + + BeforeEach(func() { + opt := redisOptions() + opt.MinIdleConns = 0 + opt.MaxConnAge = 0 + opt.IdleTimeout = time.Second + client = redis.NewClient(opt) + }) + + AfterEach(func() { + Expect(client.Close()).NotTo(HaveOccurred()) + }) + + It("respects max size", func() { + perform(1000, func(id int) { + val, err := client.Ping(ctx).Result() + Expect(err).NotTo(HaveOccurred()) + Expect(val).To(Equal("PONG")) + }) + + pool := client.Pool() + Expect(pool.Len()).To(BeNumerically("<=", 10)) + Expect(pool.IdleLen()).To(BeNumerically("<=", 10)) + Expect(pool.Len()).To(Equal(pool.IdleLen())) + }) + + It("respects max size on multi", func() { + perform(1000, func(id int) { + var ping *redis.StatusCmd + + err := client.Watch(ctx, func(tx *redis.Tx) error { + cmds, err := tx.Pipelined(ctx, func(pipe redis.Pipeliner) error { + ping = pipe.Ping(ctx) + return nil + }) + Expect(err).NotTo(HaveOccurred()) + Expect(cmds).To(HaveLen(1)) + return err + }) + Expect(err).NotTo(HaveOccurred()) + + Expect(ping.Err()).NotTo(HaveOccurred()) + Expect(ping.Val()).To(Equal("PONG")) + }) + + pool := client.Pool() + Expect(pool.Len()).To(BeNumerically("<=", 10)) + Expect(pool.IdleLen()).To(BeNumerically("<=", 10)) + Expect(pool.Len()).To(Equal(pool.IdleLen())) + }) + + It("respects max size on pipelines", func() { + perform(1000, func(id int) { + pipe := client.Pipeline() + ping := pipe.Ping(ctx) + cmds, err := pipe.Exec(ctx) + Expect(err).NotTo(HaveOccurred()) + Expect(cmds).To(HaveLen(1)) + Expect(ping.Err()).NotTo(HaveOccurred()) + Expect(ping.Val()).To(Equal("PONG")) + Expect(pipe.Close()).NotTo(HaveOccurred()) + }) + + pool := client.Pool() + Expect(pool.Len()).To(BeNumerically("<=", 10)) + Expect(pool.IdleLen()).To(BeNumerically("<=", 10)) + Expect(pool.Len()).To(Equal(pool.IdleLen())) + }) + + It("removes broken connections", func() { + cn, err := client.Pool().Get(context.Background()) + Expect(err).NotTo(HaveOccurred()) + cn.SetNetConn(&badConn{}) + client.Pool().Put(ctx, cn) + + err = client.Ping(ctx).Err() + Expect(err).To(MatchError("bad connection")) + + val, err := client.Ping(ctx).Result() + Expect(err).NotTo(HaveOccurred()) + Expect(val).To(Equal("PONG")) + + pool := client.Pool() + Expect(pool.Len()).To(Equal(1)) + Expect(pool.IdleLen()).To(Equal(1)) + + stats := pool.Stats() + Expect(stats.Hits).To(Equal(uint32(1))) + Expect(stats.Misses).To(Equal(uint32(2))) + Expect(stats.Timeouts).To(Equal(uint32(0))) + }) + + It("reuses connections", func() { + // explain: https://github.com/go-redis/redis/pull/1675 + opt := redisOptions() + opt.MinIdleConns = 0 + opt.MaxConnAge = 0 + opt.IdleTimeout = 2 * time.Second + client = redis.NewClient(opt) + + for i := 0; i < 100; i++ { + val, err := client.Ping(ctx).Result() + Expect(err).NotTo(HaveOccurred()) + Expect(val).To(Equal("PONG")) + } + + pool := client.Pool() + Expect(pool.Len()).To(Equal(1)) + Expect(pool.IdleLen()).To(Equal(1)) + + stats := pool.Stats() + Expect(stats.Hits).To(Equal(uint32(99))) + Expect(stats.Misses).To(Equal(uint32(1))) + Expect(stats.Timeouts).To(Equal(uint32(0))) + }) + + It("removes idle connections", func() { + err := client.Ping(ctx).Err() + Expect(err).NotTo(HaveOccurred()) + + stats := client.PoolStats() + Expect(stats).To(Equal(&redis.PoolStats{ + Hits: 0, + Misses: 1, + Timeouts: 0, + TotalConns: 1, + IdleConns: 1, + StaleConns: 0, + })) + + time.Sleep(2 * time.Second) + + stats = client.PoolStats() + Expect(stats).To(Equal(&redis.PoolStats{ + Hits: 0, + Misses: 1, + Timeouts: 0, + TotalConns: 0, + IdleConns: 0, + StaleConns: 1, + })) + }) +}) |