// newExecutor creates an Executor and registers a callback on the // system config. func newExecutor(db client.DB, gossip *gossip.Gossip, clock *hlc.Clock) *Executor { exec := &Executor{ db: db, reCache: parser.NewRegexpCache(512), } gossip.RegisterSystemConfigCallback(exec.updateSystemConfig) return exec }
// newExecutor creates an Executor and registers a callback on the // system config. func newExecutor(db client.DB, gossip *gossip.Gossip, leaseMgr *LeaseManager) *Executor { exec := &Executor{ db: db, reCache: parser.NewRegexpCache(512), leaseMgr: leaseMgr, } exec.systemConfigCond = sync.NewCond(&exec.systemConfigMu) gossip.RegisterSystemConfigCallback(exec.updateSystemConfig) return exec }
// RefreshLeases starts a goroutine that refreshes the lease manager // leases for tables received in the latest system configuration via gossip. func (m *LeaseManager) RefreshLeases(s *stop.Stopper, db *client.DB, gossip *gossip.Gossip) { s.RunWorker(func() { descKeyPrefix := keys.MakeTablePrefix(uint32(DescriptorTable.ID)) gossip.RegisterSystemConfigCallback(m.updateSystemConfig) for { select { case <-m.newConfig: // Read all tables and their versions cfg := m.getSystemConfig() if log.V(2) { log.Info("received a new config %v", cfg) } // Loop through the configuration to find all the tables. for _, kv := range cfg.Values { if kv.Value.Tag != roachpb.ValueType_BYTES { continue } if !bytes.HasPrefix(kv.Key, descKeyPrefix) { continue } // Attempt to unmarshal config into a table/database descriptor. var descriptor Descriptor if err := kv.Value.GetProto(&descriptor); err != nil { log.Warningf("unable to unmarshal descriptor %v", kv.Value) continue } switch union := descriptor.Union.(type) { case *Descriptor_Table: table := union.Table if err := table.Validate(); err != nil { log.Errorf("received invalid table descriptor: %v", table) continue } if log.V(2) { log.Infof("refreshing lease table: %d, version: %d", table.ID, table.Version) } // Try to refresh the table lease to one >= this version. if err := m.refreshLease(db, table.ID, table.Version); err != nil { log.Warning(err) } case *Descriptor_Database: // Ignore. } } case <-s.ShouldStop(): return } } }) }
// NewExecutor creates an Executor and registers a callback on the // system config. func NewExecutor(db client.DB, gossip *gossip.Gossip) *Executor { exec := &Executor{db: db} gossip.RegisterSystemConfigCallback(exec.updateSystemConfig) return exec }