server: move TestMultiNodeKillOne to etcd/
parent
a0fbc289ec
commit
215820dd40
|
@ -26,6 +26,8 @@ import (
|
||||||
|
|
||||||
"github.com/coreos/etcd/config"
|
"github.com/coreos/etcd/config"
|
||||||
"github.com/coreos/etcd/store"
|
"github.com/coreos/etcd/store"
|
||||||
|
|
||||||
|
"github.com/coreos/etcd/third_party/github.com/coreos/go-etcd/etcd"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestKillLeader(t *testing.T) {
|
func TestKillLeader(t *testing.T) {
|
||||||
|
@ -57,7 +59,7 @@ func TestKillLeader(t *testing.T) {
|
||||||
id := es[lead].id
|
id := es[lead].id
|
||||||
e, h, err := buildServer(t, c, id)
|
e, h, err := buildServer(t, c, id)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal("#%d.%d: %v", i, j, err)
|
t.Fatalf("#%d.%d: %v", i, j, err)
|
||||||
}
|
}
|
||||||
es[lead] = e
|
es[lead] = e
|
||||||
hs[lead] = h
|
hs[lead] = h
|
||||||
|
@ -180,6 +182,41 @@ func TestClusterConfigReload(t *testing.T) {
|
||||||
afterTest(t)
|
afterTest(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestMultiNodeKillOne(t *testing.T) {
|
||||||
|
tests := []int{5}
|
||||||
|
|
||||||
|
for i, tt := range tests {
|
||||||
|
es, hs := buildCluster(tt, false)
|
||||||
|
waitCluster(t, es)
|
||||||
|
|
||||||
|
stop := make(chan bool)
|
||||||
|
go keepSetting(hs[0].URL, stop)
|
||||||
|
|
||||||
|
for j := 0; j < 10; j++ {
|
||||||
|
idx := rand.Int() % tt
|
||||||
|
es[idx].Stop()
|
||||||
|
hs[idx].Close()
|
||||||
|
|
||||||
|
c := config.New()
|
||||||
|
c.DataDir = es[idx].config.DataDir
|
||||||
|
c.Addr = hs[idx].Listener.Addr().String()
|
||||||
|
id := es[idx].id
|
||||||
|
e, h, err := buildServer(t, c, id)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("#%d.%d: %v", i, j, err)
|
||||||
|
}
|
||||||
|
es[idx] = e
|
||||||
|
hs[idx] = h
|
||||||
|
}
|
||||||
|
|
||||||
|
stop <- true
|
||||||
|
<-stop
|
||||||
|
|
||||||
|
destoryCluster(t, es, hs)
|
||||||
|
}
|
||||||
|
afterTest(t)
|
||||||
|
}
|
||||||
|
|
||||||
func BenchmarkEndToEndSet(b *testing.B) {
|
func BenchmarkEndToEndSet(b *testing.B) {
|
||||||
es, hs := buildCluster(3, false)
|
es, hs := buildCluster(3, false)
|
||||||
waitLeader(es)
|
waitLeader(es)
|
||||||
|
@ -251,6 +288,41 @@ func TestModeSwitch(t *testing.T) {
|
||||||
afterTest(t)
|
afterTest(t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Sending set commands
|
||||||
|
func keepSetting(urlStr string, stop chan bool) {
|
||||||
|
stopSet := false
|
||||||
|
i := 0
|
||||||
|
c := etcd.NewClient([]string{urlStr})
|
||||||
|
for {
|
||||||
|
key := fmt.Sprintf("%s_%v", "foo", i)
|
||||||
|
|
||||||
|
result, err := c.Set(key, "bar", 0)
|
||||||
|
|
||||||
|
if err != nil || result.Node.Key != "/"+key || result.Node.Value != "bar" {
|
||||||
|
select {
|
||||||
|
case <-stop:
|
||||||
|
stopSet = true
|
||||||
|
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-stop:
|
||||||
|
stopSet = true
|
||||||
|
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
|
||||||
|
if stopSet {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
stop <- true
|
||||||
|
}
|
||||||
|
|
||||||
type leadterm struct {
|
type leadterm struct {
|
||||||
lead int64
|
lead int64
|
||||||
term int64
|
term int64
|
||||||
|
|
|
@ -1,57 +0,0 @@
|
||||||
package test
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"math/rand"
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"github.com/coreos/etcd/third_party/github.com/coreos/go-etcd/etcd"
|
|
||||||
)
|
|
||||||
|
|
||||||
// Create a five nodes
|
|
||||||
// Randomly kill one of the node and keep on sending set command to the cluster
|
|
||||||
func TestMultiNodeKillOne(t *testing.T) {
|
|
||||||
procAttr := new(os.ProcAttr)
|
|
||||||
procAttr.Files = []*os.File{nil, os.Stdout, os.Stderr}
|
|
||||||
|
|
||||||
clusterSize := 5
|
|
||||||
argGroup, etcds, err := CreateCluster(clusterSize, procAttr, false)
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
t.Fatal("cannot create cluster")
|
|
||||||
}
|
|
||||||
|
|
||||||
defer DestroyCluster(etcds)
|
|
||||||
|
|
||||||
time.Sleep(2 * time.Second)
|
|
||||||
|
|
||||||
c := etcd.NewClient(nil)
|
|
||||||
|
|
||||||
c.SyncCluster()
|
|
||||||
|
|
||||||
stop := make(chan bool)
|
|
||||||
// Test Set
|
|
||||||
go Set(stop)
|
|
||||||
|
|
||||||
for i := 0; i < 10; i++ {
|
|
||||||
num := rand.Int() % clusterSize
|
|
||||||
fmt.Println("kill node", num+1)
|
|
||||||
|
|
||||||
// kill
|
|
||||||
etcds[num].Kill()
|
|
||||||
etcds[num].Release()
|
|
||||||
time.Sleep(time.Second)
|
|
||||||
|
|
||||||
// restart
|
|
||||||
etcds[num], err = os.StartProcess(EtcdBinPath, argGroup[num], procAttr)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
time.Sleep(time.Second)
|
|
||||||
}
|
|
||||||
fmt.Println("stop")
|
|
||||||
stop <- true
|
|
||||||
<-stop
|
|
||||||
}
|
|
|
@ -17,7 +17,6 @@ limitations under the License.
|
||||||
package wal
|
package wal
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -47,13 +46,9 @@ func readBlock(r io.Reader, b *block) error {
|
||||||
return unexpectedEOF(err)
|
return unexpectedEOF(err)
|
||||||
}
|
}
|
||||||
d := make([]byte, l)
|
d := make([]byte, l)
|
||||||
n, err := r.Read(d)
|
if _, err = io.ReadFull(r, d); err != nil {
|
||||||
if err != nil {
|
|
||||||
return unexpectedEOF(err)
|
return unexpectedEOF(err)
|
||||||
}
|
}
|
||||||
if n != int(l) {
|
|
||||||
return fmt.Errorf("len(data) = %d, want %d", n, l)
|
|
||||||
}
|
|
||||||
b.t = t
|
b.t = t
|
||||||
b.d = d
|
b.d = d
|
||||||
return nil
|
return nil
|
||||||
|
|
Loading…
Reference in New Issue