func (ls *Stores) updateBootstrapInfo(bi *gossip.BootstrapInfo) error { if bi.Timestamp.Less(ls.biLatestTS) { return nil } ctx := ls.AnnotateCtx(context.TODO()) // Update the latest timestamp and set cached version. ls.biLatestTS = bi.Timestamp ls.latestBI = protoutil.Clone(bi).(*gossip.BootstrapInfo) // Update all stores. for _, s := range ls.storeMap { if err := engine.MVCCPutProto(ctx, s.engine, nil, keys.StoreGossipKey(), hlc.ZeroTimestamp, nil, bi); err != nil { return err } } return nil }
// ReadBootstrapInfo implements the gossip.Storage interface. Read // attempts to read gossip bootstrap info from every known store and // finds the most recent from all stores to initialize the bootstrap // info argument. Returns an error on any issues reading data for the // stores (but excluding the case in which no data has been persisted // yet). func (ls *Stores) ReadBootstrapInfo(bi *gossip.BootstrapInfo) error { ls.mu.RLock() defer ls.mu.RUnlock() latestTS := hlc.ZeroTimestamp ctx := ls.AnnotateCtx(context.TODO()) // Find the most recent bootstrap info. for _, s := range ls.storeMap { var storeBI gossip.BootstrapInfo ok, err := engine.MVCCGetProto(ctx, s.engine, keys.StoreGossipKey(), hlc.ZeroTimestamp, true, nil, &storeBI) if err != nil { return err } if ok && latestTS.Less(storeBI.Timestamp) { latestTS = storeBI.Timestamp *bi = storeBI } } log.Infof(ctx, "read %d node addresses from persistent storage", len(bi.Addresses)) return ls.updateBootstrapInfo(bi) }