func waitReplies(readers []*bufio.Reader, leader int, n int, done chan bool) { e := false reply := new(genericsmrproto.ProposeReplyTS) for i := 0; i < n; i++ { if err := reply.Unmarshal(readers[leader]); err != nil { fmt.Println("Error when reading:", err) e = true continue } //fmt.Println(reply.Value) if *check { if rsp[reply.CommandId] { fmt.Println("Duplicate reply", reply.CommandId) } rsp[reply.CommandId] = true } if reply.OK != 0 { successful[leader]++ if reply.Value == 1000772 { //hack: special value means read was local local[leader]++ } } } done <- e }
func waitReplies(readers []*bufio.Reader, leader int, n int, done chan bool, readings chan int64) { e := false tss := make([]int64, n) reply := new(genericsmrproto.ProposeReplyTS) for i := 0; i < n; i++ { /*if *noLeader { leader = rarray[i] }*/ if err := reply.Unmarshal(readers[leader]); err != nil { fmt.Println("Error when reading:", err) e = true continue } tss[i] = time.Now().UnixNano() - reply.Timestamp if *check { if rsp[reply.Instance] { fmt.Println("Duplicate reply", reply.Instance) } rsp[reply.Instance] = true } if reply.OK != 0 { successful[leader]++ } } done <- e for i := 0; i < n; i++ { readings <- tss[i] } }
func waitReplies(readers []*bufio.Reader, leader int, n int, done chan bool) { e := false reply := new(genericsmrproto.ProposeReplyTS) for i := 0; i < n; i++ { /*if *noLeader { leader = rarray[i] }*/ if err := reply.Unmarshal(readers[leader]); err != nil { fmt.Println("Error when reading:", err) e = true //continue break } if *check { if rsp[reply.CommandId] { fmt.Println("Duplicate reply", reply.CommandId) } rsp[reply.CommandId] = true } if reply.OK != 0 { successful[leader]++ succLock.Lock() succ++ succLock.Unlock() } } done <- e }
func (r *Replica) ReplyProposeTS(reply *genericsmrproto.ProposeReplyTS, w *bufio.Writer) { //r.clientMutex.Lock() //defer r.clientMutex.Unlock() //w.WriteByte(genericsmrproto.PROPOSE_REPLY) reply.Marshal(w) w.Flush() }
func (r *Replica) ReplyProposeTS(reply *genericsmrproto.ProposeReplyTS, propose *Propose) { if propose.Writer == nil || propose.Lock == nil { return } propose.Lock.Lock() defer propose.Lock.Unlock() //w.WriteByte(genericsmrproto.PROPOSE_REPLY) reply.Marshal(propose.Writer) propose.Writer.Flush() }
func simulatedClient(rlReply *masterproto.GetReplicaListReply, leaderId int, readsChan chan float64, writesChan chan float64, done chan bool, idx int) { N := len(rlReply.ReplicaList) servers := make([]net.Conn, N) readers := make([]*bufio.Reader, N) writers := make([]*bufio.Writer, N) rarray := make([]int, *reqsNb) iarray := make([]int, *reqsNb) put := make([]bool, *reqsNb) perReplicaCount := make([]int, N) M := N if *barOne { M = N - 1 } randObj := rand.New(rand.NewSource(int64(42 + idx))) zipf := ycsbzipf.NewZipf(int(*D), randObj) for i := 0; i < len(rarray); i++ { r := rand.Intn(M) rarray[i] = r perReplicaCount[r]++ if *conflicts >= 0 { r = rand.Intn(100) if r < *conflicts { iarray[i] = 0 } else { iarray[i] = i } } else { iarray[i] = int(zipf.NextInt64()) } //r = rand.Intn(100) r = randObj.Intn(100) if r < *writes { put[i] = true } else { put[i] = false } } for i := 0; i < N; i++ { var err error servers[i], err = net.Dial("tcp", rlReply.ReplicaList[i]) if err != nil { log.Printf("Error connecting to replica %d\n", i) } readers[i] = bufio.NewReader(servers[i]) writers[i] = bufio.NewWriter(servers[i]) } var id int32 = 0 args := genericsmrproto.Propose{id, state.Command{state.PUT, 0, 0}, 0} var reply genericsmrproto.ProposeReplyTS n := *reqsNb successful := 0 for i := 0; i < n; i++ { leader := leaderId if *noLeader { leader = rarray[i] } args.CommandId = id if put[i] { args.Command.Op = state.PUT } else { args.Command.Op = state.GET if *readFrom > 0 { leader = *readFrom } } args.Command.K = state.Key(karray[iarray[i]]) writers[leader].WriteByte(genericsmrproto.PROPOSE) before := time.Now() //log.Println(i, karray[i], iarray[i], karray[iarray[i]]) args.Marshal(writers[leader]) writers[leader].Flush() if err := reply.Unmarshal(readers[leader]); err != nil { fmt.Println("Error when reading:", err) continue } if reply.OK != 0 { successful++ } after := time.Now() id++ if put[i] { writesChan <- (after.Sub(before)).Seconds() * 1000 } else { readsChan <- (after.Sub(before)).Seconds() * 1000 } if *sleep > 0 { time.Sleep(100 * 1000 * 1000) } } for _, client := range servers { if client != nil { client.Close() } } log.Println("Successful:", successful) done <- true }