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
}