...

Source file src/github.com/go-redis/redis/sentinel_test.go

Documentation: github.com/go-redis/redis

     1  package redis_test
     2  
     3  import (
     4  	"github.com/go-redis/redis"
     5  
     6  	. "github.com/onsi/ginkgo"
     7  	. "github.com/onsi/gomega"
     8  )
     9  
    10  var _ = Describe("Sentinel", func() {
    11  	var client *redis.Client
    12  
    13  	BeforeEach(func() {
    14  		client = redis.NewFailoverClient(&redis.FailoverOptions{
    15  			MasterName:    sentinelName,
    16  			SentinelAddrs: []string{":" + sentinelPort},
    17  		})
    18  		Expect(client.FlushDB().Err()).NotTo(HaveOccurred())
    19  	})
    20  
    21  	AfterEach(func() {
    22  		Expect(client.Close()).NotTo(HaveOccurred())
    23  	})
    24  
    25  	It("should facilitate failover", func() {
    26  		// Set value on master.
    27  		err := client.Set("foo", "master", 0).Err()
    28  		Expect(err).NotTo(HaveOccurred())
    29  
    30  		// Verify.
    31  		val, err := sentinelMaster.Get("foo").Result()
    32  		Expect(err).NotTo(HaveOccurred())
    33  		Expect(val).To(Equal("master"))
    34  
    35  		// Create subscription.
    36  		ch := client.Subscribe("foo").Channel()
    37  
    38  		// Wait until replicated.
    39  		Eventually(func() string {
    40  			return sentinelSlave1.Get("foo").Val()
    41  		}, "1s", "100ms").Should(Equal("master"))
    42  		Eventually(func() string {
    43  			return sentinelSlave2.Get("foo").Val()
    44  		}, "1s", "100ms").Should(Equal("master"))
    45  
    46  		// Wait until slaves are picked up by sentinel.
    47  		Eventually(func() string {
    48  			return sentinel.Info().Val()
    49  		}, "10s", "100ms").Should(ContainSubstring("slaves=2"))
    50  
    51  		// Kill master.
    52  		sentinelMaster.Shutdown()
    53  		Eventually(func() error {
    54  			return sentinelMaster.Ping().Err()
    55  		}, "5s", "100ms").Should(HaveOccurred())
    56  
    57  		// Wait for Redis sentinel to elect new master.
    58  		Eventually(func() string {
    59  			return sentinelSlave1.Info().Val() + sentinelSlave2.Info().Val()
    60  		}, "30s", "1s").Should(ContainSubstring("role:master"))
    61  
    62  		// Check that client picked up new master.
    63  		Eventually(func() error {
    64  			return client.Get("foo").Err()
    65  		}, "5s", "100ms").ShouldNot(HaveOccurred())
    66  
    67  		// Publish message to check if subscription is renewed.
    68  		err = client.Publish("foo", "hello").Err()
    69  		Expect(err).NotTo(HaveOccurred())
    70  
    71  		var msg *redis.Message
    72  		Eventually(ch, "5s").Should(Receive(&msg))
    73  		Expect(msg.Channel).To(Equal("foo"))
    74  		Expect(msg.Payload).To(Equal("hello"))
    75  	})
    76  
    77  	It("supports DB selection", func() {
    78  		Expect(client.Close()).NotTo(HaveOccurred())
    79  
    80  		client = redis.NewFailoverClient(&redis.FailoverOptions{
    81  			MasterName:    sentinelName,
    82  			SentinelAddrs: []string{":" + sentinelPort},
    83  			DB:            1,
    84  		})
    85  		err := client.Ping().Err()
    86  		Expect(err).NotTo(HaveOccurred())
    87  	})
    88  })
    89  

View as plain text