Manifest Manager Logic
The newManager function calls the run method - passing in the manager struct that includes the leasech channel - which invokes a perpetual for loop to await events on various channels.
The manifest manager instance is returned to the handleLease method in service.go.
func newManager(h *service, daddr dtypes.DeploymentID) *manager {
session := h.session.ForModule("manifest-manager")
...
go m.lc.WatchChannel(h.lc.ShuttingDown())
go m.run(h.managerch)
return m
}
The handleLease method in service.go continues and calls another handleLease method in manager.go passing in lease events received on the bus.
func (s *service) handleLease(ev event.LeaseWon, isNew bool) {
....
manager := s.ensureManager(ev.LeaseID.DeploymentID())
manager.handleLease(ev)
}
The handleLease method in manager.go puts the event onto the leasech channel.
func (m *manager) handleLease(ev event.LeaseWon) {
select {
case m.leasech <- ev:
case <-m.lc.ShuttingDown():
m.log.Error("not running: handle manifest", "lease", ev.LeaseID)
}
}
When the manifest manager run method receives an event on the leasech channel the maybeFetchData method is called and results is placed onto the runch channel.
func (m *manager) run(donech chan<- *manager) {
..
loop:
for {
....
select {
....
case ev := <-m.leasech:
m.log.Info("new lease", "lease", ev.LeaseID)
m.clearFetched()
m.maybeScheduleStop()
runch = m.maybeFetchData(ctx, runch)
The maybeFetchData method attempts to fetch deployment and lease data with associated downstream logic.
func (m *manager) maybeFetchData(ctx context.Context, runch <-chan runner.Result) <-chan runner.Result {
if runch != nil {
return runch
}
if !m.fetched || time.Since(m.fetchedAt) > m.config.CachedResultMaxAge {
m.clearFetched()
return m.fetchData(ctx)
}
return runch
}