16 #ifndef TENSORFLOW_SERVING_CORE_DYNAMIC_SOURCE_ROUTER_H_
17 #define TENSORFLOW_SERVING_CORE_DYNAMIC_SOURCE_ROUTER_H_
23 #include "tensorflow/core/platform/macros.h"
24 #include "tensorflow_serving/core/source_router.h"
26 namespace tensorflow {
37 using Routes = std::map<string, int>;
41 static Status Create(
int num_output_ports,
const Routes& routes,
46 Routes GetRoutes()
const;
49 Status UpdateRoutes(
const Routes& routes);
52 int num_output_ports()
const override {
return num_output_ports_; }
54 int Route(
const StringPiece servable_name,
61 static Status ValidateRoutes(
int num_output_ports,
const Routes& routes);
63 const int num_output_ports_;
65 mutable mutex routes_mu_;
66 Routes routes_ TF_GUARDED_BY(routes_mu_);
76 int num_output_ports,
const Routes& routes,
78 TF_RETURN_IF_ERROR(ValidateRoutes(num_output_ports, routes));
84 DynamicSourceRouter<T>::~DynamicSourceRouter() {
85 TargetBase<T>::Detach();
89 typename DynamicSourceRouter<T>::Routes DynamicSourceRouter<T>::GetRoutes()
91 mutex_lock l(routes_mu_);
96 Status DynamicSourceRouter<T>::UpdateRoutes(
const Routes& routes) {
97 TF_RETURN_IF_ERROR(ValidateRoutes(num_output_ports_, routes));
99 mutex_lock l(routes_mu_);
105 template <
typename T>
106 int DynamicSourceRouter<T>::Route(
107 const StringPiece servable_name,
108 const std::vector<ServableData<T>>& versions) {
109 mutex_lock l(routes_mu_);
110 auto it = routes_.find(
string(servable_name));
111 if (it == routes_.end()) {
112 LOG(INFO) <<
"Routing servable(s) from stream " << servable_name
113 <<
" to default output port " << num_output_ports_ - 1;
114 return num_output_ports_ - 1;
120 template <
typename T>
121 DynamicSourceRouter<T>::DynamicSourceRouter(
int num_output_ports,
122 const Routes& routes)
123 : num_output_ports_(num_output_ports), routes_(routes) {}
125 template <
typename T>
126 Status DynamicSourceRouter<T>::ValidateRoutes(
int num_output_ports,
127 const Routes& routes) {
128 for (
const auto& entry : routes) {
129 const int port = entry.second;
130 if (port < 0 || port >= num_output_ports) {
131 return errors::InvalidArgument(
132 strings::StrCat(
"Port number out of range: ", port));
134 if (port == num_output_ports - 1) {
135 return errors::InvalidArgument(
136 "Last port cannot be used in route map, since it's reserved for the "