Example #1
0
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)
}
Example #2
0
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)
	}

}