route_guide_server.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright 2015 gRPC authors.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18 
19 #include <algorithm>
20 #include <chrono>
21 #include <cmath>
22 #include <iostream>
23 #include <memory>
24 #include <string>
25 
26 #include "helper.h"
27 
28 #include <grpc/grpc.h>
30 #include <grpcpp/server.h>
31 #include <grpcpp/server_builder.h>
32 #include <grpcpp/server_context.h>
33 #ifdef BAZEL_BUILD
34 #include "examples/protos/route_guide.grpc.pb.h"
35 #else
36 #include "route_guide.grpc.pb.h"
37 #endif
38 
39 using grpc::Server;
42 using grpc::ServerReader;
44 using grpc::ServerWriter;
45 using grpc::Status;
47 using routeguide::Point;
49 using routeguide::RouteGuide;
52 using std::chrono::system_clock;
53 
54 float ConvertToRadians(float num) { return num * 3.1415926 / 180; }
55 
56 // The formula is based on http://mathforum.org/library/drmath/view/51879.html
57 float GetDistance(const Point& start, const Point& end) {
58  const float kCoordFactor = 10000000.0;
59  float lat_1 = start.latitude() / kCoordFactor;
60  float lat_2 = end.latitude() / kCoordFactor;
61  float lon_1 = start.longitude() / kCoordFactor;
62  float lon_2 = end.longitude() / kCoordFactor;
63  float lat_rad_1 = ConvertToRadians(lat_1);
64  float lat_rad_2 = ConvertToRadians(lat_2);
65  float delta_lat_rad = ConvertToRadians(lat_2 - lat_1);
66  float delta_lon_rad = ConvertToRadians(lon_2 - lon_1);
67 
68  float a = pow(sin(delta_lat_rad / 2), 2) +
69  cos(lat_rad_1) * cos(lat_rad_2) * pow(sin(delta_lon_rad / 2), 2);
70  float c = 2 * atan2(sqrt(a), sqrt(1 - a));
71  int R = 6371000; // metres
72 
73  return R * c;
74 }
75 
77  const std::vector<Feature>& feature_list) {
78  for (const Feature& f : feature_list) {
79  if (f.location().latitude() == point.latitude() &&
80  f.location().longitude() == point.longitude()) {
81  return f.name();
82  }
83  }
84  return "";
85 }
86 
87 class RouteGuideImpl final : public RouteGuide::Service {
88  public:
89  explicit RouteGuideImpl(const std::string& db) {
91  }
92 
94  Feature* feature) override {
95  feature->set_name(GetFeatureName(*point, feature_list_));
96  feature->mutable_location()->CopyFrom(*point);
97  return Status::OK;
98  }
99 
101  const routeguide::Rectangle* rectangle,
102  ServerWriter<Feature>* writer) override {
103  auto lo = rectangle->lo();
104  auto hi = rectangle->hi();
105  long left = (std::min)(lo.longitude(), hi.longitude());
106  long right = (std::max)(lo.longitude(), hi.longitude());
107  long top = (std::max)(lo.latitude(), hi.latitude());
108  long bottom = (std::min)(lo.latitude(), hi.latitude());
109  for (const Feature& f : feature_list_) {
110  if (f.location().longitude() >= left &&
111  f.location().longitude() <= right &&
112  f.location().latitude() >= bottom && f.location().latitude() <= top) {
113  writer->Write(f);
114  }
115  }
116  return Status::OK;
117  }
118 
120  RouteSummary* summary) override {
121  Point point;
122  int point_count = 0;
123  int feature_count = 0;
124  float distance = 0.0;
125  Point previous;
126 
128  while (reader->Read(&point)) {
129  point_count++;
131  feature_count++;
132  }
133  if (point_count != 1) {
134  distance += GetDistance(previous, point);
135  }
136  previous = point;
137  }
139  summary->set_point_count(point_count);
140  summary->set_feature_count(feature_count);
141  summary->set_distance(static_cast<long>(distance));
142  auto secs =
143  std::chrono::duration_cast<std::chrono::seconds>(end_time - start_time);
144  summary->set_elapsed_time(secs.count());
145 
146  return Status::OK;
147  }
148 
151  RouteNote note;
152  while (stream->Read(&note)) {
153  std::unique_lock<std::mutex> lock(mu_);
154  for (const RouteNote& n : received_notes_) {
155  if (n.location().latitude() == note.location().latitude() &&
156  n.location().longitude() == note.location().longitude()) {
157  stream->Write(n);
158  }
159  }
160  received_notes_.push_back(note);
161  }
162 
163  return Status::OK;
164  }
165 
166  private:
167  std::vector<Feature> feature_list_;
169  std::vector<RouteNote> received_notes_;
170 };
171 
172 void RunServer(const std::string& db_path) {
173  std::string server_address("0.0.0.0:50051");
174  RouteGuideImpl service(db_path);
175 
178  builder.RegisterService(&service);
179  std::unique_ptr<Server> server(builder.BuildAndStart());
180  std::cout << "Server listening on " << server_address << std::endl;
181  server->Wait();
182 }
183 
184 int main(int argc, char** argv) {
185  // Expect only arg: --db_path=path/to/route_guide_db.json.
186  std::string db = routeguide::GetDbFileContent(argc, argv);
187  RunServer(db);
188 
189  return 0;
190 }
grpc::ServerWriter
Definition: include/grpcpp/impl/codegen/completion_queue.h:60
now
static double now(void)
Definition: test/core/fling/client.cc:130
grpc::ServerContext
Definition: grpcpp/impl/codegen/server_context.h:566
RouteGuideImpl::RouteGuideImpl
RouteGuideImpl(const std::string &db)
Definition: route_guide_server.cc:89
mutex
static uv_mutex_t mutex
Definition: threadpool.c:34
absl::time_internal::cctz::time_point
std::chrono::time_point< std::chrono::system_clock, D > time_point
Definition: abseil-cpp/absl/time/internal/cctz/include/cctz/time_zone.h:39
generate_changelog.previous
previous
Definition: bloaty/third_party/protobuf/generate_changelog.py:55
RouteGuideImpl::mu_
std::mutex mu_
Definition: route_guide_server.cc:168
RouteGuideImpl::ListFeatures
Status ListFeatures(ServerContext *context, const routeguide::Rectangle *rectangle, ServerWriter< Feature > *writer) override
Definition: route_guide_server.cc:100
testing::internal::string
::std::string string
Definition: bloaty/third_party/protobuf/third_party/googletest/googletest/include/gtest/internal/gtest-port.h:881
end_time
static int64_t end_time
Definition: benchmark-getaddrinfo.c:38
RouteGuideImpl::GetFeature
Status GetFeature(ServerContext *context, const Point *point, Feature *feature) override
Definition: route_guide_server.cc:93
framework.rpc.grpc_channelz.Server
Server
Definition: grpc_channelz.py:42
RouteGuideImpl::RecordRoute
Status RecordRoute(ServerContext *context, ServerReader< Point > *reader, RouteSummary *summary) override
Definition: route_guide_server.cc:119
OK
@ OK
Definition: cronet_status.h:43
grpc::ServerReaderWriter
Definition: grpcpp/impl/codegen/sync_stream.h:786
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
main
int main(int argc, char **argv)
Definition: route_guide_server.cc:184
start_time
static int64_t start_time
Definition: benchmark-getaddrinfo.c:37
GetFeatureName
std::string GetFeatureName(const Point &point, const std::vector< Feature > &feature_list)
Definition: route_guide_server.cc:76
RouteGuideImpl::received_notes_
std::vector< RouteNote > received_notes_
Definition: route_guide_server.cc:169
server_address
std::string server_address("0.0.0.0:10000")
routeguide::GetDbFileContent
std::string GetDbFileContent(int argc, char **argv)
Definition: helper.cc:34
RouteGuideImpl::mu_
absl::Mutex mu_
Definition: route_guide_callback_server.cc:254
routeguide::ParseDb
void ParseDb(const std::string &db, std::vector< Feature > *feature_list)
Definition: helper.cc:143
route_guide_pb2.RouteSummary
RouteSummary
Definition: multiplex/route_guide_pb2.py:270
route_guide_pb2.Point
Point
Definition: multiplex/route_guide_pb2.py:242
server
std::unique_ptr< Server > server
Definition: channelz_service_test.cc:330
start
static uint64_t start
Definition: benchmark-pound.c:74
c
void c(T a)
Definition: miscompile_with_no_unique_address_test.cc:40
profile_analyzer.builder
builder
Definition: profile_analyzer.py:159
autogen_x86imm.f
f
Definition: autogen_x86imm.py:9
RouteGuideImpl::feature_list_
std::vector< Feature > feature_list_
Definition: route_guide_callback_server.cc:253
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
ConvertToRadians
float ConvertToRadians(float num)
Definition: route_guide_server.cc:54
max
int max
Definition: bloaty/third_party/zlib/examples/enough.c:170
grpc::ServerBuilder
A builder class for the creation and startup of grpc::Server instances.
Definition: grpcpp/server_builder.h:86
tests._result.summary
def summary(result)
Definition: _result.py:346
RouteGuideImpl
Definition: route_guide_callback_server.cc:85
grpc.h
RunServer
void RunServer(const std::string &db_path)
Definition: route_guide_server.cc:172
min
#define min(a, b)
Definition: qsort.h:83
n
int n
Definition: abseil-cpp/absl/container/btree_test.cc:1080
server_credentials.h
google_benchmark.example.empty
def empty(state)
Definition: example.py:31
writer
void writer(void *n)
Definition: libuv/docs/code/locks/main.c:22
point
Definition: bloaty/third_party/zlib/examples/zran.c:67
server
Definition: examples/python/async_streaming/server.py:1
bm_diff.note
note
Definition: bm_diff.py:274
route_guide_pb2.Rectangle
Rectangle
Definition: multiplex/route_guide_pb2.py:249
helper.h
server_context.h
grpc::protobuf::util::Status
GRPC_CUSTOM_UTIL_STATUS Status
Definition: include/grpcpp/impl/codegen/config_protobuf.h:93
xds_manager.num
num
Definition: xds_manager.py:56
grpc::ServerReader
Definition: include/grpcpp/impl/codegen/completion_queue.h:58
GetDistance
float GetDistance(const Point &start, const Point &end)
Definition: route_guide_server.cc:57
grpc::Status
Definition: include/grpcpp/impl/codegen/status.h:35
RouteGuideImpl::RouteChat
Status RouteChat(ServerContext *context, ServerReaderWriter< RouteNote, RouteNote > *stream) override
Definition: route_guide_server.cc:149
grpc::InsecureServerCredentials
std::shared_ptr< ServerCredentials > InsecureServerCredentials()
Definition: insecure_server_credentials.cc:52
context
grpc::ClientContext context
Definition: istio_echo_server_lib.cc:61
server.h
service
__attribute__((deprecated("Please use GRPCProtoMethod."))) @interface ProtoMethod NSString * service
Definition: ProtoMethod.h:25
top
static upb_pb_encoder_segment * top(upb_pb_encoder *e)
Definition: bloaty/third_party/protobuf/php/ext/google/protobuf/upb.c:7624
server_builder.h
reader
void reader(void *n)
Definition: libuv/docs/code/locks/main.c:8
route_guide_pb2.Feature
Feature
Definition: multiplex/route_guide_pb2.py:256
route_guide_pb2.RouteNote
RouteNote
Definition: multiplex/route_guide_pb2.py:263
stream
voidpf stream
Definition: bloaty/third_party/zlib/contrib/minizip/ioapi.h:136


grpc
Author(s):
autogenerated on Thu Mar 13 2025 03:01:12