func Now() int64 { if baseNano == 0 { baseNano = time.Now().UnixNano() baseTsc = rdtsc.Cputicks() time.Sleep(1e7) rn := time.Now().UnixNano() ct := rdtsc.Cputicks() scale = float64(rn-baseNano) / float64(ct-baseTsc) } return baseNano + int64(float64(rdtsc.Cputicks()-baseTsc)*scale) }
func (r *Replica) SendBeacon(peerId int32) { w := r.PeerWriters[peerId] w.WriteByte(genericsmrproto.GENERIC_SMR_BEACON) beacon := &genericsmrproto.Beacon{rdtsc.Cputicks()} beacon.Marshal(w) w.Flush() }
func (r *Replica) replicaListener(rid int, reader *bufio.Reader) { var msgType uint8 var err error = nil var gbeacon genericsmrproto.Beacon var gbeaconReply genericsmrproto.BeaconReply for err == nil && !r.Shutdown { if msgType, err = reader.ReadByte(); err != nil { break } switch uint8(msgType) { case genericsmrproto.GENERIC_SMR_BEACON: if err = gbeacon.Unmarshal(reader); err != nil { break } beacon := &Beacon{int32(rid), gbeacon.Timestamp} r.BeaconChan <- beacon break case genericsmrproto.GENERIC_SMR_BEACON_REPLY: if err = gbeaconReply.Unmarshal(reader); err != nil { break } //TODO: UPDATE STUFF r.Ewma[rid] = 0.99*r.Ewma[rid] + 0.01*float64(rdtsc.Cputicks()-gbeaconReply.Timestamp) log.Println(r.Ewma) break default: if rpair, present := r.rpcTable[msgType]; present { obj := rpair.Obj.New() if err = obj.Unmarshal(reader); err != nil { break } rpair.Chan <- obj } else { log.Println("Error: received unknown message type") } } } }