16 #include "tensorflow_serving/core/availability_preserving_policy.h"
21 #include "absl/types/optional.h"
22 #include "tensorflow_serving/core/loader_harness.h"
24 namespace tensorflow {
30 absl::optional<ServableId> GetLowestServableId(
31 const std::vector<AspiredServableStateSnapshot>& all_versions) {
32 const auto& iterator =
33 std::min_element(all_versions.begin(), all_versions.end(),
34 [](
const AspiredServableStateSnapshot& a,
35 const AspiredServableStateSnapshot& b) {
36 return a.id.version < b.id.version;
38 if (iterator == all_versions.end()) {
47 absl::optional<AspiredVersionPolicy::ServableAction>
49 const std::vector<AspiredServableStateSnapshot>& all_versions)
const {
51 bool has_aspired =
false;
52 bool has_aspired_serving =
false;
53 std::vector<AspiredServableStateSnapshot> unaspired_serving_versions;
54 for (
const auto& version : all_versions) {
55 if (version.is_aspired) {
58 has_aspired_serving =
true;
61 unaspired_serving_versions.push_back(version);
68 if (!has_aspired || has_aspired_serving ||
69 unaspired_serving_versions.size() > 1) {
70 absl::optional<ServableId> version_to_unload =
71 GetLowestServableId(unaspired_serving_versions);
72 if (version_to_unload) {
79 absl::optional<ServableId> highest_new_aspired_version_id =
81 if (highest_new_aspired_version_id) {
82 VLOG(1) <<
"AvailabilityPreservingPolicy requesting to load servable "
83 << highest_new_aspired_version_id.value();
84 return {{
Action::kLoad, highest_new_aspired_version_id.value()}};
@ kUnload
Call unload on the servable.
@ kLoad
Call load on the servable.
static absl::optional< ServableId > GetHighestAspiredNewServableId(const std::vector< AspiredServableStateSnapshot > &all_versions)
absl::optional< ServableAction > GetNextAction(const std::vector< AspiredServableStateSnapshot > &all_versions) const override
@ kReady
'loader_->Load()' has succeeded.