bistro/scheduler/SchedulerPolicy.h (38 lines of code) (raw):
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
#pragma once
#include <memory>
#include <vector>
#include <unordered_map>
#include "bistro/bistro/config/Job.h"
#include "bistro/bistro/config/Node.h"
#include "bistro/bistro/scheduler/ResourceVector.h"
#include "bistro/bistro/runners/TaskRunner.h"
namespace facebook { namespace bistro {
class Config;
// Available resource amounts for each node in this NodeGroup, concatenated
// together. Offsets 0 through (#resources in node group - 1) are the first
// node, etc. A given node's resources can be found via Node::offset.
using PackedResources = std::vector<int>;
// The NodeGroup ID was formerly known as `level`.
using NodeGroupToPackedResources = std::unordered_map<int, PackedResources>;
class JobWithNodes {
public:
// Precompute job & node packed resources once, subtract many times.
struct NodeGroupResources {
explicit NodeGroupResources(PackedResources* nodes) : nodes_(nodes) {}
// This job's requirements in this NodeGroup. Has just one entry for
// each resource.
PackedResources job_;
// Stores a pointer into the scheduler's NodeGroupToPackedResources.
// This saves us a hash-map lookup in the inner loop.
PackedResources* nodes_; // Non-const since try_to_schedule modifies it.
};
/**
* WARNING: Stores pointers into the NodeGroupToPackedResources.
* Therefore, that structure must outlive all JobWithNodes.
*/
JobWithNodes(const Config&, JobPtr, NodeGroupToPackedResources*);
/**
* This constructor is unused in mainline Bistro. A service, which uses Bistro
* as a library (db_migrations) relies on it to populate
* `nodeGroupToResources_` in a custom way.
*/
JobWithNodes(JobPtr, std::unordered_map<int, NodeGroupResources>);
JobWithNodes(JobWithNodes&&) = default;
JobWithNodes& operator=(JobWithNodes&&) = default;
JobWithNodes(const JobWithNodes&) = delete;
JobWithNodes& operator=(const JobWithNodes&) = delete;
inline const JobPtr& job() const { return job_; }
inline const std::unordered_map<int, NodeGroupResources>&
nodeGroupResources() const { return nodeGroupToResources_; }
// Exposed because the policies are expected to mutate this list as they go.
std::vector<const Node*> nodes;
private:
JobPtr job_;
std::unordered_map<int, NodeGroupResources> nodeGroupToResources_;
};
struct SchedulerPolicy {
virtual ~SchedulerPolicy();
virtual int schedule(std::vector<JobWithNodes>&, TaskRunnerCallback) = 0;
};
}} // namespace facebook::bistro