gopkg.in/rethinkdb/rethinkdb-go.v6@v6.2.2/internal/integration/tests/cluster_integration_test.go (about) 1 // +build cluster 2 // +build integration 3 4 package tests 5 6 import ( 7 "time" 8 9 test "gopkg.in/check.v1" 10 r "gopkg.in/rethinkdb/rethinkdb-go.v6" 11 "strconv" 12 "strings" 13 ) 14 15 func (s *RethinkSuite) TestClusterDetectNewNode(c *test.C) { 16 h1, p1 := splitAddress(url) 17 h2, p2 := splitAddress(url2) 18 hosts := []r.Host{r.NewHost(h1, p1), r.NewHost(h2, p2)} 19 20 cluster, err := r.NewCluster(hosts, &r.ConnectOpts{ 21 Addresses: []string{url, url2}, 22 DiscoverHosts: true, 23 NodeRefreshInterval: time.Second, 24 }) 25 c.Assert(err, test.IsNil) 26 27 t := time.NewTimer(time.Second * 30) 28 for { 29 select { 30 // Fail if deadline has passed 31 case <-t.C: 32 c.Fatal("No node was added to the cluster") 33 default: 34 // Pass if another node was added 35 if len(cluster.GetNodes()) >= 3 { 36 return 37 } 38 } 39 } 40 } 41 42 func (s *RethinkSuite) TestClusterRecoverAfterNoNodes(c *test.C) { 43 h1, p1 := splitAddress(url) 44 h2, p2 := splitAddress(url2) 45 hosts := []r.Host{r.NewHost(h1, p1), r.NewHost(h2, p2)} 46 47 cluster, err := r.NewCluster(hosts, &r.ConnectOpts{ 48 Addresses: []string{url, url2}, 49 DiscoverHosts: true, 50 NodeRefreshInterval: time.Second, 51 }) 52 c.Assert(err, test.IsNil) 53 54 t := time.NewTimer(time.Second * 30) 55 hasHadZeroNodes := false 56 for { 57 select { 58 // Fail if deadline has passed 59 case <-t.C: 60 c.Fatal("No node was added to the cluster") 61 default: 62 // Check if there are no nodes 63 if len(cluster.GetNodes()) == 0 { 64 hasHadZeroNodes = true 65 } 66 67 // Pass if another node was added 68 if len(cluster.GetNodes()) >= 1 && hasHadZeroNodes { 69 return 70 } 71 } 72 } 73 } 74 75 func (s *RethinkSuite) TestClusterNodeHealth(c *test.C) { 76 session, err := r.Connect(r.ConnectOpts{ 77 Addresses: []string{url1, url2, url3}, 78 DiscoverHosts: true, 79 NodeRefreshInterval: time.Second, 80 InitialCap: 50, 81 MaxOpen: 200, 82 }) 83 c.Assert(err, test.IsNil) 84 85 attempts := 0 86 failed := 0 87 seconds := 0 88 89 t := time.NewTimer(time.Second * 30) 90 tick := time.NewTicker(time.Second) 91 for { 92 select { 93 // Fail if deadline has passed 94 case <-tick.C: 95 seconds++ 96 c.Logf("%ds elapsed", seconds) 97 case <-t.C: 98 // Execute queries for 10s and check that at most 5% of the queries fail 99 c.Logf("%d of the %d(%d%%) queries failed", failed, attempts, (failed / attempts)) 100 c.Assert(failed <= 100, test.Equals, true) 101 return 102 default: 103 attempts++ 104 if err := r.Expr(1).Exec(session); err != nil { 105 c.Logf("Query failed, %s", err) 106 failed++ 107 } 108 } 109 } 110 } 111 112 func splitAddress(address string) (hostname string, port int) { 113 hostname = "localhost" 114 port = 28015 115 116 addrParts := strings.Split(address, ":") 117 118 if len(addrParts) >= 1 { 119 hostname = addrParts[0] 120 } 121 if len(addrParts) >= 2 { 122 port, _ = strconv.Atoi(addrParts[1]) 123 } 124 125 return 126 }