func (m *systemdUnitManager) GetUnitStates(filter pkg.Set) (map[string]*unit.UnitState, error) { // Unfortunately we need to lock for the entire operation to ensure we // have a consistent view of the hashes. Otherwise, Load/Unload // operations could mutate the hashes before we've retrieved the state // for every unit in the filter, since they won't necessarily all be // present in the initial ListUnits() call. fallback := false m.mutex.Lock() defer m.mutex.Unlock() dbusStatuses, err := m.systemd.ListUnitsByNames(filter.Values()) if err != nil { fallback = true log.Debugf("ListUnitsByNames is not implemented in your systemd version (requires at least systemd 230), fallback to ListUnits: %v", err) dbusStatuses, err = m.systemd.ListUnits() if err != nil { return nil, err } } states := make(map[string]*unit.UnitState) for _, dus := range dbusStatuses { if fallback && !filter.Contains(dus.Name) { // If filter could not be applied on DBus side, we will filter unit files here continue } us := &unit.UnitState{ LoadState: dus.LoadState, ActiveState: dus.ActiveState, SubState: dus.SubState, } if h, ok := m.hashes[dus.Name]; ok { us.UnitHash = h.String() } states[dus.Name] = us } // grab data on subscribed units that didn't show up in ListUnits in fallback mode, most // likely due to being inactive if fallback { for _, name := range filter.Values() { if _, ok := states[name]; ok { continue } us, err := m.getUnitState(name) if err != nil { return nil, err } if h, ok := m.hashes[name]; ok { us.UnitHash = h.String() } states[name] = us } } return states, nil }
func (m *systemdUnitManager) GetUnitStates(filter pkg.Set) (map[string]*unit.UnitState, error) { // Unfortunately we need to lock for the entire operation to ensure we // have a consistent view of the hashes. Otherwise, Load/Unload // operations could mutate the hashes before we've retrieved the state // for every unit in the filter, since they won't necessarily all be // present in the initial ListUnits() call. m.mutex.Lock() defer m.mutex.Unlock() dbusStatuses, err := m.systemd.ListUnits() if err != nil { return nil, err } states := make(map[string]*unit.UnitState) for _, dus := range dbusStatuses { if !filter.Contains(dus.Name) { continue } us := &unit.UnitState{ LoadState: dus.LoadState, ActiveState: dus.ActiveState, SubState: dus.SubState, } if h, ok := m.hashes[dus.Name]; ok { us.UnitHash = h.String() } states[dus.Name] = us } // grab data on subscribed units that didn't show up in ListUnits, most // likely due to being inactive for _, name := range filter.Values() { if _, ok := states[name]; ok { continue } us, err := m.getUnitState(name) if err != nil { return nil, err } if h, ok := m.hashes[name]; ok { us.UnitHash = h.String() } states[name] = us } return states, nil }
func (ar *AgentReconciler) calculateTasksForOffer(dState *agentState, ms *machine.MachineState, j *job.Job, bids pkg.Set, taskchan chan *task) { if bids.Contains(ms.ID) { log.V(1).Infof("Bid already submitted for unresolved JobOffer(%s)", j.Name) return } if able, reason := ar.ableToRun(dState, ms, j); !able { log.V(1).Infof("Not bidding on Job(%s): %s", j.Name, reason) return } taskchan <- &task{ Type: taskTypeSubmitBid, Job: j, Reason: taskReasonAbleToResolveOffer, } }