| // Copyright 2021 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef FEDERATED_SCHEDULER_H_ |
| #define FEDERATED_SCHEDULER_H_ |
| |
| #include <memory> |
| #include <string> |
| #include <unordered_set> |
| |
| #include <base/sequenced_task_runner.h> |
| #include <base/memory/scoped_refptr.h> |
| #include <base/time/time.h> |
| |
| #include "federated/device_status_monitor.h" |
| |
| namespace federated { |
| class StorageManager; |
| |
| class Scheduler { |
| public: |
| Scheduler(StorageManager* storage_manager, dbus::Bus* bus); |
| Scheduler(const Scheduler&) = delete; |
| Scheduler& operator=(const Scheduler&) = delete; |
| ~Scheduler(); |
| |
| // For each client, posts a delayed task with default retry window. |
| void Schedule(); |
| |
| private: |
| // Posts the TryToStartJobForClient task for client with delay. |
| void PostDelayedTask(const std::string& client_name, |
| const base::TimeDelta& delay); |
| |
| // Tries to check-in the server and starts a federated task if training |
| // conditions are satisfied, uses the retry-window from the server as the next |
| // delay and posts the next delayed try task. Otherwise posts the next delayed |
| // try task with the default retry window. |
| void TryToStartJobForClient(const std::string& client_name); |
| |
| // Obtained from daemon.cc, should not delete it. |
| StorageManager* storage_manager_; |
| |
| // Device status monitor that answers whether training conditions are |
| // satisfied. |
| DeviceStatusMonitor device_status_monitor_; |
| |
| // Registered clients. |
| // TODO(alanlxl): need to be a map from client to its config. |
| std::unordered_set<std::string> registered_clients_; |
| |
| scoped_refptr<base::SequencedTaskRunner> task_runner_; |
| }; |
| } // namespace federated |
| |
| #endif // FEDERATED_SCHEDULER_H_ |