server_utils.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package tests
  2. import (
  3. "io/ioutil"
  4. "net/http"
  5. "os"
  6. "time"
  7. "github.com/coreos/etcd/third_party/github.com/coreos/raft"
  8. "github.com/coreos/etcd/metrics"
  9. "github.com/coreos/etcd/server"
  10. "github.com/coreos/etcd/store"
  11. )
  12. const (
  13. testName = "ETCDTEST"
  14. testClientURL = "localhost:4401"
  15. testRaftURL = "localhost:7701"
  16. testSnapshotCount = 10000
  17. testHeartbeatTimeout = time.Duration(50) * time.Millisecond
  18. testElectionTimeout = time.Duration(200) * time.Millisecond
  19. )
  20. // Starts a server in a temporary directory.
  21. func RunServer(f func(*server.Server)) {
  22. path, _ := ioutil.TempDir("", "etcd-")
  23. defer os.RemoveAll(path)
  24. store := store.New()
  25. registry := server.NewRegistry(store)
  26. serverStats := server.NewRaftServerStats(testName)
  27. followersStats := server.NewRaftFollowersStats(testName)
  28. psConfig := server.PeerServerConfig{
  29. Name: testName,
  30. URL: "http://" + testRaftURL,
  31. Scheme: "http",
  32. SnapshotCount: testSnapshotCount,
  33. MaxClusterSize: 9,
  34. }
  35. mb := metrics.NewBucket("")
  36. ps := server.NewPeerServer(psConfig, registry, store, &mb, followersStats, serverStats)
  37. psListener, err := server.NewListener(testRaftURL)
  38. if err != nil {
  39. panic(err)
  40. }
  41. // Create Raft transporter and server
  42. dialTimeout := (3 * testHeartbeatTimeout) + testElectionTimeout
  43. responseHeaderTimeout := (3 * testHeartbeatTimeout) + testElectionTimeout
  44. raftTransporter := server.NewTransporter(followersStats, serverStats, registry, testHeartbeatTimeout, dialTimeout, responseHeaderTimeout)
  45. raftServer, err := raft.NewServer(testName, path, raftTransporter, store, ps, "")
  46. if err != nil {
  47. panic(err)
  48. }
  49. raftServer.SetElectionTimeout(testElectionTimeout)
  50. raftServer.SetHeartbeatTimeout(testHeartbeatTimeout)
  51. ps.SetRaftServer(raftServer)
  52. s := server.New(testName, "http://"+testClientURL, ps, registry, store, nil)
  53. sListener, err := server.NewListener(testClientURL)
  54. if err != nil {
  55. panic(err)
  56. }
  57. ps.SetServer(s)
  58. // Start up peer server.
  59. c := make(chan bool)
  60. go func() {
  61. c <- true
  62. ps.Start(false, []string{})
  63. http.Serve(psListener, ps.HTTPHandler())
  64. }()
  65. <-c
  66. // Start up etcd server.
  67. go func() {
  68. c <- true
  69. http.Serve(sListener, s.HTTPHandler())
  70. }()
  71. <-c
  72. // Wait to make sure servers have started.
  73. time.Sleep(50 * time.Millisecond)
  74. // Execute the function passed in.
  75. f(s)
  76. // Clean up servers.
  77. ps.Stop()
  78. psListener.Close()
  79. sListener.Close()
  80. }