Status ServerCore::ReloadConfig()

in tensorflow_serving/model_servers/server_core.cc [431:496]


Status ServerCore::ReloadConfig(const ModelServerConfig& new_config) {
  mutex_lock l(config_mu_);

  // Determine whether to accept this config transition.
  const bool is_first_config =
      config_.config_case() == ModelServerConfig::CONFIG_NOT_SET;
  const bool accept_transition =
      is_first_config ||
      (config_.config_case() == ModelServerConfig::kModelConfigList &&
       new_config.config_case() == ModelServerConfig::kModelConfigList);
  if (!accept_transition) {
    return errors::FailedPrecondition(
        "Cannot transition to requested config. It is only legal to transition "
        "from one ModelConfigList to another.");
  }
  if (new_config.config_case() == ModelServerConfig::CONFIG_NOT_SET) {
    // Nothing to load. In this case we allow a future call with a non-empty
    // config.
    LOG(INFO) << "Taking no action for empty config.";
    return Status::OK();
  }
  if (new_config.config_case() == ModelServerConfig::kModelConfigList) {
    TF_RETURN_IF_ERROR(
        ValidateModelConfigList(new_config.model_config_list(), options_));
  }
  if (new_config.config_case() == ModelServerConfig::kModelConfigList &&
      config_.config_case() == ModelServerConfig::kModelConfigList) {
    TF_RETURN_IF_ERROR(ValidateNoModelsChangePlatforms(
        config_.model_config_list(), new_config.model_config_list()));
  }
  config_ = new_config;

  TF_RETURN_IF_ERROR(UpdateModelVersionLabelMap());

  LOG(INFO) << "Adding/updating models.";
  switch (config_.config_case()) {
    case ModelServerConfig::kModelConfigList: {
      if (options_.model_config_list_root_dir) {
        TF_RETURN_IF_ERROR(UpdateModelConfigListRelativePaths(
            *options_.model_config_list_root_dir,
            config_.mutable_model_config_list()));
      }
      TF_RETURN_IF_ERROR(AddModelsViaModelConfigList());
      break;
    }
    case ModelServerConfig::kCustomModelConfig: {
      // We've already verified this invariant above, so this check should
      // always pass.
      CHECK(is_first_config);  // Crash ok.
      TF_RETURN_IF_ERROR(AddModelsViaCustomModelConfig());
      break;
    }
    default:
      return errors::InvalidArgument("Invalid ServerModelConfig");
  }
  LOG(INFO) << "Finished adding/updating models";

  TF_RETURN_IF_ERROR(MaybeUpdateServerRequestLogger(config_.config_case()));

  if (options_.flush_filesystem_caches) {
    return Env::Default()->FlushFileSystemCaches();
  }

  LOG(INFO) << "Finished reloading config";
  return Status::OK();
}