// When node call this on framework, it simply set epoch to exitEpoch, // All nodes will be notified of the epoch change and exit themselves. func (f *framework) ShutdownJob() { if err := etcdutil.CASEpoch(f.etcdClient, f.name, f.epoch, exitEpoch); err != nil { panic("TODO: we should do a set instead of CAS here.") } if err := etcdutil.SetJobStatus(f.etcdClient, f.name, 0); err != nil { panic("SetJobStatus") } }
// When app code invoke this method on framework, we simply // update the etcd epoch to next uint64. All nodes should watch // for epoch and update their local epoch correspondingly. func (f *framework) IncEpoch(ctx context.Context) { epoch, ok := ctx.Value(epochKey).(uint64) if !ok { f.log.Fatalf("Can not find epochKey in IncEpoch") } err := etcdutil.CASEpoch(f.etcdClient, f.name, epoch, epoch+1) if err != nil { f.log.Fatalf("task %d Epoch CompareAndSwap(%d, %d) failed: %v", f.taskID, epoch+1, epoch, err) } }