func restoreData(SM *sm.State_Machine, myConf *Config) { //restore persistant state last := myConf.St.GetLastIndex() if last != -1 { state, err := myConf.St.Get(last) if err != nil { panic(err) } data := state.(sm.Persi_State) SM.Persi_State = data } //restore log last = myConf.Lg.GetLastIndex() if last != -1 { for i := int64(0); i <= last; i++ { log, err := myConf.St.Get(i) if err != nil { panic(err) } logg := log.(sm.MyLogg) SM.Logg.Logg[i] = logg } } SM.LoggInd = int32(last) }
func initNode(Id int, myConf *Config, SM *sm.State_Machine) { //Register a struct name by giving it a dummy object of that name. gob.Register(sm.AppEntrReq{}) gob.Register(sm.AppEntrResp{}) gob.Register(sm.VoteReq{}) gob.Register(sm.VoteResp{}) gob.Register(sm.StateStore{}) gob.Register(sm.LoggStore{}) gob.Register(sm.CommitInfo{}) gob.Register(sm.MyLogg{}) gob.Register(sm.Commit{}) gob.Register(sm.Append{}) gob.Register(sm.Persi_State{}) //Channel initialization. SM.CommMedium.ClientCh = make(chan interface{}, 10000) SM.CommMedium.NetCh = make(chan interface{}, 10000) SM.CommMedium.TimeoutCh = make(chan interface{}, 10000) SM.CommMedium.ActionCh = make(chan interface{}, 10000) SM.CommMedium.ShutdownCh = make(chan interface{}, 10000) SM.CommMedium.CommitInfoCh = make(chan interface{}, 10000) SM.CommMedium.CommitCh = make(chan interface{}, 10000) //Seed randon number generator. rand.Seed(time.Now().UTC().UnixNano() * int64(Id)) //Initialize the timer object for timeuts. myConf.DoTO = time.AfterFunc(10, func() {}) //Store persitant state myConf.DoStore = time.NewTicker(3 * time.Second) go func() { for _ = range myConf.DoStore.C { last := myConf.St.GetLastIndex() if last == -1 { err := myConf.St.Append(SM.Persi_State) if err != nil { panic(err) } err = myConf.St.Append(SM.Persi_State) if err != nil { panic(err) } } last = myConf.St.GetLastIndex() myConf.St.TruncateToEnd(last) err := myConf.St.Append(SM.Persi_State) if err != nil { panic(err) } last = myConf.St.GetLastIndex() state, err := myConf.St.Get(last) if err != nil { panic(err) } data := state.(sm.Persi_State) SM.Persi_State = data } }() //Initialize the Log and Node configuration. logConfig(Id, myConf) var err error myConf.Lg, err = log.Open(myConf.LogDir) if err != nil { panic(err) } myConf.St, err = log.Open(myConf.StDir) if err != nil { panic(err) } }